×

华为商城商品详情接口:规格分组与套餐数据归一化方案

Ace Ace 发表于2026-10-23 14:15:20 浏览7 评论0

抢沙发发表评论

华为商城商品详情接口和多数电商平台有明显区别,除基础标题、主图、SKU 之外,还内置套餐组合、增值服务、包装清单、参数分组模块。网上通用示例大多只提取基础 SKU,忽略套餐和配件清单,同步到商品系统时很容易丢失增值服务、套装版本这类业务字段。本文以结构化归一化为目标,把分散的多分组数据清洗为扁平可入库结构,适配数码、穿戴、鸿蒙智家等多品类商品。

前置说明

开发环境 Python3.7+,依赖 requests 库。该平台接口校验重点在请求头标识,会话复用可以减少反复校验;新品、预约商品会出现价格节点为空、库存动态变化的情况,代码中需要做空值兜底。

点击获取key和secret

完整代码示例

import requests
import time

class VmallDetail:
    def __init__(self):
        self.session = requests.Session()
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Linux; Android 14) Chrome/120.0 Mobile",
            "Referer": "https://m.vmall.com/"
        }

    def req_api(self, url, params=None):
        try:
            res = self.session.get(url, headers=self.headers, params=params, timeout=10)
            return res.json()
        except Exception:
            return None

    def get_detail(self, product_id):
        detail_url = "https://m.vmall.com/api/product/detail"
        res_data = self.req_api(detail_url, {"productId": product_id})
        if not res_data or res_data.get("code") != 0:
            return None
        data = res_data["data"]
        # 基础信息
        base_info = {
            "product_id": product_id,
            "title": data.get("productName"),
            "sub_title": data.get("subName"),
            "main_images": data.get("picList", [])
        }
        # SKU规格扁平化
        sku_list = []
        for sku in data.get("skuList", []):
            sku_list.append({
                "sku_id": sku.get("skuId"),
                "spec_text": sku.get("specDesc"),
                "sale_price": sku.get("salePrice"),
                "market_price": sku.get("marketPrice"),
                "stock_status": sku.get("stockStatus")
            })
        # 套餐、配件清单、参数分组
        package_list = data.get("packageList", [])
        param_group = {}
        for group in data.get("paramGroupList", []):
            group_name = group.get("groupName")
            items = {i.get("paramName"): i.get("paramValue") for i in group.get("paramList", [])}
            param_group[group_name] = items
        return {
            **base_info,
            "sku_list": sku_list,
            "package_info": package_list,
            "spec_params": param_group,
            "warranty": data.get("warrantyInfo", "")
        }

if __name__ == "__main__":
    client = VmallDetail()
    result = client.get_detail(product_id="1008612345")
    print(result)

核心设计思路

和常规直接打印返回结果的写法不同,这里采用分组参数二次封装,将参数按 “屏幕、性能、续航” 等分组保存,后续做机型对比时可以直接按分组筛选。套餐信息单独抽离,区分裸机和套装 SKU,避免价格混淆。同时把库存状态转为标识字段,方便业务层判断预约、缺货、现货三种状态。

线上落地避坑

第一,预约发售商品的价格字段会返回空,业务侧必须增加空判断,不可直接写入价格字段;第二,参数分组每个品类结构不一样,不能写死 key,采用动态字典更通用;第三,批量拉取时建议间隔 1.2s 以上,短时间高频请求会触发风控拦截;第四,增值服务(延保、镌刻)是独立子节点,和 SKU 不绑定,业务对接时不要和商品 SKU 合并。

这套方案适合商品比价、ERP 商品同步、机型库维护场景,输出的结构化数据不需要再二次清洗,减少后续开发工作量。

群贤毕至

访客