前言 大部分公开教程只演示简单调用获取商品基础信息,很少处理跨境平台真实痛点:不同站点返回字段差异、多语言字段乱码、规格
SKU
数组嵌套层级不稳定、接口返回空片段。本文不从简单请求示例切入,聚焦业务落地,增加字段归一化、脏数据拦截逻辑,适合爬虫业务、商品同步系统直接参考。 前置说明 速卖通开放平台商品详情接口,不同国家站点返回结构会发生变动,同一接口 US、RU、ES 站点 SKU、图片、物流字段 key 不完全一致。直接按固定 key 取值,生产环境极易出现 KeyError,导致程序中断。 核心 Python 示例代码 代码核心逻辑解读 封装 SKU 做类型判断,接口偶尔返回 自动聚合全部 SKU 库存,业务系统不需要重复循环计算。 踩坑总结 接口限流:普通应用 QPS 较低,批量拉取必须做间隔休眠,短时间大量请求会返回权限报错。 下架商品:商品删除、下架时接口不会返回完整结构,务必做判空处理。 多语言:标题、描述字段会随调用站点语言切换,不要硬编码字段名。 图片地址:部分图片链接会携带过期 token,存储时注意识别,否则一段时间后图片失效。
开发前需要准备:应用 AppKey、AppSecret、商品 ID,接口权限已开通,注意接口 QPS 限流,高频调用需要增加休眠与重试。
import requests
import time
class AliExpressDetailClient:
def __init__(self, app_key, app_secret):
self.app_key = app_key
self.app_secret = app_secret
self.url = "https://gw.api.aliexpress.com/openapi"
def normalize_field(self, raw_data):
"""字段归一化,兼容多站点返回差异,过滤空脏数据"""
res = {
"item_id": raw_data.get("item_id", ""),
"title": raw_data.get("subject", "").strip(),
"price": raw_data.get("price", "0"),
"main_images": [],
"sku_list": [],
"stock": 0
}
# 处理主图,过滤空字符串
img_raw = raw_data.get("main_image_urls", [])
res["main_images"] = [i for i in img_raw if i and isinstance(i, str)]
# 处理SKU,兼容两种嵌套结构
sku_raw = raw_data.get("sku_info_list") or raw_data.get("sku_list", [])
for sku in sku_raw:
if not isinstance(sku, dict):
continue
sku_item = {
"sku_id": sku.get("sku_id",""),
"sale_price": sku.get("sku_price","0"),
"stock_num": int(sku.get("stock",0))
}
res["sku_list"].append(sku_item)
if res["sku_list"]:
res["stock"] = sum(s["stock_num"] for s in res["sku_list"])
return res
def get_item_detail(self, item_id, session=None):
session = session or requests.Session()
params = {
"app_key": self.app_key,
"timestamp": int(time.time()*1000),
"method":"aliexpress.item.get",
"item_id": item_id
}
resp = session.get(self.url, params=params, timeout=12)
json_data = resp.json()
if json_data.get("error_response"):
return {"success":False,"msg":json_data["error_response"]}
raw = json_data.get("response",{})
return {"success":True,"data":self.normalize_field(raw)}
if __name__ == "__main__":
client = AliExpressDetailClient("your_appkey","your_appsecret")
ret = client.get_item_detail("1234567890")
print(ret)normalize_field归一化函数,这是本文重点,不直接读取原始返回,统一输出固定格式字典,屏蔽不同站点字段差异。None或者非数组对象,直接遍历会直接抛异常,增加类型过滤。