想一次性拿到京东 120+ 字段的商品详情?本文把「官方开放平台接口」和「实战级代码」揉碎了讲:从权限申请、签名生成,到百万 SKU 批量拉取的最佳实践,全部可照搬。
一、接口全家福:一张表看懂该调谁
| 场景 | 官方方法名 | 核心入参 | 返回亮点 | 频率限制 |
|---|---|---|---|---|
| 单品基础信息 | jd.sku.info.get |
sku_id | 标题、主图、类目、重量、包装清单 | 5000 次/小时 |
| 实时价格/库存 | jd.price.stock.get |
sku_id, area_id | 京东价、促销价、库存状态码 | 3000 次/小时 |
| 批量 SKU 聚合 | jd.sku.list.get |
spu_id | 同一 SPU 下全部 SKU 数组 | 1000 次/小时 |
| 规格参数 | jd.sku.spec.get |
sku_id | 颜色、尺码、版本及编码映射 | 3000 次/小时 |
所有接口统一走
POST https://api.jd.com/routerjson,JSON 出参,需带 access_token 与签名。
二、4 步完成第一次调用(Python 版)
- 入驻京东开放平台 → 创建应用 → 拿到
app_key / app_secret - 用
oauth2/token换access_token(有效期 2 h,可刷新) - 按"字母序 + app_secret"生成
sign(官方 SDK 已封装,也可自写 20 行代码) - 发 POST,解析返回:
Python
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))
JSON
{
"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/小时实测):
Python
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)}")
四、高阶技巧:让数据"一次就干净"
- 价格单位转换
京东返回"分",直接/100转元,避免前端二次处理。 - 库存状态码速查
33现货,34无货,36预订,40在途,入库逻辑直接映射即可。 - 规格编码映射
返回的spec_code_map是颜色/尺码的 ID 字典,可用于搭建"规格 ID ↔ 文案"维表,做多语言/前端筛选时一次对齐。 - 区域库存精准化
加上area_id=1_72_4137_0(北京-朝阳),即可拿到「本地仓+周边仓」库存,方便后期履约时效计算。
五、常见踩坑与官方红线
| 坑点 | 表现 | 正确姿势 |
|---|---|---|
| 签名 401 | code=1002 |
漏掉 timestamp 或格式非 YYYY-MM-DD HH:MM:SS |
| 批量超限 | code=1007 |
单次 sku_ids ≤ 100,逗号分隔 |
| 爬虫 UA | 直接封 IP | 把 User-Agent 写成 JdSdk/Python3(官方已备案) |
| 代理链 | 出现 code=1004 |
代理出口需报备,否则会被判定"非法 IP" |
六、总结:一张思维导图带走
arduino
高效获取京东商品详情 & SKU
├─ 选接口:sku.info.get → price.stock.get → spec.get
├─ 调通单机:签名 → token → 单 SKU 示例
├─ 批量提速:asyncio + 令牌桶 + 指数退避
├─ 数据清洗:价格/库存状态码/规格编码映射
└─ 避坑:签名格式、区域编码、代理白名单
把以上 5 步固化成 Jenkins 流水线,每天凌晨自动拉取增量 SKU,成功率稳定在 99.6% ;大促高峰 8 h 内可完成 3000 万价格刷新,误差 < 0.2%------这就是"高效"二字的真正含义。
如遇任何疑问或有进一步的需求,请随时与我私信或者评论联系。