上次写了用python爬取安居客二手小区数据,这次应粉丝要求写一篇爬取贝壳网二手小区数据的教程,由于贝壳网的反爬策略比安居客的更为复杂,所以这次就大胆一试!!!
这次教程内容大部分都是由Ai帮我写的,所以大概不太详细!! 欢迎私信大概评论区提问~~
先来看看网页,在这里找到小区,并选择具体的市县地域:
然后我们F12打开网络看看数据在那里
我们在这个文档里面找到了对应的小区数据,言外之意只需要请求这个url即可得到想要的数据啦~
同时,在这些信息里面还有一个小区详情页的链接,里面有诸如小区的容积率、绿化率、开辟商等等信息,我们一起给它爬下来
大体思绪就是:
- 先用一些用户信息如浏览器类型、cookie等信息来包装爬虫
- 请求一遍小区列表的url来获取小区总数
- 通过小区总数来计算需要请求的页数,使用for循环来遍历每一页的小区
- 提取每页小区的数据,得到每个小区的详情页链接后继续发送请求来进入详情页
- 提取小区详情页数据
- 将所有结果生存为一个excel表格
废话不多说,直接上干货~
一、代码团体架构剖析
- # 导入必要库(相当于工具箱)
- import requests # 网络请求工具
- import time # 时间控制工具
- import random # 随机数生成器
- import pandas as pd # 数据表格工具
- from bs4 import BeautifulSoup # HTML解析器
- import math # 数学计算工具
- from concurrent.futures import ThreadPoolExecutor, as_completed # 多线程工具
复制代码 下面是团体的函数流程以及每个函数大体的作用~
序号函数名称功能形貌输入参数返回值1init_session(config)初始化网络会话对象config: 用户配置字典requests.Session对象2get_params(session)生成动态请求参数session: 会话对象请求参数字典3fetch_list_page()抓取列表页数据session, page_url剖析后的数据列表4parse_list_page(html)剖析列表页HTML内容html: 页面源代码字符串小区信息列表5fetch_detail_batch()批量抓取详情页数据session, urls详情数据字典6parse_detail_page()剖析详情页完整信息session, url详细字段字典7crawl_full_data()主控流程(分页抓取数据)session归并后的完整数据列表 二、各部分代码详解
1. main()主函数剖析
要修改的地方主要有四个,其余的不需要特殊的改动!!!!
- 城市(city)
- 市县(region)
- Cookies
- excel表格输出的路径
- # 主程序入口(程序起点)
- if __name__ == "__main__":
- # ================== 用户配置区域 ==================
- CONFIG = {
- "city": "fs", # 目标城市拼音(如: 佛山->fs,上海->sh)
- "region": "nanhai", # 目标区域拼音(如: 南海区->nanhai)
- "cookies": { # 必需Cookie
- 'lianjia_uuid': '自修修改',
- 'lianjia_token': '自行修改',
- 'security_ticket': '自行修改'
- },
- "srcid": "自行修改"
- }
- #输出的excel路径
- output_name = f'{CONFIG["city"]}_{CONFIG["region"]}_小区数据.xlsx'
- # ================================================
- # 初始化会话
- session = init_session(CONFIG)
-
- # 执行爬取
- start_time = time.time()
- final_data = crawl_full_data(session)
-
- # 保存结果
- if final_data:
- df = pd.DataFrame(final_data)[[
- '小区名称', '参考均价', '成交信息', '出租信息', '行政区', '商圈', '建筑年代',
- '详情页均价', '建筑类型', '房屋总数', '楼栋总数', '绿化率', '容积率',
- '交易权属', '建成年代', '供暖类型', '用水类型', '用电类型',
- '物业费', '附近门店', '物业公司', '开发商', '详情页链接'
- ]]
- df.to_excel(output_name, index=False)
- print(f"数据已保存至: {output_name}")
- print(f"总计 {len(df)} 条数据,耗时 {(time.time()-start_time)/60:.1f} 分钟")
复制代码 |