一、分页策略:高效获取全量评论
- 核心参数
page_no(页码):从1开始,每页返回20-100条评论(默认20条,最大100条)。page_size(每页条数):建议设置为100(最大值),减少总请求次数。rate_type(评分类型):可选1(好评)、2(中评)、3(差评),或空值(全部)。time_range(时间范围):部分API支持按start_time和end_time筛选,避免获取过期数据。
- 分页实现逻辑
- 步骤1:首次请求获取总评论数(
total_reviews)。 - 步骤2:计算总页数(
total_pages = ceil(total_reviews / page_size))。 - 步骤3:循环请求每一页,直到
page_no > total_pages。
- 示例代码(Python):
python import math import requests def get_all_comments(item_id, app_key, app_secret): base_url = "https://eco.taobao.com/router/rest" params = { "method": "taobao.item.reviews.get", "app_key": app_key, "num_iid": item_id, "page_no": 1, "page_size": 100, "format": "json", "v": "2.0", "timestamp": "2025-11-10 14:30:00" # 动态生成 } # 生成签名(需按淘宝规则排序参数并加密) params["sign"] = generate_sign(params, app_secret) response = requests.get(base_url, params=params).json() if response["code"] != "200": raise Exception(f"API Error: {response.get('msg')}") total_reviews = response["item_reviews_get_response"]["total_reviews"] total_pages = math.ceil(total_reviews / 100) all_comments = [] for page in range(1, total_pages + 1): params["page_no"] = page params["sign"] = generate_sign(params, app_secret) # 重新签名 response = requests.get(base_url, params=params).json() all_comments.extend(response["item_reviews_get_response"]["reviews"]) return all_comments
二、并发控制:平衡速度与稳定性
- 并发限制
- 淘宝API限制:免费版每日500次调用,企业版可申请提额;单IP请求频率建议≤5次/秒。
- 超限后果:触发风控(返回403错误)或账号封禁。
- 并发优化方案
- 方案1:异步队列(推荐)使用
Celery + RabbitMQ或Kafka分发任务,避免同步阻塞。示例流程:
- 将商品ID列表拆分为任务,存入消息队列。
- 消费者从队列中取出任务,调用API并存储结果。
- 通过
Redis缓存已处理商品ID,避免重复请求。
- 方案2:多线程/协程(Python示例)
使用asyncio + aiohttp实现异步请求,单机并发量提升10倍。
python import asyncio import aiohttp async def fetch_comments(item_id, session, app_key, app_secret): url = "https://eco.taobao.com/router/rest" params = { "method": "taobao.item.reviews.get", "app_key": app_key, "num_iid": item_id, "page_no": 1, "page_size": 100, "format": "json", "v": "2.0" } params["sign"] = generate_sign(params, app_secret) # 需实现签名函数 async with session.get(url, params=params) as response: return await response.json() async def main(item_ids, app_key, app_secret): async with aiohttp.ClientSession() as session: tasks = [fetch_comments(item_id, session, app_key, app_secret) for item_id in item_ids] results = await asyncio.gather(*tasks) return results # 调用示例 item_ids = ["123456789", "987654321"] comments = asyncio.run(main(item_ids, "YOUR_APP_KEY", "YOUR_APP_SECRET"))
- 动态限流
- 随机延迟:为每个请求添加0.5-2秒随机延迟,避免触发风控。
- 本地缓存:使用
LRU缓存存储最近访问的商品评论(30分钟过期)。
三、频率优化:合规与效率兼顾
- 频率限制规则
- 单IP限制:≤5次/秒(建议值),总并发≤1000次/秒(需分布式部署)。
- 企业版提额:联系淘宝开放平台申请更高调用配额。
- 优化策略
- 批量处理:优先获取热门商品评论,冷门商品可降低频率。
- 时间窗口分配:将请求分散到不同时间段(如每小时处理总量的1/24)。
- 代理IP池:使用动态住宅代理(如BrightData)轮换IP,规避单IP限制。
- 监控与降级
- 实时监控:通过
Prometheus + Grafana监控API成功率、延迟。 - 熔断机制:当错误率≥10%时,自动切换至缓存数据或暂停请求。
四、合规与安全要点
- 数据脱敏
- 用户昵称、头像等字段需脱敏处理(如“用户******”)。
- 禁止存储用户手机号、地址等敏感信息。
- 声明数据来源
- 在应用页面标注“评论数据来源:淘宝平台”,避免法律风险。
- 错误处理
- 捕获API返回的错误码(如
40001签名错误、30001权限不足),并重试或降级。
五、推荐工具链
| 工具类型 | 推荐方案 |
| 代理服务 | Smartproxy、IPRoyal |
| 监控 | Prometheus + Grafana |
| 数据分析 | ELK(Elasticsearch+Logstash+Kibana) |
| 异步任务 | Celery + RabbitMQ/Kafka |