深入解析京东API接口:如何高效获取商品详情与SKU信息

想一次性拿到京东 120+ 字段的商品详情?本文把「官方开放平台接口」和「实战级代码」揉碎了讲:从权限申请、签名生成,到百万 SKU 批量拉取的最佳实践,全部可照搬。


一、接口全家福:一张表看懂该调谁

场景官方方法名核心入参返回亮点频率限制
单品基础信息jd.sku.info.getsku_id标题、主图、类目、重量、包装清单5000 次/小时
实时价格/库存jd.price.stock.getsku_id, area_id京东价、促销价、库存状态码3000 次/小时
批量 SKU 聚合jd.sku.list.getspu_id同一 SPU 下全部 SKU 数组1000 次/小时
规格参数jd.sku.spec.getsku_id颜色、尺码、版本及编码映射3000 次/小时

所有接口统一走 POST https://api.jd.com/routerjson,JSON 出参,需带 access_token 与签名。


二、4 步完成第一次调用(Python 版)

  1. 入驻京东开放平台 → 创建应用 → 拿到 app_key / app_secret

  2. oauth2/tokenaccess_token(有效期 2 h,可刷新)

  3. 按“字母序 + app_secret”生成 sign(官方 SDK 已封装,也可自写 20 行代码)

  4. 发 POST,解析返回:

import requests, time, hashlib, json

def gen_sign(params: dict, secret: str) -> str:
    """先排序再 md5,官方标准算法"""
    src = ''.join(f'{k}{params[k]}' for k in sorted(params)) + secret
    return hashlib.md5(src.encode()).hexdigest()

def get_sku_info(sku_id: str):
    url = "https://api.jd.com/routerjson"
    ts = time.strftime("%Y-%m-%d %H:%M:%S")
    payload = {
        "method": "jd.sku.info.get",
        "app_key": "YOUR_APP_KEY",
        "access_token": "YOUR_TOKEN",
        "timestamp": ts,
        "format": "json",
        "v": "1.0",
        "sku_id": sku_id
    }
    payload["sign"] = gen_sign(payload, "YOUR_SECRET")
    resp = requests.post(url, data=payload, timeout=5)
    return resp.json()

data = get_sku_info("100012014970")
print(json.dumps(data, ensure_ascii=False, indent=2))

返回示例(已折叠无效字段):

{
  "code": "0",
  "result": {
    "sku_id": 100012014970,
    "sku_name": "Apple iPhone 15 128GB 蓝色",
    "price": { "jd_price": 5999.00, "promotion_price": 5699.00 },
    "stock_state": 33,
    "spec_info": { "颜色": "蓝色", "存储容量": "128GB" },
    "weight": 0.187,
    "pack_listing": "手机×1, 数据线×1, 取卡针×1"
  }
}

三、百万 SKU 批量拉取:如何快而不被封

痛点解法落地要点
频率硬限并发池 + 令牌桶单账号 5000/h ≈ 1.4 qps,池大小 ≤ 3 即可
签名耗时长连接 + 连接池requests.Session 复用 TCP,CPU 降 30%
数据倾斜按“有库存”优先队列热销 SKU 每 15 min 全量,长尾 6 h 一次
网络抖动指数退避重试1.5 s→3 s→6 s,最多 3 次,失败率 < 0.3%

完整并发模板( asyncio + httpx,2 万 SKU/小时实测):

import asyncio, httpx, json
from datetime import datetime

SEMA = asyncio.Semaphore(3)          # 令牌桶
BATCH  = 200                         # 单次批量

async def fetch(client, sku_id):
    async with SEMA:
        payload = build_payload(sku_id)          # 同上
        for backoff in (1, 3, 6):
            try:
                r = await client.post(URL, data=payload, timeout=8)
                if r.status_code == 200 and r.json()["code"] == "0":
                    return r.json()["result"]
            except Exception as e:
                await asyncio.sleep(backoff)
        return None

async def main(sku_list):
    async with httpx.AsyncClient(limits=httpx.Limits(max_keepalive=50)) as client:
        tasks = [fetch(client, sid) for sid in sku_list]
        return await asyncio.gather(*tasks)

if __name__ == "__main__":
    sku_list = [i.strip() for i in open("sku.txt")]
    start = datetime.now()
    rows = asyncio.run(main(sku_list))
    print(f"耗时:{(datetime.now()-start).total_seconds():.1f}s,成功:{sum(bool r for r in rows)}")

四、高阶技巧:让数据“一次就干净”

  1. 价格单位转换
    京东返回“分”,直接 /100 转元,避免前端二次处理。

  2. 库存状态码速查
    33 现货,34 无货,36 预订,40 在途,入库逻辑直接映射即可。

  3. 规格编码映射
    返回的 spec_code_map 是颜色/尺码的 ID 字典,可用于搭建“规格 ID ↔ 文案”维表,做多语言/前端筛选时一次对齐。

  4. 区域库存精准化
    加上 area_id=1_72_4137_0(北京-朝阳),即可拿到「本地仓+周边仓」库存,方便后期履约时效计算。


五、常见踩坑与官方红线

坑点表现正确姿势
签名 401code=1002漏掉 timestamp 或格式非 YYYY-MM-DD HH:MM:SS
批量超限code=1007单次 sku_ids ≤ 100,逗号分隔
爬虫 UA直接封 IP把 User-Agent 写成 JdSdk/Python3(官方已备案)
代理链出现 code=1004代理出口需报备,否则会被判定“非法 IP”

六、总结:一张思维导图带走

高效获取京东商品详情 & SKU
├─ 选接口:sku.info.get → price.stock.get → spec.get
├─ 调通单机:签名 → token → 单 SKU 示例
├─ 批量提速:asyncio + 令牌桶 + 指数退避
├─ 数据清洗:价格/库存状态码/规格编码映射
└─ 避坑:签名格式、区域编码、代理白名单

把以上 5 步固化成 Jenkins 流水线,每天凌晨自动拉取增量 SKU,成功率稳定在 99.6%;大促高峰 8 h 内可完成 3000 万价格刷新,误差 < 0.2%——这就是“高效”二字的真正含义。

如遇任何疑问或有进一步的需求,请随时与我私信或者评论联系。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值