在跨境电商领域,自动化获取商品详情数据是数据分析、价格监控和竞品研究的核心能力。本文将深入实战,详解如何通过速卖通开放平台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 sign2. 封装商品详情获取函数
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 None3. 典型响应数据解析
接口返回的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 data3. 异常监控与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_code、warehouse_address)需加密存储,符合GDPR要求 - 使用条款:严格遵守速卖通开放平台服务协议,不得用于价格爬虫等违规场景
- 版权说明:商品描述、图片等数据受版权保护,二次使用需获授权
3. 签名验证常见错误
- 参数排序:必须按键名ASCII码升序排列
- 编码问题:URL参数需进行UTF-8编码,特殊字符使用
urllib.parse.quote处理 - 时间戳格式:部分接口要求
"%Y-%m-%d %H:%M:%S"格式,部分要求毫秒级时间戳
七、典型应用场景
- 竞品监控: 定时抓取竞品价格、库存变化,自动触发调价策略
- 选品分析: 通过
search_keywords和price_history分析热销品特征 - 合规预警: 检测
sku_properties中的认证信息(如CE、FCC),避免侵权风险 - SEO优化: 提取
desc_html中的参数表格,生成结构化产品页
八、总结
通过速卖通
item_get接口,开发者可构建强大的商品数据采集系统。本文提供的签名算法、异常处理、缓存策略等实战代码可直接应用于生产环境。建议优先使用官方新加坡节点(api-sg.aliexpress.com),延迟更低且稳定性更高。重要提醒:截止2024年底,速卖通已强化API权限审核,建议申请"跨境数据应用"类目以获取
raw_data等高级权限。完整实现需结合业务场景持续优化请求策略和数据清洗流程。如遇接口调用问题,可通过速卖通开放平台工单系统联系技术支持,或参考官方API文档(需登录后访问)。