前言 义乌购作为小商品 B2B 批发平台,商品详情存在多 SKU 区间价、起批量、档口信息等特有字段,和零售电商结构差异很大。常规接口调用 Demo 大多只做简单请求打印,忽略批发业务核心的数据规整。本文从业务落地角度,封装根据商品 ID 拉取详情的调用类,重点解决多规格价格扁平化、空字段兼容、请求异常重试,适配进销存、比价系统的数据同步场景。 前置准备 开发环境:Python3.8+,依赖 requests 库。调用前需要平台接口访问凭证,接口请求需要携带 token 做身份校验,接口入参核心为商品唯一 ID。批发商品存在阶梯价格、最小起订量,返回 JSON 结构嵌套层级深,直接解析容易出现键不存在导致程序崩溃。 完整代码示例 python 代码核心解析 封装类采用 Session 复用连接,减少 TCP 握手开销。核心逻辑不是单纯打印原始返回值,而是对 B2B 批发字段做扁平化处理,提取标题、店铺、起订量、SKU 规格库存价格。增加重试机制,应对平台接口瞬时限流。很多小商品 SKU 数量多、部分规格库存为 0,代码自动兼容空数组,避免 KeyError 中断任务。 踩坑总结 阶梯批发价不是单一售价,必须遍历 skuList,业务入库不能只取第一条价格; 部分下架商品 ID 仍能请求,但 data 内字段为空,业务层需要增加在售状态判断; 接口有访问频率限制,批量轮询时必须增加延时,短时间高频请求会触发 token 拦截; 档口地址、发货时效字段存在部分商品缺失,解析时统一使用 get 方式获取。
import requests
import time
class YiwugoDetailApi:
def __init__(self, token: str):
self.token = token
self.base_url = "https://api.yiwugo.com/goods/detail"
self.session = requests.Session()
self.session.headers.update({
"User-Agent": "Mozilla/5.0",
"Authorization": f"Bearer {self.token}"
})
def get_detail_by_id(self, goods_id: str, retry=2):
"""根据商品ID获取详情,自动重试,清洗批发规格数据"""
params = {"goodsId": goods_id}
for _ in range(retry):
try:
resp = self.session.get(self.base_url, params=params, timeout=10)
resp.raise_for_status()
res_data = resp.json()
if res_data.get("code") != 200:
return {"status": False, "msg": res_data.get("msg"), "data": None}
raw = res_data["data"]
# 批发数据扁平化处理
result = {
"goods_id": raw.get("goodsId"),
"title": raw.get("title"),
"shop_name": raw.get("shopName"),
"min_order": raw.get("minOrderNum"), #最小起订
"price_list": []
}
sku_list = raw.get("skuList", [])
for sku in sku_list:
result["price_list"].append({
"spec_name": sku.get("specName"),
"price": sku.get("price"),
"stock": sku.get("stockNum")
})
return {"status": True, "msg": "success", "data": result}
except Exception as e:
time.sleep(1)
return {"status": False, "msg": "请求超时/接口异常", "data": None}
if __name__ == "__main__":
api = YiwugoDetailApi(token="你的访问凭证")
ret = api.get_detail_by_id(goods_id="YI20250612001")
print(ret)