python

淘宝商品评论爬虫: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 接口的数据采集需求。

评论
分享