淘宝 item_get_pro 接口调用完整示例代码

54 阅读5分钟

淘宝 item_get_pro 接口调用完整示例代码

一、接口调用准备工作

在调用淘宝 item_get_pro 接口前,需要完成以下准备:

  1. 注册淘宝开放平台账号并完成企业认证或第三方数据服务商
  2. 创建应用获取app_keyapp_secret
  3. 在应用中申请item_get_pro接口权限
  4. 安装 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 接口的完整调用流程,主要包含以下功能模块:

  1. 初始化与配置模块

    • 设置淘宝开放平台的基本参数
    • 生成随机 User-Agent 以应对反爬
    • 配置请求会话与请求头
  2. 签名生成模块

    • 实现 HMAC-SHA256 签名算法
    • 对请求参数进行排序和拼接
    • 生成符合淘宝要求的签名参数
  3. 接口调用模块

    • 构建完整的请求参数
    • 发送 HTTP POST 请求
    • 处理响应数据和异常情况
  4. 数据解析模块

    • 解析 JSON 响应数据
    • 提取主图、视频、SKU 等关键信息
    • 格式化数据结构
  5. 反爬应对模块

    • 随机请求延迟(1-3 秒)
    • 随机 User-Agent 轮换
    • 错误重试机制(代码中可扩展)

四、使用说明与注意事项

  1. 参数替换

    • 将代码中的你的_app_key你的_app_secret替换为实际申请的 AppKey 和 AppSecret
    • item_id = "68754321"中的商品 ID 替换为需要查询的真实商品 ID
  2. 字段筛选

    • 可通过fields参数自定义需要获取的字段
    • 支持的字段包括:item_idtitlepic_urlvideoitem_imgssku_imagessku_propertiessku_pricessku_stocksitem_params
  3. 接口权限

    • 调用前需确保应用已申请item_get_pro接口权限
  4. 异常处理

    • 代码中包含基本的异常处理逻辑

    • 实际应用中可扩展错误码处理,如:

      • 40001:参数错误,检查商品 ID 格式
      • 46001:权限不足,确认应用权限
      • 42901:请求频率超限,增加请求间隔

五、进阶功能扩展

  1. 缓存机制

    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
    
  2. 批量调用

    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 价格、产品规格等详细信息,为电商数据分析、商品库建设等业务提供数据支持。