×

Python采集淘宝评论API接口,json数据返回

访客 访客 发表于2025-09-03 15:54:33 浏览52 评论0

抢沙发发表评论

以下是使用Python采集淘宝商品评论API的完整代码示例,包含接口调用、JSON数据解析及错误处理:

1. 准备工作

  • 关注博主注册账号

  • 创建应用获取App KeyApp Secret

  • 安装依赖库:pip install requests

2. 完整代码实现

python
import 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. 关键说明

  1. 签名生成

    • 必须按照淘宝API要求的顺序对参数排序

    • 签名公式:MD5(secret + 参数1值 + 参数2值 + ... + secret)

  2. 返回数据结构
    成功响应示例:

    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": "感谢您的支持"}}]}}}
  3. 错误处理

    • HTTP错误(如403/500)

    • API返回的业务错误(如参数错误)

    • JSON解析错误

  4. 注意事项

    • 免费版API有调用频率限制(通常100次/分钟)

    • 用户昵称可能被脱敏处理(如"买***家")

    • 图片URL需要添加http:前缀(部分接口返回相对路径)

4. 高级用法建议

  1. 分页采集

    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
  2. 数据存储
    建议将结果保存为JSON文件或导入数据库:

    python
    import pandas as pd

    # 转换为DataFrame
    df = pd.json_normalize(reviews_data['reviews']['review'])
    df.to_csv("taobao_reviews.csv", index=False, encoding='utf_8_sig')
  3. 代理设置(如需)

    pythonproxies = {"http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080"}response = requests.get(url, params=params, proxies=proxies)

如需采集大量数据,建议:

  1. 添加随机延迟(time.sleep(random.uniform(1, 3))

  2. 实现自动重试机制

  3. 使用分布式任务队列(如Celery)


群贤毕至

访客