一、核心前提:京东 API 接入的合规与准备
京东提供开放平台 AP和京东联盟 API(面向推广者),爬虫接入需优先使用官方 API(禁止爬取非开放的网页数据,违反平台协议)。以下是基于官方 API 的规范接入方法:
1. 开发者账号与应用准备
- 注册:访问京东开发平台,完成开发者账号注册(个人 / 企业实名认证)。
- 创建应用:在 “管理中心 - 应用管理” 创建应用,获取核心凭证:
AppKey:应用唯一标识AppSecret:应用密钥(需保密)access_token:部分接口需用户授权获取(如订单类),商品类接口可通过 “静默授权” 获取。
- 接口权限:在应用中申请目标接口权限(如商品查询、推广信息查询),等待审核。

2. 核心规则:API 签名机制
京东 API 要求请求参数生成MD5 签名(防止参数篡改),签名规则:
- 所有请求参数(除
sign外)按参数名 ASCII 码升序排列; - 拼接成
key1=value1&key2=value2格式的字符串; - 在字符串首尾拼接
AppSecret,得到AppSecret + 拼接字符串 + AppSecret; - 对拼接后的字符串做 MD5 加密,转大写得到
sign参数。
二、Python 实现京东 API 调用(以商品推广信息接口为例)
以下示例使用京东联盟「商品推广信息查询接口」(jd.union.open.goods.promotioninfo.get),可获取商品价格、佣金等信息。
1. 安装依赖库
bash
运行
pip install requests # 发送HTTP请求
pip install hashlib # 内置MD5加密,无需额外安装
2. 完整代码示例
python
运行
import requests
import hashlib
import time
import urllib.parse
# -------------------------- 配置项 --------------------------
APP_KEY = "你的AppKey"
APP_SECRET = "你的AppSecret"
API_URL = "https://router.jd.com/api" # 京东API网关地址
# -------------------------------------------------------------
def generate_sign(params, app_secret):
"""生成京东API签名"""
# 1. 按参数名ASCII升序排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接参数为key=value格式
sign_str = "&".join([f"{k}={urllib.parse.quote(str(v), safe='')}" for k, v in sorted_params])
# 3. 首尾拼接AppSecret
sign_str = app_secret + sign_str + app_secret
# 4. MD5加密并转大写
sign = hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()
return sign
def jd_api_request(method, params):
"""发送京东API请求"""
# 公共参数(所有接口必传)
common_params = {
"app_key": APP_KEY,
"method": method, # 接口名称
"format": "json", # 响应格式
"v": "1.0", # API版本
"timestamp": str(int(time.time() * 1000)), # 时间戳(毫秒)
"sign_method": "md5" # 签名方式
}
# 合并公共参数和业务参数
all_params = {**common_params, **params}
# 生成签名
all_params["sign"] = generate_sign(all_params, APP_SECRET)
# 发送GET请求(京东API优先GET,部分接口支持POST)
response = requests.get(API_URL, params=all_params, timeout=10)
# 解析响应
if response.status_code == 200:
result = response.json()
if result.get("code") == 0: # 接口调用成功
return result["result"]
else:
print(f"API调用失败:{result.get('msg')}")
return None
else:
print(f"HTTP请求失败,状态码:{response.status_code}")
return None
if __name__ == "__main__":
# 业务参数:查询商品推广信息(需替换为目标商品SKU)
business_params = {
"skuIds": "100012345678", # 商品SKU,多个用逗号分隔
"platform": 1, # 平台类型:1-京东APP,2-京东PC
"unionId": "你的联盟ID" # 京东联盟ID(需绑定应用)
}
# 调用接口
result = jd_api_request("jd.union.open.goods.promotioninfo.get", business_params)
if result:
print("商品信息:")
print(result)
三、关键说明
1. 接口选择
京东开放平台提供不同类型接口,常用接口参考:
- 商品基础信息:
jd.item.read.get(需权限) - 商品推广信息:
jd.union.open.goods.promotioninfo.get(联盟接口,权限易申请) - 订单查询:
jd.trade.order.info.get(需企业资质 + 高权限)
2. 常见问题解决
- 签名错误:检查参数排序、URL 编码、AppSecret 是否正确,时间戳是否为毫秒级。
- 权限不足:在开放平台 “应用管理 - 权限管理” 申请对应接口权限,审核通过后生效。
- 频率限制:京东 API 有 QPS 限制(一般 10-100 QPS),需添加请求间隔(如
time.sleep(0.1))。
四、合规与风险提示
- 禁止爬取非 API 数据:京东网页数据(如商品详情页 HTML)受反爬机制保护,且爬取非开放数据违反《京东开放平台服务协议》,可能导致账号封禁。
- API 调用规范:严格遵守接口频率限制,不得滥用 API 获取数据用于违规场景(如倒卖、恶意比价)。
- 数据用途:仅可用于自身应用开发,未经授权不得将获取的京东数据对外公开或商用。
五、扩展优化
- 异常处理:添加重试机制(如
tenacity库),处理网络波动或临时接口报错。 - 批量查询:部分接口支持批量 SKU 查询,减少请求次数(需符合接口参数限制)。
- 异步请求:使用
aiohttp替代requests,提高高并发场景下的调用效率。
如果需要调用其他接口,只需替换method(接口名称)和business_params(业务参数),签名逻辑和公共参数无需修改。

943

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



