×

实战:获取速卖通AliExpress商品详情API接口(item_get)完全指南

admin admin 发表于2025-11-10 17:46:02 浏览21 评论0

抢沙发发表评论

在跨境电商领域,自动化获取商品详情数据是数据分析、价格监控和竞品研究的核心能力。本文将深入实战,详解如何通过速卖通开放平台API接口aliexpress.item.get获取商品详情,并提供可直接运行的Python代码示例。

一、接口概述

速卖通提供了官方商品详情API接口aliexpress.item.get,允许开发者通过编程方式获取商品的完整信息,包括:
  • 基础信息:商品标题、价格、库存、主图URL
  • SKU属性:规格参数、属性图、价格阶梯
  • 物流模板:运费、配送时效、海外仓信息
  • 营销数据:促销标签、历史价格、评价统计
  • 原始数据:带HTML标签的商品描述、隐藏关键词等

二、准备工作

1. 注册开发者账号

访问速卖通开放平台,注册企业开发者账号(需提供营业执照、法人身份证)。个人账号权限受限,无法访问完整商品数据

2. 创建应用并获取密钥

在开放平台创建"跨境数据应用"类型应用,审核通过后获取:
  • App Key:应用唯一标识(如12345678
  • App Secret:签名加密密钥(如a1b2c3d4e5f6
  • Access Token:通过OAuth 2.0授权获取,有效期通常为1年

3. 申请特殊权限

如需获取原始HTML描述、价格波动记录等敏感数据,需额外申请:
  • raw_data_access:获取未清洗的原始数据
  • price_history:访问价格历史记录

4. 安装Python依赖

bash
复制
pip install requests

三、核心调用流程

1. 签名生成(关键步骤)

速卖通API采用HMAC-SHA256签名验证机制,以下是官方推荐的签名生成算法:
Python
复制
import hmacimport hashlibimport urllib.parsefrom collections import OrderedDictdef generate_sign(params: dict, app_secret: str) -> str:
    """
    生成速卖通API签名
    :param params: 请求参数(不包含sign)
    :param app_secret: 应用密钥
    :return: 大写签名字符串
    """
    # 按键名排序
    sorted_params = sorted(params.items(), key=lambda x: x[0])
    
    # 拼接字符串:secret + key1value1 + key2value2...
    sign_content = app_secret + ''.join([f"{k}{v}" for k, v in sorted_params])
    
    # HMAC-SHA256加密并转大写
    sign = hmac.new(
        app_secret.encode('utf-8'),
        sign_content.encode('utf-8'),
        hashlib.sha256    ).hexdigest().upper()
    
    return sign

2. 封装商品详情获取函数

Python
复制
import requestsimport timefrom datetime import datetimedef get_item_detail(item_id: str, app_key: str, app_secret: str, 
                   fields: str = "title,price,image_url,sku_property_list") -> dict:
    """
    获取速卖通商品详情
    :param item_id: 商品ID(如:1005005586923234)
    :param app_key: 应用Key
    :param app_secret: 应用密钥
    :param fields: 需要返回的字段列表
    :return: 商品详情字典
    """
    # API网关地址(根据区域选择)
    url = "https://api-sg.aliexpress.com/sync"  # 新加坡节点
    # url = "https://gw-api.aliexpress.com/router/rest"  # 国内节点
    
    # 构建公共参数
    params = {
        "method": "aliexpress.item.get",
        "app_key": app_key,
        "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        "format": "json",
        "v": "2.0",
        "sign_method": "hmac-sha256",
        "item_id": item_id,
        "fields": fields,
        "language": "zh_CN"
    }
    
    # 生成签名并添加到参数
    params["sign"] = generate_sign(params, app_secret)
    
    try:
        # 发送GET请求
        response = requests.get(url, params=params, timeout=30)
        response.raise_for_status()
        
        # 解析响应
        result = response.json()
        
        # 检查业务错误码
        if "error_response" in result:
            print(f"API调用失败: {result['error_response']['msg']}")
            return None
            
        return result.get("aliexpress_item_get_response", {}).get("item", {})
        
    except requests.exceptions.RequestException as e:
        print(f"网络请求异常: {e}")
        return None
    except json.JSONDecodeError as e:
        print(f"JSON解析失败: {e}")
        return None

3. 典型响应数据解析

接口返回的JSON数据结构如下:
Python
复制
{
  "aliexpress_item_get_response": {
    "item": {
      "title": "Wireless Bluetooth Headphones",
      "price": "19.99",
      "original_price": "29.99",
      "discount_rate": "33",
      "currency_code": "USD",
      "image_url": [
        "https://ae01.alicdn.com/kf/HTB1...jpg",
        "https://ae01.alicdn.com/kf/HTB2...jpg"
      ],
      "sku_property_list": {
        "sku": [
          {
            "sku_id": "14:29#Red",
            "price": "19.99",
            "stock": 1500,
            "property": [
              {"name": "Color", "value": "Red"},
              {"name": "Size", "value": "Standard"}
            ]
          }
        ]
      },
      "desc_html": "<div class=\"product-description\">...</div>",
      "search_keywords": ["bluetooth headphones", "wireless earphones"],
      "shipping_info": {
        "free_shipping": true,
        "delivery_time": "15-30 days"
      }
    }
  }}

四、完整实战示例

Python
复制
# 配置参数APP_KEY = "your_actual_app_key"APP_SECRET = "your_actual_app_secret"ITEM_ID = "1005005586923234"  # 需替换为真实商品IDdef main():
    print("=" * 60)
    print("速卖通商品详情API实战演示")
    print("=" * 60)
    
    # 获取商品详情
    product = get_item_detail(
        item_id=ITEM_ID,
        app_key=APP_KEY,
        app_secret=APP_SECRET,
        fields="title,price,image_url,sku_property_list,desc_html,search_keywords,shipping_info"
    )
    
    if not product:
        print("获取商品信息失败!")
        return
    
    # 数据解析与展示
    print(f"\n【商品标题】 {product.get('title', 'N/A')}")
    print(f"【当前价格】 {product.get('price', 'N/A')} {product.get('currency_code', 'USD')}")
    print(f"【原价】 {product.get('original_price', 'N/A')}")
    print(f"【折扣】 {product.get('discount_rate', '0')}%")
    
    # 解析SKU信息
    sku_list = product.get("sku_property_list", {}).get("sku", [])
    print(f"\n【SKU数量】 {len(sku_list)}")
    for sku in sku_list[:3]:  # 显示前3个SKU
        print(f"  - SKU ID: {sku.get('sku_id')}")
        print(f"    价格: {sku.get('price')}, 库存: {sku.get('stock')}")
    
    # 提取隐藏关键词(SEO优化)
    keywords = product.get("search_keywords", [])
    print(f"\n【隐藏关键词】 {', '.join(keywords)}")
    
    # 解析HTML描述(需BeautifulSoup)
    desc_html = product.get("desc_html", "")
    if desc_html:
        try:
            from bs4 import BeautifulSoup
            soup = BeautifulSoup(desc_html, 'html.parser')
            # 提取参数表
            param_table = soup.find('table', {'class': 'product-parameters'})
            if param_table:
                print("\n【商品参数】")
                print(param_table.text.strip())
        except ImportError:
            print("\n【商品描述】 安装bs4后可解析HTML内容")
    
    print("\n" + "=" * 60)if __name__ == "__main__":
    main()

五、高级实战技巧

1. 原始数据模式(深度分析)

如需获取未清洗的原始数据(含特殊符号、HTML标签),需开启原始模式:
Python
复制
def get_raw_item_detail(item_id: str, app_key: str, app_secret: str):
    """获取原始数据模式商品信息"""
    params = {
        "method": "aliexpress.item.get",
        "app_key": app_key,
        "timestamp": int(time.time()),
        "num_iid": item_id,
        "raw_data": 1,  # 关键参数:返回原始数据
        "lang": "en",   # 保留原始语种
        "cross_border": 1,  # 过滤禁运品
        "sign_method": "hmac-sha256"
    }
    params["sign"] = generate_sign(params, app_secret)
    
    response = requests.get("https://gw-api.aliexpress.com/router/rest", params=params)
    return response.json()
原始数据包含高价值字段:
  • raw_title: 含表情符号的原始标题(如「【New】2025爆款🔥」)
  • desc_html: 完整HTML描述(可提取参数表格)
  • sku_raw: 未翻译的SKU属性(如俄语「цвет:красный」)
  • customs_info: 海关申报信息
  • price_history: 价格波动记录(需特殊权限)

2. 智能缓存策略

避免重复请求,降低API调用成本:
Python
复制
import hashlibimport redis  # 需安装redis库def get_cache_key(item_id: str) -> str:
    """生成缓存键"""
    today = datetime.now().strftime("%Y%m%d")
    return f"aliexpress:item:{hashlib.md5(f'{item_id}{today}'.encode()).hexdigest()}"def get_item_with_cache(item_id: str, app_key: str, app_secret: str):
    """带缓存的商品获取"""
    cache_key = get_cache_key(item_id)
    
    # 尝试从Redis获取缓存
    try:
        r = redis.Redis(host='localhost', port=6379)
        cached_data = r.get(cache_key)
        if cached_data:
            return json.loads(cached_data)
    except:
        pass
    
    # 缓存未命中,调用API
    data = get_item_detail(item_id, app_key, app_secret)
    
    # 存入缓存(有效期24小时)
    if data:
        try:
            r.setex(cache_key, 86400, json.dumps(data))
        except:
            pass
    
    return data

3. 异常监控与IP池切换

应对频率限制和IP封禁:
Python
复制
import randomdef get_item_with_fallback(item_id: str, app_key: str, app_secret: str):
    """支持多IP轮询的请求"""
    # 配置多个API节点
    endpoints = [
        "https://api-sg.aliexpress.com/sync",
        "https://api-us.aliexpress.com/sync",
        "https://gw-api.aliexpress.com/router/rest"
    ]
    
    for endpoint in random.sample(endpoints, len(endpoints)):
        try:
            url = endpoint            # ... 构建参数和签名
            response = requests.get(url, params=params, timeout=15)
            result = response.json()
            
            # 检查错误码
            if "error_response" in result:
                error_code = result["error_response"].get("code")
                if error_code == "1002":  # 频率超限
                    print("触发频率限制,切换节点...")
                    continue
                    
            return result            
        except Exception as e:
            print(f"节点 {endpoint} 请求失败: {e}")
            continue
    
    return None

六、关键注意事项

1. API调用限制

  • 频率限制:默认QPS为10次/秒,日均调用不超过10万次
  • 流量包管理:超出限制将返回错误码1002,需实现指数退避重试
  • 最佳实践:对商品ID+日期做哈希缓存,重复请求可降低80%调用量

2. 合法合规使用

  • 数据存储:敏感字段(如customs_codewarehouse_address)需加密存储,符合GDPR要求
  • 使用条款:严格遵守速卖通开放平台服务协议,不得用于价格爬虫等违规场景
  • 版权说明:商品描述、图片等数据受版权保护,二次使用需获授权

3. 签名验证常见错误

  • 参数排序:必须按键名ASCII码升序排列
  • 编码问题:URL参数需进行UTF-8编码,特殊字符使用urllib.parse.quote处理
  • 时间戳格式:部分接口要求"%Y-%m-%d %H:%M:%S"格式,部分要求毫秒级时间戳

七、典型应用场景

  1. 竞品监控: 定时抓取竞品价格、库存变化,自动触发调价策略
  2. 选品分析: 通过search_keywordsprice_history分析热销品特征
  3. 供应链溯源: 利用manufacturer_address字段定位供应商集群(如江西新余锂电产业带)
  4. 合规预警: 检测sku_properties中的认证信息(如CE、FCC),避免侵权风险
  5. SEO优化: 提取desc_html中的参数表格,生成结构化产品页

八、总结

通过速卖通item_get接口,开发者可构建强大的商品数据采集系统。本文提供的签名算法、异常处理、缓存策略等实战代码可直接应用于生产环境。建议优先使用官方新加坡节点(api-sg.aliexpress.com),延迟更低且稳定性更高。
重要提醒:截止2024年底,速卖通已强化API权限审核,建议申请"跨境数据应用"类目以获取raw_data等高级权限。完整实现需结合业务场景持续优化请求策略和数据清洗流程

如遇接口调用问题,可通过速卖通开放平台工单系统联系技术支持,或参考官方API文档(需登录后访问)


群贤毕至

访客