Python突破验证码抓取贝壳二手房源数据
一、爬虫实现的基本流程
1. 数据来源分析
(1)明确需求
明确采集的网站以及数据内容
- 网址:https://cs.ke.com/ershoufang!
- 数据:房源信息
(2)抓包分析
通过浏览器的开发者工具分析对应的数据位置
- 打开开发者工具
在浏览器页面中按F12,刷新网页

- 让本网页的数据内容重新加载一遍,通过关键字搜索查询对应数据位置
关键字搜索:需要什么数据就搜什么数据


说明贝壳二手房源数据是静态页面,即想要数据内容都在网页源代码中存在。
2. 代码实现步骤
requests 模块
1. 发送请求:模拟浏览器对于 url 地址发送请求
2. 获取数据:获取服务器返回响应数据
3. 解析数据:提取我们需要的数据内容
4. 保存数据:把提取出来的数据保存本地文件中
requests 模块请求 -> 需要模拟浏览器 (把 Python 代码伪装成浏览器进行请求)
- 如果网站进行一些反爬处理,需要进行反反爬操作(如果对于反爬比较严重网站,使用 requests 请求获取数据,相对而言会比较麻烦)
drissionpage 模块
- 自动化模块:模拟人的行为对于浏览器进行相关操作
使用自动化采集数据,对于初学者来说更友好,更简单
1. 打开浏览器,访问网站
2. 获取数据
3. 解析数据
4. 保存数据
二、准备工作
1. 安装
(1)运行环境
操作系统:Windows、Linux 和 Mac
Python 版本:3.6 及以上
支持:Chromium 内核浏览器(如 Chrome 和 Edge)、electron 应用
(2)安装
请使用 pip 安装:
pip install DrissionPage
(3)升级
A. 升级最新稳定版
pip install DrissionPage --upgrade
B. 指定版本升级
pip install DrissionPage==4.0.0b17

2.尝试启动浏览器
默认状态下,程序会自动在系统内查找 Chrome 路径。
执行以下代码,浏览器启动并且访问了项目官网,说明可直接使用,跳过后面的步骤即可。
执行open_edge.py文件
代码如下:
from DrissionPage import Chromium
tab = Chromium().latest_tab
tab.get('http://DrissionPage.cn')
3.设置路径
如果上面的步骤提示出错,说明程序没在系统里找到 Chrome 浏览器。
可用以下方法设置,设置会持久化记录到默认配置文件,之后程序会使用该设置启动。
(1)新建config_browser.py文件
输入以下代码,填入您电脑里的Edge浏览器可执行文件路径,然后运行。
每个人电脑中可能存在多个浏览器,程序是不清楚你究竟使用具体哪个浏览器进行数据获取
- 在第一次使用的时候,需要配置浏览器可执行文件路径 (让程序知道你要使用哪个个浏览器进行数据获取)
- 使用 Edge 的查找 Edge 应用程序的文件路径,使用 Chrome 的查找 Chrome 应用程序的文件路径

执行代码如下:
from DrissionPage import ChromiumOptions
# 这是你刚刚找到的Edge路径,直接用
path = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
# 配置并保存(只需要运行一次)
ChromiumOptions().set_browser_path(path).save()
print("✅ 浏览器路径配置成功!")

表示配置成功了!
PS:第一次使用的时候需要进行配置,后续只要不更改浏览器或不更改浏览器位置,就不需要再进行配置了
(2)更改 open_edge.py文件代码(适配本机)
执行代码如下:
# 导入自动化模块
from DrissionPage import ChromiumPage
# 打开浏览器(自动读取你配置好的Edge路径)
dp = ChromiumPage()

三、代码具体实现
1.打开浏览器,访问网站
执行以下代码(适配本机):
# 适配你当前版本的正确导入方式
from DrissionPage import ChromiumPage
# 获取浏览器最新标签页(会自动读取你之前配置好的Edge路径)
page = ChromiumPage()
tab = page.latest_tab
# 访问项目官网,验证配置是否成功
tab.get('http://DrissionPage.cn')

2. 获取数据与解析数据
因为贝壳网站数据静态页面,可以直接通过元素面板直接定位数据标签获取数据内容
css 选择器解析数据:
- 根据标签属性提取数据内容
(1)查看数据对应的标签位置
(2)根据标签实现相关语法

第一个房源信息在<div class="info clear">里

同样,第二个房源信息也在<div class="info clear">里

3. 根据格式写拉取数据代码
拉取静态页面中的房源数据并保存在CSV文件中
执行以下代码:
from DrissionPage import ChromiumPage
import csv
# 1. 打开网页
dp = ChromiumPage()
dp.get('https://sh.ke.com/ershoufang/pudong/')
# 2. 获取所有房源
houses = dp.eles('css:.info.clear')
print(f"共找到 {len(houses)} 套二手房源")
# 3. 创建CSV文件保存数据
with open('pudong_house_data.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
# 写入表头
writer.writerow([
'标题', '小区', '楼层', '建造年份', '户型', '面积(㎡)', '朝向',
'总价(万)', '单价(元/平)'
])
# 4. 遍历提取数据
for idx, house in enumerate(houses, 1):
try:
# 基础信息
title = house.ele('css:.title').text.strip()
address = house.ele('css:.address').text.strip()
info = house.ele('css:.houseInfo').text.strip()
total = house.ele('css:.totalPrice').text.strip().replace('万', '')
unit = house.ele('css:.unitPrice').text.strip().replace('元/平', '')
# 拆分 info 字段(楼层 | 年份 | 户型 | 面积 | 朝向)
info_parts = info.split(' | ')
floor = info_parts[0] if len(info_parts) > 0 else ''
year = info_parts[1] if len(info_parts) > 1 else ''
room = info_parts[2] if len(info_parts) > 2 else ''
area = info_parts[3].replace('平米', '') if len(info_parts) > 3 else ''
direction = info_parts[4] if len(info_parts) > 4 else ''
# 写入一行数据
writer.writerow([
title, address, floor, year, room, area, direction,
total, unit
])
print(f"第{idx}套已保存:{address}")
except Exception as e:
print(f"第{idx}套数据异常,跳过:{e}")
print("✅ 所有房源数据已保存到 pudong_house_data.csv")
成功抓取 浦东 30 套二手房完整数据
自动生成了数据分析文件:pudong_house_data.csv
数据字段包含(直接可用于房价回归分析):
标题、小区名称、楼层、建造年份、户型、面积、朝向、总价(万)、单价(元 / 平)
输出结果文件在以下路径:
E:\School Study\ZK\A\pudong_housing_regression\pudong_house_data.csv
4.批量爬虫抓取数据
执行以下代码:
from DrissionPage import ChromiumPage
import csv
import time
# 要爬多少页,自己改这里
PAGE_NUM = 100
# 初始化浏览器
dp = ChromiumPage()
# 保存所有房源
all_houses = []
for page in range(1, PAGE_NUM + 1):
url = f'https://sh.ke.com/ershoufang/pudong/pg{page}/'
print(f"\n======== 正在爬第 {page} 页 ========")
dp.get(url)
time.sleep(2)
houses = dp.eles('css:.info.clear')
print(f"本页找到 {len(houses)} 套房源")
for house in houses:
try:
title = house.ele('css:.title').text.strip()
address = house.ele('css:.address').text.strip()
info = house.ele('css:.houseInfo').text.strip()
total = house.ele('css:.totalPrice').text.strip().replace('万', '')
unit = house.ele('css:.unitPrice').text.strip().replace('元/平', '')
info_parts = info.split(' | ')
floor = info_parts[0] if len(info_parts) > 0 else ''
year = info_parts[1] if len(info_parts) > 1 else ''
room = info_parts[2] if len(info_parts) > 2 else ''
area = info_parts[3].replace('平米', '') if len(info_parts) > 3 else ''
direction = info_parts[4] if len(info_parts) > 4 else ''
all_houses.append([
title, address, floor, year, room, area, direction, total, unit
])
except:
continue
# 保存到csv
with open('pudong_house_data_more.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow([
'标题','小区','楼层','建造年份','户型','面积(㎡)','朝向','总价(万)','单价(元/平)'
])
writer.writerows(all_houses)
print(f"\n✅ 全部爬完!共 {len(all_houses)} 条数据,已保存到 pudong_house_data_more.csv")

成功抓取2820条数据!!
以上就是 Python 爬取贝壳房源的完整实操流程,欢迎大家一起交流学习、探讨优化~
更多推荐







所有评论(0)