前言:商品评论数据是电商运营分析、竞品监控、用户需求挖掘的核心数据源。淘宝作为国内头部电商平台,其开放平台提供了合规的评论数据获取接口,可有效规避违规爬虫带来的账号风险与法律风险。本文将从前置准备、API调用实战、响应数据解析、常见问题排查四个维度,完整呈现淘宝商品评论数据的合规抓取流程,附可直接运行的代码示例,助力开发者快速落地。
一、前置准备:权限申请与环境搭建
在调用淘宝API前,需完成开放平台账号认证、应用创建及权限申请,同时搭建基础开发环境,这是合规抓取的前提条件。
1.1 淘宝开放平台权限申请
核心流程:注册账号 → 开发者认证 → 创建应用 → 申请评论接口权限,具体步骤如下:
-
账号注册与认证:访问淘宝开放平台,完成个人或企业账号注册。企业账号的接口配额(每日调用次数)是个人账号的5倍以上,长期使用建议优先完成企业认证(需上传营业执照、对公账户信息)。
-
创建应用:进入「开发者中心-应用管理」,点击「创建应用」,应用名称建议填写"XX商家运营助手""XX口碑监测工具"等合规表述,避免出现"爬虫""抓取"等敏感词汇,否则易被审核驳回。应用创建后,可获取核心凭证:
App Key(应用密钥)和App Secret(应用秘钥),需妥善保管在服务端,禁止客户端明文存储。 -
申请评论接口权限:核心调用接口为
taobao.item.review.get(商品评论查询),部分场景也可使用taobao.traderates.get(交易评价查询)。申请时需详细填写场景说明,例如"内部商品口碑分析,数据仅用于企业内部决策,不对外传播,3个月自动脱敏归档",附简单功能原型图可提升审核通过率,一般3个工作日内完成审核。
1.2 开发环境搭建
推荐使用Python语言(数据处理便捷、生态完善),核心依赖库如下:
-
requests:发送HTTP请求,支持长连接与重试机制,提升调用稳定性; -
hashlib:生成API调用所需的MD5签名,确保请求合法性; -
pandas(可选):批量处理评论数据,如去重、筛选、统计分析; -
logging:日志记录,便于排查调用异常。
依赖安装命令:
pip install requests pandas
二、API调用核心逻辑与实战演示
淘宝API调用需严格遵循「参数拼接→签名生成→请求发送→响应解析」流程,其中签名生成是核心难点,错误会直接导致调用失败。
2.1 接口基础信息
| 参数名称 | 说明 | 必填性 | 示例值 |
|---|---|---|---|
| 接口地址 | 淘宝开放平台标准网关 | 是 | https://eco.taobao.com/router/rest |
| 请求方式 | GET/POST,推荐POST(避免参数暴露) | 是 | POST |
| 公共参数 | method、app_key、timestamp、format、v、sign_method、sign | 是 | - |
| 业务参数 | num_iid(商品ID)、page_no(页码)、page_size(每页条数)、sort(排序方式) | 是 | num_iid=689712345678,sort=1(最新) |
关键参数说明:
-
method:接口名称,调用商品评论接口填写
taobao.item.review.get; -
sort:排序方式,1=最新评论,2=最热评论(默认按默认排序);
-
page_size:每页最大返回100条评论,默认20条,需合理设置减少请求次数。
2.2 签名生成逻辑
淘宝API通过签名验证请求合法性,核心步骤:
-
将所有请求参数(公共参数+业务参数)按参数名ASCII码升序排序;
-
拼接排序后的键值对(无分隔符),格式为「key1value1key2value2...」;
-
在拼接字符串首尾添加
App Secret; -
对字符串进行UTF-8编码后,执行MD5哈希运算,结果转为大写即为签名。
2.3 完整调用代码示例
以下代码实现了评论数据的批量获取、日志记录与数据结构化,可直接替换 App Key 和 App Secret 运行:
import requests import hashlib import time import json import logging # 日志配置(排查异常必备) logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) class TaobaoReviewCrawler: def __init__(self, app_key, app_secret): self.app_key = app_key self.app_secret = app_secret self.api_url = "https://eco.taobao.com/router/rest" # 初始化长连接,减少TCP握手开销 self.session = self._init_session() def _init_session(self): """创建支持重试的会话对象,提升稳定性""" session = requests.Session() adapter = requests.adapters.HTTPAdapter( pool_connections=10, pool_maxsize=50, max_retries=3 # 失败自动重试3次 ) session.mount('https://', adapter) return session def _generate_sign(self, params): """生成API签名(核心逻辑)""" # 1. 按参数名ASCII升序排序 sorted_params = sorted(params.items(), key=lambda x: x[0]) # 2. 拼接键值对 param_str = ''.join([f"{k}{v}" for k, v in sorted_params]) # 3. 首尾添加AppSecret并MD5加密 sign_str = self.app_secret + param_str + self.app_secret sign = hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper() return sign def get_reviews(self, num_iid, page_no=1, page_size=20, sort=1): """ 核心方法:获取商品评论数据 :param num_iid: 商品ID(必填) :param page_no: 页码(默认1) :param page_size: 每页条数(默认20,最大100) :param sort: 排序方式(1=最新,2=最热) :return: 结构化评论数据列表 """ # 1. 拼接请求参数 params = { "method": "taobao.item.review.get", "app_key": self.app_key, "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "format": "json", "v": "2.0", "sign_method": "md5", "num_iid": num_iid, "page_no": page_no, "page_size": page_size, "sort": sort } # 2. 生成签名 params["sign"] = self._generate_sign(params) try: # 3. 发送请求 response = self.session.get(self.api_url, params=params, timeout=10) response.raise_for_status() # 抛出HTTP请求异常 result = response.json() logger.info(f"第{page_no}页评论请求成功,request_id:{result.get('request_id')}") # 4. 解析响应数据 review_data = result.get("resp_data", {}).get("item_review_get_response", {}) total_reviews = review_data.get("total_results", 0) # 评论总数 reviews_list = review_data.get("reviews", []) # 评论列表 # 5. 数据结构化(提取核心字段) structured_reviews = [] for review in reviews_list: structured_reviews.append({ "评论ID": review.get("id"), "商品ID": review.get("num_iid"), "用户昵称": review.get("user_nick"), "用户等级": review.get("user_level"), "是否会员": review.get("user_vip"), "评论内容": review.get("content"), "评论时间": review.get("created"), "评分": review.get("rate"), "是否追评": review.get("has_more"), "追评内容": review.get("more_content"), "晒图数量": review.get("pic_num"), "晒图链接": review.get("pic_urls", []), "购买规格": review.get("spec_info"), "有用数": review.get("useful_vote"), "商家回复": review.get("reply"), "回复时间": review.get("reply_created") }) return { "total_reviews": total_reviews, "current_page": page_no, "reviews": structured_reviews } except requests.exceptions.RequestException as e: logger.error(f"第{page_no}页评论请求失败:{str(e)}") return None except json.JSONDecodeError as e: logger.error(f"响应数据解析失败:{str(e)}") return None # --------------- 调用示例 --------------- if __name__ == "__main__": # 替换为你的App Key和App Secret APP_KEY = "你的App Key" APP_SECRET = "你的App Secret" # 替换为目标商品ID PRODUCT_ID = "689712345678" crawler = TaobaoReviewCrawler(APP_KEY, APP_SECRET) # 获取第1页最新评论(20条) result = crawler.get_reviews(num_iid=PRODUCT_ID, page_no=1, page_size=20, sort=1) if result: print(f"商品评论总数:{result['total_reviews']}") print("第1页评论数据:") print(json.dumps(result['reviews'], ensure_ascii=False, indent=2))
三、响应数据解析与应用
淘宝评论API返回JSON格式数据,分为顶层状态信息和业务数据两部分,需重点关注评论核心字段的提取与应用。
3.1 完整响应示例
{ "code": 0, "msg": "success", "request_id": "123456789abcdef", "resp_data": { "item_review_get_response": { "total_results": 1250, "reviews": [ { "id": "9876543210abcdef", "num_iid": "689712345678", "user_nick": "tbNick123456", "user_id": "123456789", "user_level": "V3", "user_vip": true, "content": "纯棉材质很舒服,尺码标准,洗了不缩水,夏天穿透气!", "created": "2025-05-10 14:30:00", "modified": "2025-05-11 09:15:00", "rate": 5, "rate_content": "好评", "has_more": true, "more_content": "穿了一周再来追评,版型宽松不挑身材,搭牛仔裤超好看!", "pic_num": 3, "pic_urls": [ "https://img.alicdn.com/imgextra/i1/123456789/O1CN01abcdef123456_!!0-review.jpg", "https://img.alicdn.com/imgextra/i2/123456789/O1CN01abcdef123457_!!0-review.jpg" ], "spec_info": "颜色:白色;尺寸:L", "useful_vote": 25, "reply": "感谢亲的认可,我们会继续努力做好品质~", "reply_created": "2025-05-10 16:20:00" } ], "request_id": "123456789abcdef" } } }
3.2 核心字段解析
Version: Date:
| 名称 | 类型 | 必须 | 示例值 | 描述 |
|---|---|---|---|---|
| items | items[] | 0 | 商品评论数据 | |
| total_results | Int | 0 | 29058 | 评论总数 |
| totalpage | Int | 0 | 99 | 总页数 |
| page_size | Int | 0 | 10 | 接口返回数量 |
| page | String | 0 | 80 | 页码 |
| item | item[] | 0 | ||
| rate_content | String | 0 | 此用户没有填写评论! | 内容 |
| rate_date | Date | 0 | 2024-12-22 20:58:43 | 日期 |
| pics | Mix | 0 | 图片 | |
| display_user_nick | String | 0 | 2***飘 | 买家昵称 |
| auction_sku | String | 0 | 尺码:NB | 商品属性 |
| add_feedback | String | 0 | 挺好的 | 追评内容 |
| add_feedback_images | Mix | 0 | 追评图片 | |
| video | String | 0 | 视频地址 |