你需要的是一个基于 Python 的淘宝商品评论合规采集方案(通过阿里开放平台官方 API),该方案能调用淘宝官方评论接口并返回 JSON 格式数据,同时包含完整的签名认证、请求发送和数据解析逻辑。
一、核心前提:淘宝评论 API 的合规接入基础
淘宝 / 天猫的商品评论数据,无公开免费的通用 API,合规获取需通过 开放平台(o0b.cn/anzexi) 完成以下准备:
- 账号认证:注册企业开发者账号并完成企业认证(个人账号无评论接口权限)。
- 权限申请:申请
taobao.tmall.review.get(天猫评论)或taobao.item.review.get(淘宝评论)接口权限(仅对店铺商家开放,需绑定自有店铺)。 - 密钥获取:审核通过后获取
appkey、appsecret、sessionkey(用户授权令牌)。 - 环境依赖:安装核心依赖库bash
运行
pip install requests pycryptodome # pycryptodome用于淘宝签名加密
二、完整 Python 代码示例(合规调用淘宝评论 API)
该代码严格遵循阿里开放平台的签名规则,调用官方 API 获取评论数据并返回 JSON 格式结果:
python
运行
import requests import time import json import hashlib import hmac from urllib.parse import urlencode, quote from typing import Dict, Any class TaobaoCommentAPI: """淘宝开放平台评论API合规调用类""" def __init__(self, appkey: str, appsecret: str, sessionkey: str): self.appkey = appkey self.appsecret = appsecret self.sessionkey = sessionkey # 淘宝开放平台网关地址 self.api_url = "https://eco.taobao.com/router/rest" def _generate_sign(self, params: Dict[str, Any]) -> str: """ 生成淘宝API签名(HMAC-MD5算法) :param params: 请求参数字典 :return: 签名字符串 """ # 1. 按参数名ASCII升序排序 sorted_params = sorted(params.items(), key=lambda x: x[0]) # 2. 拼接为key=value格式(value需URL编码) sign_str = "" for k, v in sorted_params: sign_str += f"{k}{quote(str(v), safe='')}" # 3. 拼接appsecret并做HMAC-MD5加密 sign = hmac.new( self.appsecret.encode("utf-8"), sign_str.encode("utf-8"), hashlib.md5 ).hexdigest().upper() return sign def get_taobao_comment(self, item_id: str, page_no: int = 1, page_size: int = 20) -> Dict[str, Any]: """ 调用淘宝商品评论API(仅自有店铺商品) :param item_id: 商品ID(必须是自有店铺商品) :param page_no: 页码,默认1 :param page_size: 每页条数,默认20(官方限制≤20) :return: JSON格式的评论数据 """ # 1. 构造基础请求参数 params = { "method": "taobao.item.review.get", # 淘宝评论接口方法名 "app_key": self.appkey, "session": self.sessionkey, "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "format": "json", # 指定返回格式为JSON "v": "2.0", # API版本 "sign_method": "hmac", # 签名方式 "item_id": item_id, "page_no": page_no, "page_size": page_size } # 2. 生成签名并添加到参数 params["sign"] = self._generate_sign(params) try: # 3. 发送GET请求(淘宝API以GET为主) response = requests.get(self.api_url, params=params, timeout=15) response.raise_for_status() # 抛出HTTP状态码异常 # 4. 解析JSON响应并返回 result = response.json() return result except requests.exceptions.HTTPError as e: return {"error": f"HTTP错误: {e}", "status_code": response.status_code} except requests.exceptions.Timeout: return {"error": "请求超时", "status_code": 408} except json.JSONDecodeError: return {"error": "返回数据非JSON格式", "response_text": response.text} except Exception as e: return {"error": f"未知错误: {str(e)}"} def get_tmall_comment(self, item_id: str, page_no: int = 1, page_size: int = 20) -> Dict[str, Any]: """ 调用天猫商品评论API(适配天猫店铺) :param item_id: 天猫商品ID :param page_no: 页码 :param page_size: 每页条数 :return: JSON格式的评论数据 """ params = { "method": "taobao.tmall.review.get", # 天猫评论接口方法名 "app_key": self.appkey, "session": self.sessionkey, "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "format": "json", "v": "2.0", "sign_method": "hmac", "item_id": item_id, "page_no": page_no, "page_size": page_size } params["sign"] = self._generate_sign(params) try: response = requests.get(self.api_url, params=params, timeout=15) response.raise_for_status() return response.json() except Exception as e: return {"error": f"天猫评论接口调用失败: {str(e)}"} # -------------------------- 调用示例 -------------------------- if __name__ == "__main__": # 替换为你自己的认证信息(务必保密,禁止硬编码到公开代码) APP_KEY = "你的淘宝appkey" APP_SECRET = "你的淘宝appsecret" SESSION_KEY = "你的sessionkey" # 初始化API客户端 taobao_api = TaobaoCommentAPI(APP_KEY, APP_SECRET, SESSION_KEY) # 调用淘宝评论接口(替换为自有店铺的商品ID) taobao_item_id = "1234567890" # 淘宝商品ID taobao_comment_data = taobao_api.get_taobao_comment( item_id=taobao_item_id, page_no=1, page_size=20 ) # 打印JSON格式返回数据(格式化输出) print("淘宝评论API返回JSON数据:") print(json.dumps(taobao_comment_data, ensure_ascii=False, indent=4)) # 解析核心评论数据(示例) if "item_review_get_response" in taobao_comment_data: reviews = taobao_comment_data["item_review_get_response"].get("reviews", {}).get("review", []) print(f"\n解析出{len(reviews)}条淘宝评论:") for idx, review in enumerate(reviews, 1): print(f"第{idx}条:") print(f" 评论内容:{review.get('content', '无')}") print(f" 评分:{review.get('star', 0)}星") print(f" 评论时间:{review.get('created', '无')}") # 调用天猫评论接口(可选) # tmall_item_id = "9876543210" # tmall_comment_data = taobao_api.get_tmall_comment(item_id=tmall_item_id) # print("\n天猫评论API返回JSON数据:") # print(json.dumps(tmall_comment_data, ensure_ascii=False, indent=4))
三、代码核心说明
- 签名生成:
_generate_sign方法严格遵循淘宝 API 的 HMAC-MD5 签名规则,这是 API 调用成功的核心(签名错误会返回invalid-signature错误)。 - 接口差异:
- 淘宝商品用
taobao.item.review.get接口。 - 天猫商品用
taobao.tmall.review.get接口。 - 两个接口参数基本一致,仅
method字段不同。
- 参数限制:
page_size:官方限制单页最多 20 条,超出会被截断。item_id:必须是绑定店铺的自有商品 ID,跨店铺调用会返回权限错误。
- JSON 返回格式:接口返回的原始数据为标准 JSON,代码中通过
response.json()直接解析,并提供了核心字段(评论内容、评分、时间)的提取示例。
四、关键合规与技术注意事项
- 权限限制:
- 仅企业商家可申请评论接口权限,个人开发者无权限。
- 仅能获取自有店铺商品的评论,无法获取其他店铺商品评论。
- 调用频率:
- 基础权限默认 QPS=2,单日调用次数≤1000 次,超额会触发
request-limited错误。 - 如需提额,需向阿里开放平台提交业务场景说明和提额申请。
- 敏感信息保护:
appkey/appsecret/sessionkey是核心凭证,禁止硬编码,建议通过环境变量读取(如os.getenv("TAOBAO_APP_KEY"))。sessionkey有有效期(通常 30 天),需定期刷新。
- 数据合规:
- 获取的评论数据仅可用于自有店铺运营分析,禁止转售、公开或用于竞品分析。
- 需遵守《淘宝开放平台服务协议》和《个人信息保护法》,对用户昵称、ID 等隐私数据进行脱敏处理。
五、非合规爬虫的风险提示(重要)
市面上的淘宝评论爬虫(基于网页 / APP 接口逆向)存在以下风险:
- 法律风险:违反《反不正当竞争法》和淘宝用户协议,可能面临账号封禁、法律追责。
- 技术风险:淘宝的反爬策略(滑块验证、设备指纹、IP 封禁)会导致爬虫频繁失效。
- 数据风险:逆向获取的数据可能包含脏数据,且无合规授权,商用会引发法律纠纷。
总结
- 该示例是基于阿里开放平台官方 API 的合规采集方案,核心是通过签名认证调用官方接口,而非违规爬虫。
- 代码实现了淘宝 / 天猫评论 API 的完整调用流程,可直接替换认证信息和商品 ID 使用。
- 必须严格遵守阿里开放平台的权限规则和数据使用规范,仅采集自有店铺商品评论,避免法律和技术风险。