×

速卖通商品详情接口实战:多站点字段兼容与脏数据过滤方案

Ace Ace 发表于2026-08-10 16:47:35 浏览6 评论0

抢沙发发表评论

前言

大部分公开教程只演示简单调用获取商品基础信息,很少处理跨境平台真实痛点:不同站点返回字段差异、多语言字段乱码、规格 SKU 数组嵌套层级不稳定、接口返回空片段。本文不从简单请求示例切入,聚焦业务落地,增加字段归一化、脏数据拦截逻辑,适合爬虫业务、商品同步系统直接参考。

前置说明

速卖通开放平台商品详情接口,不同国家站点返回结构会发生变动,同一接口 US、RU、ES 站点 SKU、图片、物流字段 key 不完全一致。直接按固定 key 取值,生产环境极易出现 KeyError,导致程序中断。
开发前需要准备:应用 AppKey、AppSecret、商品 ID,接口权限已开通,注意接口 QPS 限流,高频调用需要增加休眠与重试。

点击获取key和secret

核心 Python 示例代码

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)

代码核心逻辑解读

  1. 封装normalize_field归一化函数,这是本文重点,不直接读取原始返回,统一输出固定格式字典,屏蔽不同站点字段差异。

  2. SKU 做类型判断,接口偶尔返回None或者非数组对象,直接遍历会直接抛异常,增加类型过滤。

  3. 自动聚合全部 SKU 库存,业务系统不需要重复循环计算。


踩坑总结

  1. 接口限流:普通应用 QPS 较低,批量拉取必须做间隔休眠,短时间大量请求会返回权限报错。

  2. 下架商品:商品删除、下架时接口不会返回完整结构,务必做判空处理。

  3. 多语言:标题、描述字段会随调用站点语言切换,不要硬编码字段名。

  4. 图片地址:部分图片链接会携带过期 token,存储时注意识别,否则一段时间后图片失效。

群贤毕至

访客