干货!Python采集淘宝商品详情数据,淘宝API接口系列(json数据返回)

以下是基于淘宝开放平台API的Python商品详情采集深度指南,包含完整技术实现与合规注意事项:

一、前置条件准备

  1. 开放平台入驻

    • 注册平台账号
    • 创建应用获取app_keyapp_secret
    • 申请taobao.item.get接口权限(需企业认证)
  2. 商品ID获取技巧

    python 复制代码
    python
    # 从商品链接提取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']}")

三、关键技术细节解析

  1. 签名算法优化

    • 采用参数名排序+值拼接的MD5加密方式
    • 示例签名串:secretkeyapp_key12345fieldsnum_iid,titleformatjsonmethodtaobao.item.getnum_iid123456timestamp2025-10-28 12:00:00v2.0secretkey
  2. 字段选择策略

    • 基础字段:num_iid,title,price,pic_url
    • 扩展字段:desc(详情描述)、props_name(属性名)、quantity(库存)
    • 规格数据:通过skus字段获取多规格商品信息
  3. 错误处理增强

    • 网络请求超时重试机制
    • 错误码映射系统(如11→权限不足,27→商品不存在)
    • 沙箱环境测试支持

四、合规与反爬策略

  1. 频率控制

    python 复制代码
    python
    # 请求间隔控制示例
    import time
    def safe_request(item_id):
        time.sleep(0.2)  # 5秒内不超过25次请求
        return taobao.get_item_detail(item_id)
  2. **User-Agent设置

    ini 复制代码
    python
    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'
    }
  3. 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
          }
        ]
      }
    }
  }
}

六、常见问题解决方案

  1. 权限不足(错误码11)

    • 检查应用权限配置
    • 确认已申请taobao.item.get接口
    • 联系开放平台客服提升权限
  2. 商品不存在(错误码27)

    • 确认商品ID正确性
    • 检查商品是否下架或区域限制
    • 验证应用是否有权访问该商品
  3. 签名验证失败

    • 检查时间戳格式(YYYY-MM-DD HH:MM:SS)
    • 确认参数排序正确
    • 验证app_secret是否泄露
相关推荐
sight-ai15 小时前
OpenRouter vs. SightAI:统一入口,还是统一“智能体验”?
人工智能·开源·大模型·api
用户268001379191 天前
有哪些高效的Python库可以用于解析淘宝评论的JSON数据?
前端·api
一点一木2 天前
火山方舟 Responses API 实战指南:从概念到「公司尽调 Dossier 生成器」
前端·人工智能·api
遥感学习森4 天前
道路提取与道路变化检测算法:技术特性与应用价值解析
api·智能解译提取·解译提取算法·道路提取
RestCloud4 天前
ETLCloud数据集成平台:破解制造业数据困局的智能引擎
api
RestCloud4 天前
一文读懂数据湖、数据仓库与ETL的关系
api
RestCloud5 天前
IDC最新报告:谷云科技iPaaS订阅市场稳居独立厂商第一,市场份额全国第二,仅次于华为!
api
刘欣的博客5 天前
C# 上传票据文件 调用Dify的API完成OCR识别
c#·ocr·api·dify
蓝倾6 天前
小红书item_get接口JSON数据解析指南
api·fastapi