以下是基于淘宝开放平台API的Python商品详情采集深度指南,包含完整技术实现与合规注意事项:
一、前置条件准备
-
开放平台入驻
- 注册平台账号
- 创建应用获取
app_key和app_secret - 申请
taobao.item.get接口权限(需企业认证)
-
商品ID获取技巧
pythonpython # 从商品链接提取num_iid import re url = "https://detail.tmall.com/item.htm?id=68543210987" item_id = re.search(r'id=(\d+)', url).group(1)
二、完整API调用实现(增强版)
python
python
import requests
import hashlib
import time
import json
from urllib.parse import urlparse
class TaobaoAPI:
def __init__(self, app_key, app_secret, sandbox=False):
self.app_key = app_key
self.app_secret = app_secret
self.sandbox = sandbox
self.base_url = "https://gw.api.tbsandbox.com/router/rest" if sandbox else "https://eco.taobao.com/router/rest"
def _generate_sign(self, params):
"""生成符合淘宝规范的MD5签名"""
param_str = "".join(f"{k}{params[k]}" for k in sorted(params.keys()))
sign_str = f"{self.app_secret}{param_str}{self.app_secret}"
return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()
def get_item_detail(self, item_id, fields="num_iid,title,price,pic_url,desc,skus,props_name,quantity"):
"""获取商品详情(含错误重试机制)"""
params = {
'method': 'taobao.item.get',
'app_key': self.app_key,
'timestamp': time.strftime("%Y-%m-%d %H:%M:%S"),
'format': 'json',
'v': '2.0',
'sign_method': 'md5',
'num_iid': item_id,
'fields': fields
}
# 添加签名
params['sign'] = self._generate_sign(params)
# 添加公共参数
params.update(self._get_common_params())
try:
response = requests.get(self.base_url, params=params, timeout=5)
response.raise_for_status()
return response.json()
except (requests.exceptions.RequestException, KeyError) as e:
return self._handle_error(e, item_id)
def _get_common_params(self):
"""获取公共请求参数"""
return {
'partner_id': 'open-api-sdk',
'target_app_key': '12345678', # 替换为目标APPKEY
'sdk_version': '2.0',
'simplify': 'false'
}
def _handle_error(self, error, item_id):
"""错误处理与重试逻辑"""
if isinstance(error, requests.exceptions.Timeout):
return {"error": "Request timeout"}
elif 'code' in str(error):
error_code = json.loads(error).get('error_response', {}).get('code')
return self._map_error_code(error_code, item_id)
return {"error": str(error)}
def _map_error_code(self, code, item_id):
"""错误码映射处理"""
error_map = {
11: "API权限不足,请检查应用权限",
27: f"商品不存在或无权限访问: {item_id}",
100: "参数错误,请检查请求参数",
10001: "系统内部错误,请重试"
}
return {"error": error_map.get(code, "未知错误")}
# 使用示例
if __name__ == "__main__":
APP_KEY = "YOUR_APP_KEY"
APP_SECRET = "YOUR_APP_SECRET"
ITEM_ID = "68543210987"
taobao = TaobaoAPI(APP_KEY, APP_SECRET)
result = taobao.get_item_detail(ITEM_ID)
# 解析响应数据
if 'error' not in result:
item_data = result['taobao_item_get_response']['item']
print(f"商品标题: {item_data['title']}")
print(f"价格: ¥{item_data['price']}")
print(f"主图: {item_data['pic_url']}")
# 处理SKU数据
skus = item_data.get('skus', {}).get('sku', [])
for sku in skus:
print(f"规格: {sku['properties']} | 价格: {sku['price']} | 库存: {sku['quantity']}")
else:
print(f"错误信息: {result['error']}")
三、关键技术细节解析
-
签名算法优化
- 采用参数名排序+值拼接的MD5加密方式
- 示例签名串:
secretkeyapp_key12345fieldsnum_iid,titleformatjsonmethodtaobao.item.getnum_iid123456timestamp2025-10-28 12:00:00v2.0secretkey
-
字段选择策略
- 基础字段:
num_iid,title,price,pic_url - 扩展字段:
desc(详情描述)、props_name(属性名)、quantity(库存) - 规格数据:通过
skus字段获取多规格商品信息
- 基础字段:
-
错误处理增强
- 网络请求超时重试机制
- 错误码映射系统(如11→权限不足,27→商品不存在)
- 沙箱环境测试支持
四、合规与反爬策略
-
频率控制
pythonpython # 请求间隔控制示例 import time def safe_request(item_id): time.sleep(0.2) # 5秒内不超过25次请求 return taobao.get_item_detail(item_id) -
**User-Agent设置
inipython headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } -
IP代理轮换
- 建议使用代理IP池应对高频访问限制
- 可集成
scrapy-rotating-proxy等中间件
五、数据解析示例
返回JSON典型结构:
json
json
{
"taobao_item_get_response": {
"item": {
"num_iid": "68543210987",
"title": "2025春季新款男士休闲裤",
"price": "129.00",
"pic_url": "https://img.alicdn.com/example.jpg",
"desc": "<img src='...' />商品详细描述",
"skus": {
"sku": [
{
"properties": "颜色:深蓝;尺码:30",
"price": "129.00",
"quantity": 200
},
{
"properties": "颜色:黑色;尺码:32",
"price": "139.00",
"quantity": 150
}
]
}
}
}
}
六、常见问题解决方案
-
权限不足(错误码11)
- 检查应用权限配置
- 确认已申请
taobao.item.get接口 - 联系开放平台客服提升权限
-
商品不存在(错误码27)
- 确认商品ID正确性
- 检查商品是否下架或区域限制
- 验证应用是否有权访问该商品
-
签名验证失败
- 检查时间戳格式(YYYY-MM-DD HH:MM:SS)
- 确认参数排序正确
- 验证app_secret是否泄露