更新:2025-12-22
关键词:taobao.item_review、第三方 API、Java、Python、反爬、代理池
一、为什么选“第三方”而不是官方 TOP 接口
-
官方
taobao.item.comment.get需要入驻聚石塔、缴纳保证金,个人开发者很难申请。 -
第三方数据商已把淘宝散落在
rate.tmall.com、h5api.m.taobao.com等端点的评论数据重新封装成 REST,无需 OAuth、即调即用。 -
字段更全:官方接口最多 20 条/页,第三方可给 100 条/页,且包含追评、晒图、商家回复、点赞数。
二、接口能力速览
| 字段 | 说明 | 类型 |
|---|---|---|
| content | 评论正文 | String |
| star_level | 1-5 星 | Int |
| images[] | 晒图 URL 数组 | List |
| append_comment | 追评内容 | String |
| seller_reply | 商家回复 | String |
| useful_count | 被点赞数 | Int |
| audit_time | 审核通过时间戳 | Long |
| sku_map | 购买时的 SKU 描述 | Map |
三、调用流程(以 Python 为例,Java 版见第五节)
1. 申请 token
第三方平台通常采用「AppKey + Secret」两键制,注册后立刻给:
AppKey: 3a9fb47c2f8d4e0ba2d8a0f7b1c9e4d6
Secret: sk_3f4ca9b2e8d745a1b9c2f0e8d7a5b4c3
2. 拼装请求
GET https://api.xxx.com/taobao/item_review?
app_key=3a9fb47c2f8d4e0ba2d8a0f7b1c9e4d6
×tamp=2025-12-22 14:23:45
&item_id=723849234892
&page=1
&page_size=100
&sort=1 (0=默认,1=最新)
&sign=生成的MD5签名
3. 签名算法(与官方 TOP 完全一致)
def md5_sign(params: dict, secret: str) -> str:
params = {k: v for k, v in params.items() if v}
src = secret + ''.join(f'{k}{v}' for k, v in sorted(params.items())) + secret
return hashlib.md5(src.encode()).hexdigest().upper()
4. 完整代码(含自动分页、异常退避)
import requests, time, random, pandas as pd
from urllib.parse import quote
URL = "https://api.xxx.com/taobao/item_review"
APP_KEY = "3a9fb47c2f8d4e0ba2d8a0f7b1c9e4d6"
APP_SEC = "sk_3f4ca9b2e8d745a1b9c2f0e8d7a5b4c3"
def fetch_one_page(item_id: str, page: int):
params = {
"app_key": APP_KEY,
"timestamp": quote(pd.Timestamp('now').strftime('%Y-%m-%d %H:%M:%S')),
"item_id": item_id,
"page": page,
"page_size": 100,
"sort": 1
}
params["sign"] = md5_sign(params, APP_SEC)
resp = requests.get(URL, params=params, timeout=6)
resp.raise_for_status()
data = resp.json()
if data["code"] != 0:
raise RuntimeError(data["msg"])
return data["data"]
def fetch_all(item_id: str, max_page=50):
page, total = 1, 1
while page <= total and page <= max_page:
try:
block = fetch_one_page(item_id, page)
total = block["total_page"]
yield from block["reviews"]
page += 1
time.sleep(random.uniform(0.8, 2.1)) # 限速
except Exception as e:
print(f"page={page} err={e}, retry 3s later")
time.sleep(3)
if __name__ == "__main__":
reviews = list(fetch_all("723849234892"))
pd.DataFrame(reviews).to_csv("tb_review.csv", index=False)
print("已写入 %d 条评论" % len(reviews))
四、Java 版(OkHttp + Jackson)
public static ReviewPage fetchPage(String itemId, int page) throws Exception {
Map<String, String> params = new TreeMap<>();
params.put("app_key", APP_KEY);
params.put("timestamp", LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
params.put("item_id", itemId);
params.put("page", String.valueOf(page));
params.put("page_size", "100");
params.put("sort", "1");
params.put("sign", md5Sign(params, APP_SEC));
HttpUrl.Builder b = HttpUrl.parse(URL).newBuilder();
params.forEach(b::addQueryParameter);
Request req = new Request.Builder()
.url(b.build())
.header("Accept", "application/json")
.build();
try (Response resp = HTTP_CLIENT.newCall(req).execute()) {
JsonNode root = MAPPER.readTree(resp.body().byteStream());
if (root.get("code").asInt() != 0)
throw new IllegalStateException(root.get("msg").asText());
return MAPPER.convertValue(root.get("data"), ReviewPage.class);
}
}
自动分页逻辑与 Python 保持一致,此处省略。
五、反爬与合规要点
-
频率:第三方 QPS 一般给 10 次/秒,建议压到 5 次/秒以内;晚上 0 点–6 点淘宝风控最严,可降速 30%。
-
代理:免费代理存活率 15%,可用阿布云/快代理隧道,失败重试 3 次后剔除。
-
缓存:评论 24 h 内重复率 < 5%,可 Redis 缓存 6 h,减少 60% 调用量。
-
合规:
-
不采集匿名头像、买家昵称打码后的明文;
-
不落地用户 uid、手机号、地址等隐私;
-
不向第三方再售原始评论文本,可做聚类、情感值后脱敏输出。
-
六、常见错误码速查
| 代码 | 含义 | 处理 |
|---|---|---|
| 10001 | sign 错误 | 检查参数是否升序、URL 编码 |
| 10021 | 余额不足 | 充点数或降频 |
| 10031 | item_id 无效 | 商品下架/ID 拼错 |
| 10041 | 频率超限 | 降 QPS、加代理池 |
| 10051 | 接口维护 | sleep 30 s 退避 |
七、小结
借助第三方封装好的「taobao.item_review」接口,5 行代码即可拉出 10 万条评论,再叠加代理池、退避重试、本地缓存三板斧,就能在 1 小时内完成竞品好评率、关键词云、SKU 维度的满意度统计。相比自己破解网页 JSONP,这种方案开发快、风险低、字段全,已成为电商数据分析团队的主流选择。
如遇任何疑问或有进一步的需求,请随时与我私信或者评论联系。
763

被折叠的 条评论
为什么被折叠?



