淘宝 item_get_pro 接口调用完整示例代码
一、接口调用准备工作
在调用淘宝 item_get_pro 接口前,需要完成以下准备:
- 注册淘宝开放平台账号并完成企业认证或第三方数据服务商
- 创建应用获取
app_key和app_secret - 在应用中申请
item_get_pro接口权限 - 安装 Python 开发环境及依赖库
二、完整调用示例代码
以下是使用 Python 调用淘宝 item_get_pro 接口的完整示例,包含签名生成、接口调用、数据解析及异常处理:
import time
import hashlib
import requests
import json
import random
from urllib.parse import urlencode
class TaobaoItemGetPro:
def __init__(self, app_key, app_secret):
"""初始化淘宝接口调用客户端"""
# 假设 API 接口地址 API url=o0b.cn/ibrad 复制链接获取测试
self.app_key = app_key
self.app_secret = app_secret
self.base_url = "https://api.taobao.com/router/rest"
self.session = requests.Session()
self.session.headers = {
"Content-Type": "application/x-www-form-urlencoded",
"User-Agent": self._get_random_user_agent()
}
def _get_random_user_agent(self):
"""生成随机User-Agent,模拟不同设备"""
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0",
"Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1"
]
return random.choice(user_agents)
def _generate_sign(self, params):
"""生成API请求签名(HMAC-SHA256算法)"""
# 排序参数
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 拼接字符串
sign_str = self.app_secret
for key, value in sorted_params:
sign_str += f"{key}{value}"
sign_str += self.app_secret
# 计算签名
return hashlib.sha256(sign_str.encode()).hexdigest()
def _get_timestamp(self):
"""获取当前时间戳(格式:YYYY-MM-DD HH:MM:SS)"""
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
def call(self, item_id, fields=None):
"""调用item_get_pro接口获取商品详情"""
# 构建基础参数
params = {
"method": "taobao.item_get_pro",
"app_key": self.app_key,
"timestamp": self._get_timestamp(),
"format": "json",
"v": "2.0",
"item_id": item_id,
"platform": "1", # 1=淘宝,2=天猫
"lang": "zh-Hans"
}
# 添加字段筛选参数
if fields:
params["fields"] = ",".join(fields)
# 生成签名
params["sign"] = self._generate_sign(params)
# 打印请求参数(调试用)
print(f"请求参数: {params}")
# 随机延迟,避免频繁请求
time.sleep(random.uniform(1, 3))
try:
# 发送请求
response = self.session.post(
self.base_url,
data=urlencode(params),
timeout=10
)
# 解析响应
if response.status_code == 200:
result = response.json()
print(f"响应结果: {result}")
return result
else:
print(f"请求失败,状态码: {response.status_code}")
return {"error": f"请求失败,状态码: {response.status_code}"}
except Exception as e:
print(f"调用接口异常: {str(e)}")
return {"error": f"调用接口异常: {str(e)}"}
def parse_response(self, response):
"""解析接口响应数据"""
if "error_response" in response:
error = response["error_response"]
return {"error": f"接口错误,code: {error.get('code')}, msg: {error.get('msg')}"}
if "item" not in response:
return {"error": "响应数据格式异常,未找到item字段"}
item = response["item"]
result = {
"item_id": item.get("item_id"),
"title": item.get("title"),
"main_image": item.get("pic_url"),
"detail_images": item.get("item_imgs", []),
"video": {
"url": item.get("video", {}).get("video_url"),
"cover": item.get("video", {}).get("cover_url")
},
"sku_list": [],
"spec_params": item.get("item_params", {})
}
# 解析SKU数据
for sku in item.get("sku_info", []):
result["sku_list"].append({
"sku_id": sku.get("sku_id"),
"properties": sku.get("sku_properties"),
"price": float(sku.get("sku_price", 0)),
"stock": int(sku.get("sku_stock", 0)),
"images": sku.get("sku_images", []),
"params": sku.get("sku_params", {})
})
return result
# 使用示例
if __name__ == "__main__":
# 替换为实际的app_key和app_secret
app_key = "你的_app_key"
app_secret = "你的_app_secret"
# 替换为实际的商品ID
item_id = "68754321" # 示例商品ID,需替换为真实ID
# 初始化客户端
client = TaobaoItemGetPro(app_key, app_secret)
# 定义需要获取的字段
fields = [
"item_id,title,pic_url",
"video,item_imgs",
"sku_images,sku_properties",
"sku_prices,sku_stocks",
"item_params"
]
# 调用接口
response = client.call(item_id, fields)
# 解析响应
parsed_data = client.parse_response(response)
# 打印结果
print("\n===== 商品基本信息 =====")
print(f"商品ID: {parsed_data.get('item_id')}")
print(f"商品标题: {parsed_data.get('title')}")
print(f"主图链接: {parsed_data.get('main_image')}")
print(f"详情图数量: {len(parsed_data.get('detail_images'))}")
print("\n===== 商品视频信息 =====")
video = parsed_data.get("video")
print(f"视频链接: {video.get('url')}")
print(f"视频封面: {video.get('cover')}")
print("\n===== SKU信息 =====")
sku_list = parsed_data.get("sku_list")
print(f"SKU数量: {len(sku_list)}")
if sku_list:
first_sku = sku_list[0]
print(f"示例SKU - 属性: {first_sku.get('properties')}")
print(f"示例SKU - 价格: ¥{first_sku.get('price')}")
print(f"示例SKU - 库存: {first_sku.get('stock')}")
print(f"示例SKU - 图片数量: {len(first_sku.get('images'))}")
print("\n===== 产品规格参数 =====")
spec_params = parsed_data.get("spec_params")
for key, value in spec_params.items():
print(f"{key}: {value}")
三、代码功能解析
上述代码实现了淘宝 item_get_pro 接口的完整调用流程,主要包含以下功能模块:
-
初始化与配置模块:
- 设置淘宝开放平台的基本参数
- 生成随机 User-Agent 以应对反爬
- 配置请求会话与请求头
-
签名生成模块:
- 实现 HMAC-SHA256 签名算法
- 对请求参数进行排序和拼接
- 生成符合淘宝要求的签名参数
-
接口调用模块:
- 构建完整的请求参数
- 发送 HTTP POST 请求
- 处理响应数据和异常情况
-
数据解析模块:
- 解析 JSON 响应数据
- 提取主图、视频、SKU 等关键信息
- 格式化数据结构
-
反爬应对模块:
- 随机请求延迟(1-3 秒)
- 随机 User-Agent 轮换
- 错误重试机制(代码中可扩展)
四、使用说明与注意事项
-
参数替换:
- 将代码中的
你的_app_key和你的_app_secret替换为实际申请的 AppKey 和 AppSecret - 将
item_id = "68754321"中的商品 ID 替换为需要查询的真实商品 ID
- 将代码中的
-
字段筛选:
- 可通过
fields参数自定义需要获取的字段 - 支持的字段包括:
item_id、title、pic_url、video、item_imgs、sku_images、sku_properties、sku_prices、sku_stocks、item_params等
- 可通过
-
接口权限:
- 调用前需确保应用已申请
item_get_pro接口权限
- 调用前需确保应用已申请
-
异常处理:
-
代码中包含基本的异常处理逻辑
-
实际应用中可扩展错误码处理,如:
40001:参数错误,检查商品 ID 格式46001:权限不足,确认应用权限42901:请求频率超限,增加请求间隔
-
五、进阶功能扩展
-
缓存机制:
import redis import pickle redis_client = redis.Redis(host='localhost', port=6379, db=0) CACHE_TTL = 86400 # 缓存有效期24小时 def cached_call(self, item_id, fields=None): cache_key = f"taobao_item_pro:{item_id}" cached_data = redis_client.get(cache_key) if cached_data: return pickle.loads(cached_data) result = self.call(item_id, fields) if result and not result.get("error"): redis_client.setex(cache_key, CACHE_TTL, pickle.dumps(result)) return result -
批量调用:
import asyncio from aiohttp import ClientSession async def batch_call(items): client = TaobaoItemGetPro(app_key, app_secret) async with ClientSession() as session: client.session = session tasks = [client.call(item_id) for item_id in items] results = await asyncio.gather(*tasks) return results
通过以上代码示例,您可以快速实现淘宝 item_get_pro 接口的调用,获取商品主图、视频、SKU 图片、SKU 价格、产品规格等详细信息,为电商数据分析、商品库建设等业务提供数据支持。