以下是使用Python采集淘宝商品评论API的完整代码示例,包含接口调用、JSON数据解析及错误处理:
1. 准备工作
关注博主注册账号
创建应用获取
App Key
和App Secret
安装依赖库:
pip install requests
2. 完整代码实现
pythonimport requests import hashlib import time import json from urllib.parse import quote
class TaobaoReviewsAPI: def __init__(self, app_key, app_secret): self.app_key = app_key self.app_secret = app_secret self.api_url = "https://gw.api.taobao.com/router/rest"
def _generate_sign(self, params): """生成MD5签名""" sorted_params = sorted(params.items(), key=lambda x: x[0]) sign_str = self.app_secret for k, v in sorted_params: if k != 'sign': sign_str += f"{k}{v}" sign_str += self.app_secret return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()
def get_reviews(self, item_id, page_no=1, page_size=20, rate_type=None): """ 获取商品评论 :param item_id: 商品ID :param page_no: 页码 :param page_size: 每页数量(1-100) :param rate_type: 评论类型(good/neutral/bad) :return: JSON格式评论数据 """ params = { 'method': 'taobao.item.reviews.get', 'app_key': self.app_key, 'timestamp': time.strftime('%Y-%m-%d %H:%M:%S'), 'format': 'json', 'v': '2.0', 'sign_method': 'md5', 'item_id': str(item_id), 'page_no': str(page_no), 'page_size': str(page_size) }
if rate_type: params['rate_type'] = rate_type
# 生成签名 params['sign'] = self._generate_sign(params)
try: response = requests.get(self.api_url, params=params) response.raise_for_status() result = response.json()
# 检查API错误 if 'error_response' in result: error_msg = result['error_response'].get('msg', 'Unknown error') raise Exception(f"API Error: {error_msg}")
return result.get('item_reviews_get_response', {})
except requests.exceptions.RequestException as e: raise Exception(f"HTTP请求失败: {str(e)}") except json.JSONDecodeError: raise Exception("返回数据解析失败")
# 使用示例 if __name__ == "__main__": # 替换为你的实际App Key和Secret APP_KEY = "your_app_key" APP_SECRET = "your_app_secret"
api = TaobaoReviewsAPI(APP_KEY, APP_SECRET)
try: # 获取商品ID为123456789的第1页评论(每页10条) reviews_data = api.get_reviews( item_id="123456789", page_no=1, page_size=10, rate_type="good" # 可选:good/neutral/bad )
# 打印总评论数和前3条评论 print(f"总评论数: {reviews_data.get('total_results', 0)}") reviews = reviews_data.get('reviews', {}).get('review', [])
for i, review in enumerate(reviews[:3], 1): print(f"\n评论{i}:") print(f"用户: {review.get('user', {}).get('nick', '匿名')}") print(f"评分: {review.get('feedback_score', '无')}") print(f"内容: {review.get('feedback', '无内容')}") print(f"时间: {review.get('feedback_date', '未知')}")
# 打印评论图片(如果有) pics = review.get('pics', []) if pics: print("评论图片:") for pic in pics[:2]: # 最多显示2张 print(f" - {pic.get('url', '')}")
# 打印卖家回复(如果有) reply = review.get('reply', None) if reply: print(f"卖家回复: {reply.get('content', '')}")
except Exception as e: print(f"获取评论失败: {str(e)}")
3. 关键说明
签名生成
必须按照淘宝API要求的顺序对参数排序
签名公式:
MD5(secret + 参数1值 + 参数2值 + ... + secret)
返回数据结构
成功响应示例:json{"item_reviews_get_response": {"total_results": 1256,"reviews": {"review": [{"user": {"nick": "买***家"},"feedback": "质量很好,物流快","feedback_score": "5","feedback_date": "2025-03-25","pics": [{"url": "http://img.alicdn.com/xxx.jpg"}],"reply": {"content": "感谢您的支持"}}]}}}
错误处理
HTTP错误(如403/500)
API返回的业务错误(如参数错误)
JSON解析错误
注意事项
免费版API有调用频率限制(通常100次/分钟)
用户昵称可能被脱敏处理(如"买***家")
图片URL需要添加
http:
前缀(部分接口返回相对路径)
4. 高级用法建议
分页采集
pythondef get_all_reviews(item_id, max_pages=5):all_reviews = []for page in range(1, max_pages + 1):data = api.get_reviews(item_id, page_no=page)reviews = data.get('reviews', {}).get('review', [])if not reviews:breakall_reviews.extend(reviews)return all_reviews
数据存储
建议将结果保存为JSON文件或导入数据库:pythonimport pandas as pd # 转换为DataFrame df = pd.json_normalize(reviews_data['reviews']['review']) df.to_csv("taobao_reviews.csv", index=False, encoding='utf_8_sig') 代理设置(如需)
pythonproxies = {"http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080"}response = requests.get(url, params=params, proxies=proxies)
如需采集大量数据,建议:
添加随机延迟(
time.sleep(random.uniform(1, 3))
)实现自动重试机制
使用分布式任务队列(如Celery)