×

京东商品详情接口工程实践:区域价格适配 + 多规格 SKU 归一化 + 分级重试方案(Python 实现)

Ace Ace 发表于2026-08-02 17:11:20 浏览12 评论0

抢沙发发表评论

前言

市面上大多数京东商品详情接口教程仅实现基础调用,只抓取标题、售价等浅层信息,忽略京东平台两大核心特性:商品价格、库存跟随收货区域动态变化,同时多 SKU 原始数据结构杂乱,很难直接投入业务系统。
本文不重复基础签名教学,重点解决业务落地痛点:封装区域编码参数、原始 SKU 数据归一化处理、指数退避重试机制,适配比价监控、商品铺货场景。所有代码内置数据清洗逻辑,可直接改造接入项目。

前置准备

提前入驻京东开放平台,创建应用获取app_keyapp_secret,开通商品详情接口权限。需要注意:京东商品以 SKU 为唯一标识,而非 SPU,调用接口必须传入有效的 SKU 编号。

点击获取key和secret

完整 Python 代码实现

import requests
import time
import hashlib
import json

class JdItemDetailClient:
    def __init__(self, app_key, app_secret):
        self.app_key = app_key
        self.app_secret = app_secret
        self.api_url = "https://api.jd.com/routerjson"
        self.session = requests.Session()

    # 生成接口签名
    def build_sign(self, param_dict):
        sorted_param = sorted(param_dict.items(), key=lambda x: x[0])
        sign_raw = self.app_secret
        for k, v in sorted_param:
            sign_raw += f"{k}{v}"
        sign_raw += self.app_secret
        return hashlib.md5(sign_raw.encode("utf-8")).hexdigest().upper()

    # 获取商品详情
    def get_item_detail(self, sku_id, area_code="1_72_2799_0", max_retry=3):
        params = {
            "app_key": self.app_key,
            "method": "jingdong.item.base.info.get",
            "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
            "v": "2.0",
            "format": "json",
            "360buy_param_json": json.dumps({"skuId": sku_id, "area": area_code})
        }
        params["sign"] = self.build_sign(params)
        retry_count = 0
        while retry_count < max_retry:
            try:
                resp = self.session.post(self.api_url, data=params, timeout=8)
                result = resp.json()
                # 数据归一化处理
                if "jingdong_item_base_info_response" in result:
                    data = result["jingdong_item_base_info_response"]["result"]
                    clean_data = self.data_normalize(data)
                    return {"success": True, "data": clean_data}
                return {"success": False, "msg": result.get("error_response", {})}
            except Exception as e:
                retry_count += 1
                time.sleep(2 ** retry_count)
        return {"success": False, "msg": "请求多次失败"}

    # 原始数据清洗归一化
    def data_normalize(self, raw):
        return {
            "sku_id": raw.get("skuId"),
            "title": raw.get("name"),
            "shop_name": raw.get("shopName"),
            "is_self": raw.get("isJdSelf"),
            "price": raw.get("jdPrice"),
            "market_price": raw.get("marketPrice"),
            "stock_state": raw.get("stockState"),
            "main_image": raw.get("imageUrl"),
            "spec_list": raw.get("skuSpecList", [])
        }

if __name__ == "__main__":
    client = JdItemDetailClient("你的app_key", "你的app_secret")
    res = client.get_item_detail("100012345678", area_code="1_72_2799_0")
    print(json.dumps(res, ensure_ascii=False, indent=2))

核心方案解析

  1. 区域价格适配
    增加area_code区域参数,不同省市仓储库存、运费、活动价存在差异。默认填入北京区域编码,业务系统可根据用户收货地址动态切换,避免展示价格和实际下单价格不一致。

  2. SKU 归一化清洗
    原始接口返回规格数据嵌套层级深,新增data_normalize方法统一输出结构。后续对接数据库、前端页面无需重复解析 JSON,降低维护成本。

  3. 指数退避重试
    针对接口限流、网络波动问题,采用指数延时重试,相比固定休眠,能够有效减少高频重试引发的风控拦截。

群贤毕至

访客