小米有品商品详情接口和单节点电商接口差异极大,完整详情并不是一个请求就能返回全的,前端加载时会分块拉取基础信息、SKU 价格、规格参数、售后规则四个独立子节点。网上公开示例大多只抓基础接口打印返回,往往漏掉规格参数、分层价格这些核心字段,直接用于比价或 ERP 同步会出现数据残缺。本文从业务补全角度,封装跨节点请求合并、动态参数结构化、分层价格拆离逻辑,拿到可直接入库的完整详情数据。 Python3.8 环境,安装 requests 库。请求需模拟移动端浏览器 UA,批量拉取时保持会话复用,接口无复杂签名,但高频请求会触发临时风控拦截。 整套逻辑核心是 “数据补全” 而不是 “单接口打印”:串行请求两个独立接口块,用 goods_id 做关联补全参数;动态参数直接转为键值对字典,不管是家电、数码还是家居品类,都能统一存储,不用为每个品类写单独解析逻辑;价格层拆为市场价、会员价、活动价,解决之前比价时价格混淆的问题。前置准备

点击获取key和secret
完整代码示例
import requests
import time
class YouPinDetailApi:
def __init__(self):
self.session = requests.Session()
self.headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17 like Mac OS X) AppleWebKit/605.1.15 Mobile/15E148",
"Referer": "https://m.xiaomiyoupin.com/"
}
self.base = "https://m.xiaomiyoupin.com/api"
def _get(self, path, params):
try:
resp = self.session.get(f"{self.base}{path}", headers=self.headers, params=params, timeout=8)
return resp.json()
except Exception:
return None
def get_full_detail(self, goods_id):
# 第一块:基础信息+SKU价格
base_res = self._get("/goods/detail/base", {"goodsId": goods_id})
# 第二块:动态规格参数
param_res = self._get("/goods/detail/param", {"goodsId": goods_id})
if not base_res or base_res.get("code") != 0:
return None
base = base_res["data"]
# 动态参数转结构化字典
param_map = {}
if param_res and param_res.get("code") == 0:
for p in param_res["data"].get("paramList", []):
param_map[p.get("name")] = p.get("value")
# SKU扁平化+分层价格拆分
sku_list = []
for sku in base.get("skuList", []):
sku_list.append({
"sku_id": sku.get("skuId"),
"spec": sku.get("specName"),
"market_price": sku.get("marketPrice"),
"member_price": sku.get("memberPrice"),
"stock": sku.get("stockNum")
})
return {
"goods_id": goods_id,
"title": base.get("title"),
"cover_imgs": base.get("imgList", []),
"sku_list": sku_list,
"params": param_map,
"after_sale": base.get("afterSale", "")
}
if __name__ == "__main__":
api = YouPinDetailApi()
detail = api.get_full_detail(goods_id="1234567")
print(detail)核心逻辑解析