用第三方爬虫调用「淘宝评论 API」全流程实战

更新:2025-12-22

关键词:taobao.item_review、第三方 API、Java、Python、反爬、代理池


一、为什么选"第三方"而不是官方 TOP 接口

  1. 官方 taobao.item.comment.get 需要入驻聚石塔、缴纳保证金,个人开发者很难申请。

  2. 第三方数据商已把淘宝散落在 rate.tmall.comh5api.m.taobao.com 等端点的评论数据重新封装成 REST,无需 OAuth、即调即用

  3. 字段更全:官方接口最多 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
    &timestamp=2025-12-22 14:23:45
    &item_id=723849234892
    &page=1
    &page_size=100
    &sort=1  (0=默认,1=最新)
    &sign=生成的MD5签名

3. 签名算法(与官方 TOP 完全一致)

python 复制代码
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. 完整代码(含自动分页、异常退避)

python 复制代码
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)

java 复制代码
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 保持一致,此处省略。


五、反爬与合规要点

  1. 频率:第三方 QPS 一般给 10 次/秒,建议压到 5 次/秒以内;晚上 0 点--6 点淘宝风控最严,可降速 30%。

  2. 代理:免费代理存活率 15%,可用阿布云/快代理隧道,失败重试 3 次后剔除

  3. 缓存:评论 24 h 内重复率 < 5%,可 Redis 缓存 6 h,减少 60% 调用量。

  4. 合规:

    • 不采集匿名头像、买家昵称打码后的明文;

    • 不落地用户 uid、手机号、地址等隐私;

    • 不向第三方再售原始评论文本,可做聚类、情感值后脱敏输出。


六、常见错误码速查

代码 含义 处理
10001 sign 错误 检查参数是否升序、URL 编码
10021 余额不足 充点数或降频
10031 item_id 无效 商品下架/ID 拼错
10041 频率超限 降 QPS、加代理池
10051 接口维护 sleep 30 s 退避

七、小结

借助第三方封装好的「taobao.item_review」接口,5 行代码即可拉出 10 万条评论 ,再叠加代理池、退避重试、本地缓存三板斧,就能在 1 小时内完成竞品好评率、关键词云、SKU 维度的满意度统计。相比自己破解网页 JSONP,这种方案开发快、风险低、字段全,已成为电商数据分析团队的主流选择。

如遇任何疑问或有进一步的需求,请随时与我私信或者评论联系

相关推荐
故事不长丨1 小时前
C#正则表达式完全攻略:从基础到实战的全场景应用指南
开发语言·正则表达式·c#·regex
哈库纳玛塔塔2 小时前
放弃 MyBatis,拥抱新一代 Java 数据访问库
java·开发语言·数据库·mybatis·orm·dbvisitor
phltxy2 小时前
从零入门JavaScript:基础语法全解析
开发语言·javascript
天“码”行空3 小时前
java面向对象的三大特性之一多态
java·开发语言·jvm
odoo中国4 小时前
Odoo 19 模块结构概述
开发语言·python·module·odoo·核心组件·py文件按
代码N年归来仍是新手村成员5 小时前
【Java转Go】即时通信系统代码分析(一)基础Server 构建
java·开发语言·golang
Z1Jxxx5 小时前
01序列01序列
开发语言·c++·算法
沐知全栈开发5 小时前
C语言中的强制类型转换
开发语言
关于不上作者榜就原神启动那件事6 小时前
Java中大量数据Excel导入导出的实现方案
java·开发语言·excel
坚定学代码6 小时前
基于观察者模式的ISO C++信号槽实现
开发语言·c++·观察者模式·ai