一、前期准备:注册与认证
-
注册京东开发者账号
- 访问京东开放平台 ,点击 "注册",选择 "开发者账号"
- 个人开发者:完成实名认证 (身份证 + 人脸识别)
- 企业开发者:提交营业执照 + 对公账户验证 (推荐,QPS 可达 100 次 / 分钟)
-
创建应用获取凭证
- 登录后进入 "应用管理",创建 "电商服务类" 应用
- 填写应用名称 (如 "XX 商品数据分析系统"),提交审核
- 审核通过后获取三大凭证:
- AppKey:应用唯一标识 (公开)
- AppSecret:签名密钥 (安全保存,严禁前端暴露)
- AccessToken:通过 OAuth2.0 获取,有效期 30 天 (部分接口需要)
-
申请接口权限
- 在 "API 权限管理" 页面搜索并申请所需接口权限
- 必选接口:商品详情查询 (jd.item.get 或 jd.union.open.goods.detail.query)
- 可选接口:商品搜索 (jd.item.search)、店铺商品查询 (jd.item.search.shop)、SKU 详情
二、核心接口详解与选择
根据采集需求选择合适接口:
| 接口名称 | 功能描述 | 适用场景 | 返回核心数据 |
|---|---|---|---|
| jd.item.get | 获取单商品详情 | 单品分析、价格监控 | 标题、价格、库存、主图、SKU 信息 |
| jd.item.search | 关键词搜索商品列表 | 市场调研、竞品分析 | 商品 ID、标题、价格、销量、店铺 ID |
| jd.item.search.shop | 获取店铺所有商品 | 店铺分析、供应商管理 | 店铺商品列表 (支持分页) |
| batch_get_item_info | 批量获取多商品详情 (最多 1000 个 SKU) | 大规模数据采集 | 结构化商品数据 (300 + 字段) |
三、接口接入核心流程:从请求到数据
1. 签名生成 (关键安全环节)
京东 API 采用签名验证机制防止请求篡改,生成步骤:
python
运行
def generate_sign(params, app_secret):
# 1. 按参数名ASCII升序排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接参数字符串
param_str = "&".join([f"{k}={v}" for k, v in sorted_params])
# 3. 使用AppSecret进行HMAC-SHA256加密(或MD5)
sign = hmac.new(
app_secret.encode("utf-8"),
param_str.encode("utf-8"),
hashlib.sha256
).hexdigest().upper()
return sign
2. 完整请求流程示例
以商品详情查询为例:
python
运行
import requests
import time
import hashlib
import hmac
# 初始化
APP_KEY = "your_app_key"
APP_SECRET = "your_app_secret"
API_URL = "https://api.jd.com/routerjson" # 固定网关地址
def get_product_detail(sku_id):
# 1. 构造基础参数
params = {
"app_key": APP_KEY,
"method": "jd.union.open.goods.detail.query", # 接口方法名
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"), # 时间戳
"format": "json",
"v": "1.0",
"skuId": sku_id # 商品SKU ID(从商品URL提取)
}
# 2. 生成签名
params["sign"] = generate_sign(params, APP_SECRET)
# 3. 发送请求
try:
response = requests.get(API_URL, params=params, timeout=10)
response.raise_for_status() # 检查HTTP错误
result = response.json()
# 4. 处理响应
if result.get("code") == 200: # 业务成功
return result["jd_union_open_goods_detail_query_response"]["result"]
else: # 业务失败
print(f"API调用失败: {result['code']}, {result['msg']}")
return None
except Exception as e:
print(f"请求异常: {str(e)}")
return None
# 调用示例
product_data = get_product_detail("100012345678") # 商品ID从京东商品URL获取
print(product_data)
3. 店铺商品批量采集示例
python
运行
def get_shop_products(shop_id, page=1):
params = {
"app_key": APP_KEY,
"method": "jd.item.search.shop",
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
"shop_id": shop_id, # 店铺ID
"page": page, # 页码
"page_size": 100 # 每页最多100条
}
params["sign"] = generate_sign(params, APP_SECRET)
response = requests.get(API_URL, params=params)
result = response.json()
if result.get("code") == 200:
return result["jd_item_search_shop_response"]["result"]["items"]
else:
return None
# 采集某店铺所有商品(自动分页)
def get_all_shop_products(shop_id):
products = []
page = 1
while True:
page_products = get_shop_products(shop_id, page)
if not page_products: # 没有更多数据
break
products.extend(page_products)
page += 1
# 控制调用频率(避免超过QPS限制)
time.sleep(1)
return products
四、数据解析与存储优化
1. 关键数据提取
商品详情响应主要字段:
| 字段名 | 说明 | 用途 |
|---|---|---|
| skuId | 商品唯一标识 | 数据关联、去重 |
| title | 商品标题 | 内容分析、展示 |
| price | 商品价格 (元) | 价格监控、竞品分析 |
| stock | 库存数量 | 库存预警、供应链管理 |
| sales | 销量 | 销售趋势分析 |
| img_urls | 图片 URL 列表 | 素材管理、展示 |
| shop_id/name | 店铺 ID / 名称 | 店铺分析、供应商管理 |
2. 数据存储方案
方案 A:轻量级存储 (适合小规模)
- CSV 文件:使用 pandas 库直接保存,适合临时分析
- JSON 文件:直接存储 API 返回的结构化数据
方案 B:数据库存储 (推荐,适合大规模)
python
运行
import pymysql
def save_to_mysql(product_data, db_config):
# 连接数据库
conn = pymysql.connect(**db_config)
cursor = conn.cursor()
# 插入数据SQL
sql = """
INSERT INTO jd_products (
sku_id, title, price, stock, sales,
img_urls, shop_id, shop_name, create_time
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
"""
# 执行插入
try:
cursor.execute(sql, (
product_data["skuId"],
product_data["title"],
product_data["price"],
product_data["stock"],
product_data.get("sales", 0),
json.dumps(product_data["img_urls"]),
product_data["shopId"],
product_data["shopName"],
time.strftime("%Y-%m-%d %H:%M:%S")
))
conn.commit()
print("数据成功保存到MySQL")
except Exception as e:
conn.rollback()
print(f"MySQL保存失败: {str(e)}")
finally:
conn.close()
五、常见问题与优化策略
1. 签名错误 (最常见问题)
原因排查:
- 时间戳格式错误 (必须为 "YYYY-MM-DD HH:MM:SS" 且与京东服务器时间偏差 < 5 分钟)
- 参数未按 ASCII 升序排序
- AppSecret 错误或泄露
- 特殊字符未正确编码
解决方案:
- 使用 NTP 同步服务器时间
- 使用
sorted()函数确保参数排序正确 - AppSecret 通过环境变量读取,定期更换
- 对含特殊字符的参数进行 URL 编码
2. 调用频率控制 (QPS 限制)
- 个人账号:≤10 次 / 分钟
- 企业账号:≤100 次 / 分钟
- 服务商账号:最高 500 次 / 分钟(需单独申请)
优化方案:
- 实现令牌桶算法控制调用频率,预留 20% 缓冲
- 批量接口优先 (batch_get_item_info 支持单次 1000 个 SKU)
- 添加重试机制处理临时失败
python
运行
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def safe_get_product_detail(sku_id):
return get_product_detail(sku_id)
3. 数据一致性问题
** 问题表现:**API 返回数据与京东前端显示不一致
解决方案:
- 开通商品变更回调功能,实时接收更新通知 (需在开放平台配置回调地址)
- 对关键商品增加采集频率
- 记录数据版本和采集时间,便于追溯差异
六、应用场景示例
1. 电商竞品分析系统
实现步骤:
- 采集竞品店铺所有商品信息
- 设置价格变动监控 (±5% 触发警报)
- 分析竞品热销品类和价格带
- 定期生成竞品分析报表
核心接口组合:jd.item.search.shop + jd.item.get + batch_get_item_info
2. 供应商商品管理系统
实现步骤:
- 同步供应商店铺商品到自有系统
- 设置库存阈值 (如 < 10 件触发补货提醒)
- 自动更新商品信息 (价格、库存、图片)
- 分析供应商销售表现
核心接口组合:jd.item.search.shop + jd.item.get(定期轮询) + 商品变更回调
七、合规使用边界 (重要!)
京东对 API 使用有严格规定,违规将导致权限回收或账号处罚:
-
禁止行为:
- 将数据提供给第三方 (除非有明确授权)
- 用于竞品攻击或不正当竞争
- 超出授权范围使用接口
- 绕过 API 限制进行数据爬取
- 接口调用日志未留存 (需保存至少 3 个月)
-
合规建议:
- 仅在授权范围内使用接口
- 明确数据用途 (如 "内部分析,不对外提供")
- 定期检查账号权限状态
- 建立数据安全管理制度,防止泄露
总结与下一步
京东 API 提供了合规、高效的商品数据采集渠道,相比爬虫具有数据稳定、结构清晰、合法合规等优势。接入流程主要包括:注册认证→创建应用→申请权限→接口调用→数据处理。
京东API商品数据采集指南


1149

被折叠的 条评论
为什么被折叠?



