×

小米有品商品详情接口:分块数据合并与动态参数表结构化方案

Ace Ace 发表于2026-10-22 17:12:45 浏览8 评论0

抢沙发发表评论

小米有品商品详情接口和单节点电商接口差异极大,完整详情并不是一个请求就能返回全的,前端加载时会分块拉取基础信息、SKU 价格、规格参数、售后规则四个独立子节点。网上公开示例大多只抓基础接口打印返回,往往漏掉规格参数、分层价格这些核心字段,直接用于比价或 ERP 同步会出现数据残缺。本文从业务补全角度,封装跨节点请求合并、动态参数结构化、分层价格拆离逻辑,拿到可直接入库的完整详情数据。

前置准备

Python3.8 环境,安装 requests 库。请求需模拟移动端浏览器 UA,批量拉取时保持会话复用,接口无复杂签名,但高频请求会触发临时风控拦截。

点击获取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)

核心逻辑解析

整套逻辑核心是 “数据补全” 而不是 “单接口打印”:串行请求两个独立接口块,用 goods_id 做关联补全参数;动态参数直接转为键值对字典,不管是家电、数码还是家居品类,都能统一存储,不用为每个品类写单独解析逻辑;价格层拆为市场价、会员价、活动价,解决之前比价时价格混淆的问题。

群贤毕至

访客