爬虫

淘宝商品评论爬虫:JSONP解析与DrissionPage API监听实战

2026-07-06 #Python#爬虫

前言

淘宝作为国内最大的电商平台,其商品评论数据对于选品分析、竞品研究、舆情监控等场景至关重要。然而,淘宝的反爬机制非常复杂,评论数据通过 JSONP 格式返回,且涉及签名验证、Cookie 管理等多重防护。

本文基于真实的淘宝商品评论爬虫项目源码,从三个维度展开讲解:纯 requests 请求 + JSONP 正则解析、CSV 数据结构化存储、以及使用 DrissionPage 监听浏览器 API 请求的自动化方案。三种方案各有优劣,适合不同的场景。

技术背景

淘宝评论接口分析

淘宝商品评论通过以下 API 获取:

1
GET https://h5api.m.taobao.com/h5/mtop.taobao.rate.detaillist.get/6.0/

该接口返回 JSONP 格式的数据,即用回调函数包裹的 JSON:

1
mtopjsonp14({"api":"mtop.taobao.rate.detaillist.get","data":{"rateList":[...]}})

需要用正则表达式将 JSON 部分提取出来才能解析。

JSONP 格式说明

JSONP(JSON with Padding)是一种跨域数据传输方式。服务器返回的不是纯 JSON,而是将 JSON 数据作为参数传递给一个回调函数。淘宝使用 mtopjsonp14 作为回调函数名,我们需要匹配 mtopjsonp14(...) 中的内容。

涉及的库

库 用途
requests 发送 HTTP 请求
re 正则表达式提取 JSONP 中的 JSON
json 解析 JSON 数据
csv 数据结构化存储
datetime 生成带时间戳的文件名
DrissionPage 浏览器自动化与 API 监听

实现思路

项目包含三套代码,逐步递进:

  1. 基础版(淘宝商品评论爬虫重建.py):requests 请求 + 正则解析 JSONP,提取评论文本
  2. 分析版(淘宝商品评论 获取并分析.py):在基础版上增加 CSV 结构化存储,提取18个字段
  3. DrissionPage 版(淘宝商品评论爬虫(只做思路参考代码本身无法运行).py):浏览器自动化监听 API 请求
1
2
3
方案一:requests → JSONP响应 → 正则提取JSON → 遍历rateList → 输出评论
方案二:requests → JSONP响应 → 正则提取JSON → 遍历rateList → CSV存储(18字段)
方案三:DrissionPage → 打开商品页 → 点击评论 → 监听API → 获取响应体

核心代码解析

1. 基础版:JSONP 正则解析

首先构造请求 URL 和头部:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests
import re
import json

# 淘宝评论API请求URL,包含商品ID等参数
url = ('https://h5api.m.taobao.com/h5/mtop.taobao.rate.detaillist.get/6.0/'
'?jsv=2.7.4&appKey=12574478&t=1759197367103'
'&sign=e9f8bf5ab8b1d56e790015b88a2fb02a'
'&api=mtop.taobao.rate.detaillist.get&v=6.0'
'&dataType=jsonp&callback=mtopjsonp14'
'&data=%7B%22auctionNumId%22%3A%22979802405623%22%2C%22pageNo%22%3A1%2C%22pageSize%22%3A20%7D')

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36',
'Cookie': 't=1526546a8c63cfd36a5ceed67ca59dd5; ...'
}

URL 中的关键参数:

  • auctionNumId:商品ID(979802405623)
  • pageNo:评论页码
  • pageSize:每页评论数(20条)
  • sign:请求签名,MD5 算法生成

核心的正则提取逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 模拟的JSONP响应数据
response = 'mtopjsonp14({"api":"mtop.taobao.rate.detaillist.get","data":{...}})'

# 使用正则表达式匹配JSONP格式,提取JSON字符串
# mtopjsonp\d+\((.*)\) 匹配:mtopjsonp + 数字 + ( + 任意内容 + )
match = re.search(r'mtopjsonp\d+\((.*)\)', response, re.S)

if match:
# 提取JSON字符串
json_str = match.group(1)

# 解析为Python字典
data = json.loads(json_str)

# 提取评价列表
rateList = data["data"]["rateList"]

# 遍历输出每条评价的反馈内容
for item in rateList:
print(item["feedback"])
else:
print("不是标准 JSONP 格式")

正则说明:re.S 标志使 . 匹配包括换行符在内的所有字符,因为 JSONP 响应可能跨多行。\d+ 匹配回调函数名中的数字部分(如 mtopjsonp14 中的 14)。

2. 分析版:CSV 结构化存储

分析版在基础版上做了大幅升级,将评论数据结构化存储为 CSV 文件,提取18个字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import csv
from datetime import datetime

# 定义CSV列名(18个字段)
fieldnames = [
'评论ID', '用户昵称', '信用等级', '用户星级', '评论内容',
'评论日期', '创建时间', '时间间隔', '机身颜色', '网络类型',
'版本类型', '套餐类型', '存储容量', '点赞数', '评论数',
'阅读数', '图片数量', '是否回头客'
]

# 生成带时间戳的文件名
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
csv_filename = f'taobao_reviews_{timestamp}.csv'

with open(csv_filename, 'w', newline='', encoding='utf-8-sig') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()

for rate in rate_list:
# 提取SKU信息(商品规格)
sku_map = rate.get('skuMap', {})

# 构建行数据
row_data = {
'评论ID': rate.get('id', ''),
'用户昵称': rate.get('userNick', '匿名用户'),
'信用等级': rate.get('creditLevel', ''),
'用户星级': rate.get('userStar', ''),
'评论内容': rate.get('feedback', ''),
'评论日期': rate.get('feedbackDate', ''),
'创建时间': rate.get('createTime', ''),
'时间间隔': rate.get('createTimeInterval', ''),
'机身颜色': sku_map.get('机身颜色', ''),
'网络类型': sku_map.get('网络类型', ''),
'版本类型': sku_map.get('版本类型', ''),
'套餐类型': sku_map.get('套餐类型', ''),
'存储容量': sku_map.get('存储容量', ''),
'点赞数': rate['interactInfo'].get('likeCount', 0),
'评论数': rate['interactInfo'].get('commentCount', 0),
'阅读数': rate['interactInfo'].get('readCount', 0),
'图片数量': len(rate.get('feedPicList', [])),
'是否回头客': '是' if rate.get('repeatBusiness') == 'true' else '否'
}
writer.writerow(row_data)

关键设计点:

  • encoding='utf-8-sig':使用 BOM 编码,确保 Excel 打开 CSV 时中文不乱码
  • rate.get('id', ''):使用 .get() 方法避免字段缺失时抛出异常
  • sku_map 提取:评论数据中的 skuMap 字段包含商品规格信息(颜色、容量等)

3. 单条评论数据结构

通过分析手动创建的 JSON 文件,可以了解单条评论的完整数据结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"id": "1284684257912",
"auctionNumId": "979802405623",
"auctionTitle": "官方正品新款i16p大屏拍照智能手机备用机电竞游戏学生党便宜百元",
"feedback": "非常不错,很流畅,不卡顿,刷视频也很方便",
"feedbackDate": "2025年9月26日",
"createTime": "9月26日",
"createTimeInterval": "3天前",
"userNick": "天**质",
"creditLevel": "11",
"userStar": "9",
"rateType": "1",
"repeatBusiness": "true",
"skuMap": {
"机身颜色": "黑旋风 【i16 PRO MAX免费试用-质保5年】",
"网络类型": "5G全网通",
"版本类型": "中国大陆",
"套餐类型": "套餐六[蓝牙耳機]",
"存储容量": "16GB+1024GB"
},
"interactInfo": {
"likeCount": "0",
"commentCount": "1",
"readCount": "129"
},
"feedPicList": [...]
}

4. DrissionPage 版:API 监听方案

当纯 requests 方案因反爬失效时,可以使用 DrissionPage 监听浏览器请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from DrissionPage import ChromiumPage

# 初始化浏览器实例
dp = ChromiumPage()

# 定义商品详情页URL
Url = 'https://detail.tmall.com/item.htm?id=536171738459'

# 打开商品详情页
dp.get(Url)

# 启动监听器,监听评论API请求
dp.listen.start(
'https://h5api.m.tmall.com/h5/mtop.taobao.rate.detaillist.get/6.0/')

# 等待监听到2个请求完成
resp = dp.listen.wait(count=2)

# 获取最后一个请求的响应体
json_data = resp[-1].response.body
print(json_data)

这个方案的思路是:让真实浏览器去访问页面,DrissionPage 在后台监听网络请求,当捕获到评论 API 的响应时直接提取数据。由于是真实浏览器行为,完全绕过了签名和反爬问题。

使用前需要先配置浏览器路径:

1
2
3
4
from DrissionPage import ChromiumOptions

path = r'C:\Program Files\Google\Chrome\Application\chrome.exe'
ChromiumOptions().set_browser_path(path).save()

运行效果

运行分析版爬虫后,控制台输出:

1
2
3
4
5
6
7
8
数据已成功保存到 taobao_reviews_20250930_104357.csv 文件中
共保存 10 条评论记录

前3条记录预览:
--------------------------------------------------
1. 天**质: 非常不错,很流畅,不卡顿,刷视频也很方便...
2. 张**三: 手机收到了,外观颜值很高,拍照效果很赞...
3. 李**四: 快递物流很快,第二天就到了,性价比高...

生成的 CSV 文件包含18列结构化数据,可直接用 Excel 或 pandas 打开分析。

总结与优化方向

本文基于淘宝商品评论爬虫的三套真实源码,完整讲解了 JSONP 解析、CSV 结构化存储、DrissionPage API 监听三种技术方案。

三种方案对比:

维度 requests 基础版 requests 分析版 DrissionPage 版
实现难度 低 中 中
反爬风险 高(签名易过期) 高 低(真实浏览器)
数据完整度 仅评论文本 18字段结构化 原始JSON
运行速度 快 快 慢(需启动浏览器)
可扩展性 差 好 好

优化方向:

  1. 自动翻页:当前仅采集第一页,可根据 hasNext 字段循环翻页
  2. 签名自动生成:逆向 sign 参数的 MD5 算法,实现签名自动化
  3. 评论图片下载:feedPicList 中的图片URL可批量下载到本地
  4. 情感分析:对 feedback 字段进行 NLP 情感分析,统计好评/差评比例
  5. 定时监控:配合定时任务,监控指定商品评论变化,及时发现差评

淘宝评论爬虫的核心挑战在于 sign 签名的获取和 JSONP 格式的解析。掌握了正则提取和 DrissionPage 监听两种方案,就能灵活应对各种 JSONP 接口的数据采集需求。


相关文章


评论
分享

评论