前言 市面上大多数京东商品详情接口教程仅实现基础调用,只抓取标题、售价等浅层信息,忽略京东平台两大核心特性:商品价格、库存跟随收货区域动态变化,同时多 SKU 原始数据结构杂乱,很难直接投入业务系统。 前置准备 提前入驻京东开放平台,创建应用获取 完整 Python 代码实现 核心方案解析 区域价格适配 SKU 归一化清洗 指数退避重试
本文不重复基础签名教学,重点解决业务落地痛点:封装区域编码参数、原始 SKU 数据归一化处理、指数退避重试机制,适配比价监控、商品铺货场景。所有代码内置数据清洗逻辑,可直接改造接入项目。app_key、app_secret,开通商品详情接口权限。需要注意:京东商品以 SKU 为唯一标识,而非 SPU,调用接口必须传入有效的 SKU 编号。
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))
增加area_code区域参数,不同省市仓储库存、运费、活动价存在差异。默认填入北京区域编码,业务系统可根据用户收货地址动态切换,避免展示价格和实际下单价格不一致。
原始接口返回规格数据嵌套层级深,新增data_normalize方法统一输出结构。后续对接数据库、前端页面无需重复解析 JSON,降低维护成本。
针对接口限流、网络波动问题,采用指数延时重试,相比固定休眠,能够有效减少高频重试引发的风控拦截。