前言
京东作为国内最大的电商平台之一,其商品评论数据对于竞品分析、用户舆情监控、商品推荐算法训练等场景都具有极高的价值。然而,京东的评论数据并不像12306或B站那样可以通过简单的API直接获取——评论数据是通过动态加载的,需要模拟浏览器行为才能获取。
本文将基于真实项目代码,详细介绍如何使用 DrissionPage(一个比Selenium更强大的浏览器自动化库)模拟浏览器访问京东商品页,监听评论接口并抓取数据,同时结合 多线程 技术大幅提升爬取效率。
技术背景
本项目涉及以下核心技术和库:
- DrissionPage:基于Selenium改造的浏览器自动化库,语法更简洁,支持监听网络请求
- ThreadPoolExecutor:Python标准库中的线程池,实现多线程并发爬取
- json:解析评论接口返回的JSON数据
- CSS选择器:定位页面元素(评论按钮、下一页按钮等)
为什么用DrissionPage而不是Selenium?
DrissionPage对Chromium的封装更加人性化,特别是 listen 功能可以非常方便地监听指定URL的请求和响应,而不需要额外配置 webdriverwait 或 execute_script,非常适合爬虫场景。
实现思路
京东评论爬虫的整体架构如下:
1 | ┌─────────────────────────────────────────────┐ |
核心代码解析
1. 配置浏览器(首次运行需要)
京东评论爬虫使用了Chromium内核的浏览器,需要先配置Chrome路径:
1 | # 配置浏览器.py |
运行一次后即可,后续不需要再配置。
2. 单线程版:基础爬取逻辑
1 | import json |
代码关键点:
dp.listen.start(pattern):开始监听匹配pattern的网络请求。这是DrissionPage最强大的功能之一,不需要手动抓包分析,直接监听即可。dp.listen.wait():阻塞等待,直到监听到一个匹配的请求,返回Response对象。resp.response.body:直接获取响应体,DrissionPage会自动判断是JSON还是文本。- CSS选择器定位:
#detail > div.tab-main.large > ul > li:nth-child(5)定位到第5个tab(即”评论”标签)。
3. 评论数据字段详解
京东评论接口返回的每条评论包含非常丰富的信息:
1 | comments_info = { |
4. 多线程版:大幅提升爬取效率
单线程版每爬一页需要等待页面加载,效率较低。多线程版通过 ThreadPoolExecutor 实现并发爬取:
1 | import json |
多线程版的关键设计:
- 每个线程独立浏览器实例:
fetch_comments函数内部创建自己的ChromiumPage()对象,避免多线程共享浏览器状态导致的竞态条件 max_workers=5:最多同时运行5个浏览器实例,可以根据机器性能调整as_completed:按任务完成顺序处理结果,而不是按提交顺序- 资源释放:每次任务完成后调用
dp.close()关闭浏览器
注意:多线程版会同时启动多个浏览器窗口,确保电脑内存足够(建议16GB以上)。如果资源有限,可以改用 max_workers=2 或减少同时爬取的页数。
运行效果
1 | 正在启动浏览器... |
JSON文件内容预览:
1 | [ |
总结与优化方向
通过本文的京东评论爬虫项目,我们学习了:
- DrissionPage浏览器自动化:比Selenium更简洁的API,特别是
listen监听功能 - 动态页面爬取:模拟点击、等待数据加载、监听接口响应
- 多线程并发:使用
ThreadPoolExecutor大幅提升爬取效率 - 数据持久化:将结构化评论数据保存为JSON文件
可优化方向:
- 使用Chrome Headless模式:不弹出浏览器窗口,在后台运行,节省资源
- 增加Cookie池:准备多个京东账号的Cookie,轮流使用,降低单个账号被限流的风险
- 失败重试机制:某一页爬取失败时自动重试3次
- 增量爬取:记录已爬取的最大评论ID,只爬取新增评论
- 分布式爬取:结合Redis任务队列,多机协同爬取大规模商品
- 数据清洗与分析:对评论内容做情感分析、关键词提取等后续处理
- 异步优化:使用
asyncio+DrissionPage的异步API(如果支持),进一步提升并发能力
注意:使用浏览器自动化爬取数据时,请合理控制频率,避免对京东服务器造成过大压力。本代码仅供学习交流使用。