李优秀 发表于 2025-3-11 15:20:21

Python贝壳网二手小区数据爬取(2025年3月更)

https://i-blog.csdnimg.cn/direct/df89ed268f374ff3a46d082c44c56bd0.png
上次写了用python爬取安居客二手小区数据,这次应粉丝要求写一篇爬取贝壳网二手小区数据的教程,由于贝壳网的反爬策略比安居客的更为复杂,所以这次就大胆一试!!!
这次教程内容大部分都是由Ai帮我写的,所以大概不太详细!! 欢迎私信大概评论区提问~~
先来看看网页,在这里找到小区,并选择具体的市县地域:
https://i-blog.csdnimg.cn/direct/90924bfaf5d647659acf1eab858addd8.png
然后我们F12打开网络看看数据在那里
https://i-blog.csdnimg.cn/direct/eceb962eb9274c8fbf4faf15ec38cd1a.png
https://i-blog.csdnimg.cn/direct/86cd87247f2a4ecb87277cb532a371ec.png
我们在这个文档里面找到了对应的小区数据,言外之意只需要请求这个url即可得到想要的数据啦~
同时,在这些信息里面还有一个小区详情页的链接,里面有诸如小区的容积率、绿化率、开辟商等等信息,我们一起给它爬下来
https://i-blog.csdnimg.cn/direct/39a5fb8b1a8944fab91c559af9c2d8fd.png
大体思绪就是:

[*]先用一些用户信息如浏览器类型、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} 分钟")
页: [1]
查看完整版本: Python贝壳网二手小区数据爬取(2025年3月更)