本文基于四个真实爬虫项目——淘宝商品评论、B站视频弹幕、B站视频评论区、京东商品评论,从代码实现到运行结果,系统梳理了 Python 爬虫开发的核心技术与实战踩坑经验。
1. 项目概览
本文涉及的四个爬虫项目覆盖了从简单 API 请求到复杂浏览器模拟的全链路技术栈:
| 项目 | 目标平台 | 核心技术 | 数据格式 | 反爬难度 |
|---|---|---|---|---|
| 淘宝商品评论 | 淘宝 H5 API | requests + JSONP 解析 | CSV | ⭐⭐⭐⭐⭐ |
| B站视频弹幕 | B站 API + XML | requests + lxml + pandas | CSV + 词云图 | ⭐⭐ |
| B站视频评论区 | B站 WBI API | requests + Cookie 认证 | JSON | ⭐⭐⭐ |
| 京东商品评论 | 京东 Web API | DrissionPage 浏览器模拟 | JSON | ⭐⭐⭐⭐ |
2. 爬虫技术分类与选型
2.1 两大技术路线
根据目标网站的防护强度,爬虫技术大致分为两条路线:
路线 A:轻量级 API 请求
直接通过 requests 库向目标网站的公开/半公开 API 发送 HTTP 请求,获取 JSON/XML 格式的结构化数据。适用于反爬机制较弱的平台(如 B站弹幕接口)。
1 | import requests |
路线 B:浏览器模拟(Browser Automation)
通过 DrissionPage、Selenium 等工具启动真实浏览器,模拟用户操作(点击、翻页),同时监听浏览器与服务器之间的网络数据包,截取 API 响应。适用于反爬机制极强的平台(如京东、淘宝)。
1 | from DrissionPage import ChromiumPage |
2.2 选型决策树
1 | 目标网站是否有强签名/加密参数? |
3. 淘宝商品评论爬虫——JSONP 解析与反爬对抗
3.1 技术背景
淘宝的移动端 H5 API(h5api.m.taobao.com)返回商品评论数据,但格式为 JSONP——即在标准 JSON 外面包裹一层回调函数名:
1 | mtopjsonp14({"api":"mtop.taobao.rate.detaillist.get","data":{...}}) |
这种格式是为浏览器跨域请求设计的,但给爬虫解析带来了额外的处理步骤。
3.2 JSONP 解析核心代码
1 | import re |
关键点:
re.S标志使.匹配换行符,因为 JSONP 数据可能跨多行\d+匹配回调函数名中的数字部分(如mtopjsonp14),应对不同回调名(.*)提取括号内的 JSON 数据
3.3 反爬困境与应对
淘宝 API 的请求 URL 中包含了多个签名参数:
1 | ?jsv=2.7.4&appKey=12574478&t=1759197367103&sign=e9f8bf5ab8b1d56e790015b88a2fb02a |
其中 sign 是基于时间戳 t 和 Token 动态计算的签名,_m_h5_tk 和 _m_h5_tk_enc 也是通过 Cookie 传递的动态令牌。这意味着:
- 签名参数无法静态构造——每次请求都需要根据当前时间戳和 Token 重新计算
- Token 会过期——Cookie 中的
_m_h5_tk有时效性,过期后请求会被拒绝
实际应对策略:由于签名算法难以逆向,项目最终采用了一种务实的做法——将一次成功请求的真实响应数据保存为字符串变量,直接解析:
1 | # 爬下来的淘宝商品真实的评论JSONP响应数据 |
3.4 数据解析与 CSV 存储
从评论数据中提取了 18 个维度的字段:
1 | fieldnames = [ |
运行结果示例(CSV 文件内容):
| 评论ID | 用户昵称 | 评论内容 | 评论日期 | 机身颜色 | 点赞数 | 是否回头客 |
|---|---|---|---|---|---|---|
| 1284684257912 | 天**质 | 非常不错,很流畅,不卡顿 | 2025年9月26日 | 黑旋风 | 0 | 是 |
| 1284620079018 | 雅**8 | 过些天就带回去给奶奶用了 | 2025年9月25日 | 乳白色 | 1 | 否 |
3.5 单条评论数据结构详解
通过手动创建的单条评论 JSON 文件,可以清晰地看到淘宝评论 API 返回的完整数据结构:
1 | { |
踩坑记录:淘宝的
skuMap是一个非常实用的字段,它将评论与具体的商品规格关联起来,使得评论分析可以按颜色、容量等维度分组统计。
4. B站视频弹幕爬虫——XML 解析与数据可视化
4.1 技术背景
B站的弹幕数据通过 XML 格式返回,每个弹幕是一个 <d> 元素,其 p 属性包含了弹幕的元信息:
1 | <d p="1.469,5,25,16777215,1758369281,0,85ccfef9,1940101167245884928">寄明月?(关注点错误)</d> |
p 属性的 8 个字段依次为:出现时间、弹幕类型、字体大小、颜色值、发送时间戳、弹幕池、用户哈希、弹幕ID。
4.2 两步获取流程
B站弹幕的获取分为两步:
第一步:获取视频分 P 的 cid
1 | cid_api = f"https://api.bilibili.com/x/player/pagelist?bvid={BVID}&jsonp=jsonp" |
第二步:根据 cid 获取弹幕 XML
1 | danmu_url = f"https://comment.bilibili.com/{cid}.xml" |
4.3 代码演进:从脚本到函数化
项目中可以看到明显的代码演进过程:
Demo001 版——脚本式写法,所有逻辑平铺在主流程中:
1 | # 直接发送请求 |
公孙田浩版——函数化重构,增加异常处理和超时控制:
1 | def fetch_cid_list(bvid): |
数据标注版——集成弹幕 + 评论 + 词云的完整工作流:
1 | # 主流程包含 7 个步骤 |
4.4 运行结果示例
弹幕 CSV 文件输出(BV1wbpRzaEhz 视频):
| page | time_in_video | mode | send_time | content |
|---|---|---|---|---|
| 1 | 1.469 | 5 | 1758369281 | 寄明月?(关注点错误) |
| 1 | 27.593 | 5 | 1758388834 | 赛博坦音效绷不住 |
| 1 | 177.851 | 1 | 1758374485 | “兄弟们” |
| 1 | 278.327 | 1 | 1758372852 | 法律真的要严了 |
踩坑记录:Windows CMD 下输出中文弹幕容易遇到
UnicodeEncodeError,解决方案是用gbk编码做 fallback:item.encode('gbk', errors='replace').decode('gbk')。
4.5 数据可视化——词云生成
数据标注版项目集成了词云分析功能,使用 jieba 分词 + WordCloud 生成可视化词云:
1 | from wordcloud import WordCloud |
关键注意点:
font_path必须指定中文字体文件,否则中文词云会显示为方块simhei.ttf是 Windows 系统自带的黑体字体,位于C:\Windows\Fonts\目录- 输出 DPI 设为 300,确保高清词云图
5. B站视频评论区爬虫——API 直调与 Cookie 认证
5.1 技术背景
B站评论区使用了 WBI 签名机制(w_rid + wts),这是 B站较新的反爬措施。API URL 中包含了签名参数:
1 | https://api.bilibili.com/x/v2/reply/wbi/main?oid=...&type=1&mode=3 |
5.2 基础版 vs 优化版
基础版(B站视频评论爬虫.py):
1 | import json |
特点:代码简洁直接,但缺少错误处理和灵活性。
AI 优化版(B站视频评论爬虫AI优化.py):
1 | # 从环境变量中读取配置(避免硬编码敏感信息) |
优化点总结:
| 改进项 | 基础版 | 优化版 |
|---|---|---|
| 配置管理 | 硬编码在代码中 | os.getenv 环境变量 |
| 错误处理 | 无 | 三层 try-except |
| 文件命名 | 固定名称 | 动态时间戳命名 |
| 状态码检查 | 无 | if response.status_code == 200 |
5.3 运行结果
评论区 JSON 文件包含了丰富的结构化数据:
1 | { |
踩坑记录:B站评论 API 的
oid参数需要传视频的cid(而非aid),需要先通过分 P 接口获取cid再拼接评论 URL。这一点在数据标注版项目中已经正确处理。
5.4 User-Agent 随机轮换
两个版本都使用了 User-Agent 池来降低被封风险:
1 | user_agents = [ |
这是一种低成本的反爬对策,比单一固定 User-Agent 更难被识别为机器人流量。
6. 京东商品评论爬虫——浏览器模拟与数据包监听
6.1 为什么选择浏览器模拟
京东商品评论 API 具有极强的反爬保护:
- API URL 中包含复杂的加密参数
- 需要 JavaScript 执行才能生成正确的请求签名
- 评论数据只在用户点击”评价”标签后才加载
因此,简单的 requests 直调方案无法工作,必须走浏览器模拟路线。
6.2 DrissionPage 简介
DrissionPage 是一个国产的浏览器自动化库,相比 Selenium 有以下优势:
- 内置数据包监听:可以直接截获浏览器与服务器之间的 API 响应,无需再解析页面 HTML
- 更简洁的 API:元素定位和操作更加直观
- 更快的执行速度:无需通过 WebDriver 中间层
6.3 核心技术:数据包监听
这是本项目最关键的技术点——不解析页面 DOM,而是监听浏览器发出的网络请求:
1 | from DrissionPage import ChromiumPage |
工作原理:
1 | 浏览器加载页面 → 用户点击评论标签 → 触发 AJAX 请求 |
这种方式的优势在于:
- 绕过签名参数——浏览器自己生成了正确的请求参数,爬虫只需截获结果
- 数据格式干净——直接获取 API 返回的 JSON,无需从 HTML 中提取
- 操作自然——模拟真实用户行为,点击翻页按钮触发数据加载
6.4 翻页与多页爬取
1 | while current_page < max_pages: |
6.5 多线程加速版本
项目中还开发了多线程版本,使用 ThreadPoolExecutor 并行爬取多个页面:
1 | from concurrent.futures import ThreadPoolExecutor, as_completed |
注意事项:多线程浏览器模拟意味着同时开启多个 Chrome 实例,内存消耗较大。
max_workers=5是一个合理的折中值。
6.6 运行结果
京东评论 JSON 数据的字段非常丰富,包含 30+ 个维度:
1 | { |
6.7 浏览器配置
使用前需要指定 Chrome 浏览器路径:
1 | from DrissionPage import ChromiumOptions |
这是一次性配置,保存后后续运行无需重复设置。
7. 数据存储策略对比
四个项目使用了不同的数据存储格式,各有适用场景:
7.1 CSV 格式(淘宝评论、B站弹幕)
优点:
- 人类可读,可用 Excel 直接打开
- 结构化表格数据,适合字段固定的场景
utf-8-sig编码确保 Excel 打开中文不乱码
1 | # 淘宝评论:使用 DictWriter 写入结构化数据 |
7.2 JSON 格式(B站评论、京东评论)
优点:
- 保留原始数据层级结构
- 适合嵌套字段(如评论中的图片列表、回复列表)
ensure_ascii=False+indent=4使中文可读且格式美观
1 | with open(filename, 'w', encoding='utf-8') as f: |
7.3 选择建议
| 场景 | 推荐格式 | 原因 |
|---|---|---|
| 扁平数据(评论列表) | CSV | 表格直观,Excel 可直接分析 |
| 层级数据(嵌套评论+图片) | JSON | 保留完整结构,便于二次处理 |
| 时序数据(弹幕出现时间) | CSV | 便于按时间排序和统计 |
| 最终展示/分享 | JSON | 格式美观,语义完整 |
8. 反爬机制与应对策略总结
8.1 四大反爬手段
| 反爬类型 | 实例 | 难度 |
|---|---|---|
| 动态签名 | 淟宝 _m_h5_tk + sign |
极高 |
| WBI 签名 | B站 w_rid + wts |
高 |
| Cookie 认证 | B站 SESSDATA | 中 |
| JS 动态渲染 | 京东评论页面 | 高 |
8.2 应对策略矩阵
| 策略 | 适用场景 | 项目实例 |
|---|---|---|
| Cookie + User-Agent 模拟 | 低防护 API | B站弹幕、评论区 |
| JSONP 正则剥离 | JSONP 格式响应 | 淘宝评论 |
| 浏览器数据包监听 | JS 加密签名 | 京东评论 |
| 数据快照保存 | 无法持续请求 | 淘宝评论(硬编码响应) |
| 多线程并发加速 | 大量数据爬取 | 京东评论多线程版 |
| 请求间隔控制 | 避免频率封禁 | 数据标注版 time.sleep(1) |
8.3 实战经验
- 先抓包再写代码:使用浏览器 DevTools 的 Network 面板分析真实请求,比直接猜 API 参数高效得多
- Cookie 会过期:所有涉及 Cookie 的爬虫都需要定期更新,建议通过环境变量注入而非硬编码
- 签名参数是最大障碍:淘宝的
sign、B站的w_rid等动态签名是爬虫的核心难点,浏览器模拟是最可靠的绕过方式 - 不要一味追求完美:淘宝评论项目最终采用了”数据快照”策略——虽然无法实时爬取,但至少完成了数据解析和存储的完整流程
9. 数据分析与可视化
9.1 词云分析
数据标注版项目展示了从原始弹幕数据到可视化词云的完整流程:
1 | # 步骤 1: jieba 中文分词 |
9.2 评论数据的多维分析
淘宝评论 CSV 数据支持按 SKU 维度分组分析:
1 | import pandas as pd |
9.3 弹幕时序分析
B站弹幕的 time_in_video 字段支持按视频播放时间线分析弹幕密度:
1 | df = pd.read_csv('BV1wbpRzaEhz_danmu.csv') |
10. 技术演进路线与最佳实践
10.1 从这四个项目看到的演进轨迹
1 | Level 1: 纯 API 请求 + 简单解析 |
10.2 最佳实践清单
- 永远先抓包——用 DevTools 或 Fiddler 分析真实请求,搞清楚 URL、参数、响应格式
- 配置外置——Cookie、URL 等敏感配置通过环境变量注入,避免硬编码和泄露
- 错误处理三层防护——网络层(
RequestException)、解析层(JSONDecodeError/XMLSyntaxError)、业务层(字段缺失/格式异常) - 数据存储选格式——扁平数据用 CSV,嵌套数据用 JSON,始终用
utf-8-sig/utf-8编码 - 请求频率控制——
time.sleep()加间隔,避免触发频率封禁 - User-Agent 轮换——维护一个 UA 池,每次请求随机选择
- 数据包监听优于 DOM 解析——在浏览器模拟场景中,监听 API 响应比解析 HTML 更高效更稳定
- 中文编码兜底——Windows 环境下输出中文时做好
gbkfallback,文件存储用utf-8 - 词云要用中文字体——
WordCloud的font_path必须指定中文字体文件 - 浏览器路径配置一次即可——DrissionPage 的
ChromiumOptions设置后save()即持久化
10.3 依赖库清单
1 | # 基础爬虫 |
结语
这四个项目覆盖了 Python 爬虫开发的主要技术栈和常见挑战。从简单的 API 请求到复杂的浏览器模拟,从 JSONP/XML 解析到词云可视化,每一层都有独特的技术细节和实战踩坑点。
爬虫的本质不是”黑科技”,而是理解目标系统的数据流转机制——数据从哪里来、通过什么格式传输、有哪些保护措施。搞清楚这三点,剩下的就是选择合适的技术路线和写出健壮的代码。
本文基于以下真实项目代码编写:
- 淘宝商品评论爬虫重建版(
淘宝商品评论爬虫重建.py) - B站视频弹幕 Demo001、公孙田浩版、数据标注版
- B站视频评论爬虫基础版与 AI 优化版
- 京东商品评论爬虫普通版与多线程版