京东商品详情 API 接口实战:从申请权限到 Python 调用,商品标题/价格/SKU 字段全解析
一、先搞清楚:你说的"京东商品数据",到底要哪些字段
很多人在搜索引擎里敲下"京东商品详情 API",但真正要的东西差别很大。先把需求对齐,能省掉后面 80% 的返工:
| 业务场景 | 核心字段 | 数据更新频率 |
|---|---|---|
| 铺货 / 上架 | 标题、主图、详情图、SKU 属性、类目、参数 | 上新时拉一次 |
| 比价 / 价格监控 | 价格、促销价、券后价、库存状态 | 每日甚至每小时 |
| 选品 / 竞品分析 | 价格、评价数、店铺信息、规格参数、销量区间 | 每周 |
| ERP / 中台同步 | 以上全部,且要稳定、要能批量 | 按业务节奏 |
结论:字段清单先定,再选技术路线。反过来说,如果你只是要价格和库存,没必要为一个"详情接口"付全量费用。
二、三条路线:官方开放平台 / 自建爬虫 / 第三方采集 API
这是整篇文章最关键的一节。选错路线,后面全是坑。
1)京东官方开放平台(JOS / 宙斯)
优点:数据最准、有官方支持、合规无争议
门槛:需要企业资质 + 应用审核 + 类目授权,且普通开发者基本只能拿到"自有店铺或已授权商品"的数据,想看全站竞品数据,官方渠道一般给不了
适合:品牌方、自营商家做自己店铺的数据同步
2)自建爬虫
优点:零接口成本、字段自由
代价:京东是反爬强度最高的一档(登录态、滑块、设备指纹、动态加密参数、风控封 IP),你得养代理 IP 池、还要 7×24 盯着对方改版
适合:有专职爬虫工程师、且数据量极大的团队
3)第三方商品详情 API(代采 / 聚合接口)
优点:一个 HTTP 请求拿到结构化 JSON,无需资质、无需维护反爬、按调用量付费
代价:需要选对服务商(稳定性、字段完整度、计费透明度差异很大)
适合:绝大多数中小团队、铺货工具、代运营公司
一句话选型:官方能拿到就用官方;拿不到又不想养爬虫团队,就用第三方 API;只有数据量和预算都到了规模,自建才划算。
三、京东商品详情 API 能取到什么
一个成熟的商品详情接口,通常一次请求就能把下面这些打包返回:
基础信息:商品 ID、标题、副标题、上架状态
价格:当前价、原价、促销价(部分服务商含券后价)
图片:主图、sku 图、详情长图(多为数组,按序返回)
SKU:规格组合、每个 SKU 的独立价格与库存
属性参数:品牌、型号、材质等结构化 props
店铺:店铺 ID、店铺名、店铺类型(自营 / POP)
类目:类目 ID 与路径
其他:详情地址、评价概览
字段是否齐全,是衡量一个 API 服务商好坏的第一指标——便宜但 SKU 价格给不全的接口,等于没有。
四、接入前的准备
拿到两份凭证:
key(身份标识)和secret(签名密钥)点此注册获取准备一个商品 ID(京东商品详情页 URL 中
item.jd.com/后面那串数字,如100012043978)确认你的调用量级,选好套餐——按量计费比包月更适合起步阶段
想清楚并发:单个商品 1 次请求,1 万个商品就是 1 万次调用,预算要提前算
五、Python 调用实战
下面是一段可直接运行的示例(把 URL、key、secret 换成你自己的即可):
import requests
import json
API_URL = "https://api.example.com/jd/item_get"
params = {
"key": "你的API_KEY",
"secret": "你的API_SECRET",
"num_iid": "100012043978", # 京东商品ID
"lang": "zh-CN",
"cache": "no", # no 表示强制实时拉取
"result_type": "json",
}
resp = requests.get(API_URL, params=params, timeout=10)
resp.raise_for_status()
data = resp.json()
item = data.get("item", {})
print("标题:", item.get("title"))
print("价格:", item.get("price"))
print("店铺:", item.get("nick"))
print("主图:", item.get("pic_url"))
# SKU 列表
for sku in item.get("skus", {}).get("sku", []):
print(sku.get("properties"), "→", sku.get("price"), "库存", sku.get("quantity"))批量采集:加个并发和重试
import time
from concurrent.futures import ThreadPoolExecutor
def fetch(num_iid, retry=3):
for i in range(retry):
try:
r = requests.get(API_URL, params={**params, "num_iid": str(num_iid)}, timeout=10)
if r.status_code == 200:
return r.json().get("item", {})
except Exception:
pass
time.sleep(0.5 * (i + 1)) # 退避重试
return None
ids = ["100012043978", "100012043979", "100012043980"]
with ThreadPoolExecutor(max_workers=5) as pool: # 并发别开太大
for item in pool.map(fetch, ids):
if item:
print(item.get("num_iid"), item.get("title"), item.get("price"))并发经验值:起步 3~5 并发足够,盲目开到 50 只会触发限流。批量任务建议加本地缓存(同一天内已拉过的商品不重复拉),能省下大量调用量。
六、返回字段详解
下面是典型响应的结构(已简化,实际字段更多):
{
"item"
:
{
"num_iid"
:
"100012043978"
,
"title"
:
"商品标题"
,
"price"
:
"199.00"
,
"original_price"
:
"299.00"
,
"nick"
:
"京东自营旗舰店"
,
"shop_id"
:
"1000004123"
,
"detail_url"
:
"https://item.jd.com/100012043978.html"
,
"pic_url"
:
"//img14.360buyimg.com/xxx.jpg"
,
"item_imgs"
:
[
{
"url"
:
"//img14.360buyimg.com/1.jpg"
}
]
,
"props"
:
[
{
"name"
:
"品牌"
,
"value"
:
"XXX"
}
]
,
"skus"
:
{
"sku"
:
[
{
"sku_id"
:
"100012043979"
,
"properties"
:
"颜色:白色;版本:8GB+128GB"
,
"properties_name"
:
"颜色:白色;版本:8GB+128GB"
,
"price"
:
"199.00"
,
"quantity"
:
"9999"
}
]
}
}
}重点字段逐个说明:
| 字段 | 含义 | 注意点 |
|---|---|---|
| num_iid | 商品 ID | 主商品的 ID,注意不是 SKU ID |
| title | 商品标题 | 可能含促销后缀,清洗时留意 |
| price | 当前售价 | 常为价格区间最小值,需配合 skus 看 |
| original_price | 划线价 | 营销参考价,不等于真实成交价 |
| item_imgs | 图片数组 | 返回的是协议相对地址,需自行补 https: |
| props | 规格参数 | 部分类目为空,做好判空 |
| skus.sku | SKU 列表 | 单个 SKU 的价格才是准的 |
| quantity | 库存 | 部分接口对库存有脱敏(如返回 9999 表示"充足") |
| shop_id / nick | 店铺 | 用于区分自营与 POP 商家 |
七、价格与 SKU:三个最容易踩的坑
坑 1:只看 price,结果价格对不上
主价格往往是"起售价"。比如一个商品 3 个规格,price 返回的是最低那个。要精确价格,必须遍历 skus 逐个取。
坑 2:图片链接直接用,全是裂图
京东图片常以 // 开头的协议相对地址返回。存储或展示前记得补全协议头:
def fix_url(u):
if u and u.startswith("//"):
return "https:" + u
return u坑 3:库存字段被脱敏
部分接口对库存做了保护(例如统一返回 9999)。如果你的业务依赖真实库存(比如做代发),下单前要向服务商确认该字段是否实时、是否脱敏。
八、常见错误码与排查
| 错误码 | 含义 | 处理方式 |
|---|---|---|
| 400 | 参数错误 | 检查 num_iid 是否为纯数字、凭证是否传全 |
| 401 | 凭证无效 | key / secret 拼错或已过期 |
| 403 | 权限不足 / 额度耗尽 | 查看账户剩余调用量 |
| 404 | 商品不存在 | 商品下架、删除或 ID 是 SKU ID |
| 429 | 触发限流 | 降低并发,加退避重试 |
| 5xx | 上游维护 | 服务端问题,等待并重试 |
排查顺序建议:先看凭证 → 再看参数 → 再看额度 → 最后看并发。九成的"接口挂了"其实都是这四个之一。
九、成本测算与选型建议
按量计费的逻辑很简单:调用次数 × 单价。
假设你每天要同步 2000 个商品,一个月就是 6 万次调用
起步阶段建议先小额度试跑一个月,摸清真实用量再买大套餐
几个选型标准,按重要性排序:
字段完整性——SKU 价格和库存给不全,直接淘汰
稳定性——能不能承诺可用率,出问题多久响应
计费透明——是否按成功返回计费、失败是否扣量
接入成本——文档清不清楚,有没有现成示例代码
十、写在最后
京东商品详情 API 这件事,难点从来不在"写代码"——一段 requests.get 谁都会写。真正的分水岭在于:
用官方渠道还是第三方,能不能覆盖你要的数据范围
字段全不全,价格和 SKU 准不准
量跑起来之后,成本和稳定性扛不扛得住
如果你不想自己折腾接入、维护和额度管理,可以直接用现成的代采 API 服务:一个接口直连京东商品详情,字段包含标题、价格、SKU、图片、参数和店铺信息,按调用次数计费,无需资质、无需自建反爬。
而且购买额度后,免费调用配额按购买金额的 2 倍赠送——相当于起步阶段先用赠送额度把项目跑通,用量验证完再决定加不加。
有具体字段需求或者想先试跑一批数据,欢迎加我聊,直接发商品 ID 我帮你拉一份真实返回看效果。


