jd.union.open.goods.search接口,第三方常简称为item_search),是合法、高效获取商品搜索数据的官方通道,支持按关键词、价格区间、类目、销量等多条件筛选,返回商品ID、标题、价格、销量、店铺信息等结构化数据。一、前置认知:item_search接口核心说明(实战必看)
jd.union.open.goods.search(联盟版)或自营相关搜索接口,核心功能一致,均用于通过关键词检索商品列表。1.1 核心功能
关键词搜索:支持单个/多个关键词组合搜索(空格代表“且”,
+代表“或”,-代表排除),比如“无线蓝牙耳机 + 主动降噪 - 入耳式”可精准筛选目标商品。多条件筛选:可搭配价格区间、类目ID、是否自营、是否有优惠券等条件,缩小搜索范围,提升数据精准度。
分页与排序:支持分页查询(最大50页,每页最多50条),可按价格、销量、佣金等字段升序/降序排序,适配不同业务需求。
数据返回:返回商品基础信息(ID、标题、主图)、价格信息(原价、促销价)、销量、店铺信息、优惠券等核心字段,可直接用于业务开发。
1.2 实战核心前提
App Key:应用唯一标识,用于京东开放平台识别调用方身份。
App Secret:应用密钥,用于生成请求签名,验证请求合法性,严禁泄露。
Access Token(可选):部分接口(如联盟版)需要用户授权后获取,用于访问敏感数据(如精准销量、佣金),基础搜索可无需此凭证。
1.3 调用限制(实战避坑重点)
QPS限制:默认每秒最多调用5次,批量调用需设置1-2秒间隔,避免触发限流。
分页限制:最大支持50页,每页最多50条,超出部分会被截断,如需全量数据,可按价格段、销量段拆分多次搜索。
字段限制:部分敏感字段(如精准销量、转化率)需申请专项权限,未授权无法获取。
二、前置准备:获取接口调用凭证( step by step 演练)
step 1:注册并认证京东开放平台账号
访问京东开放平台官网(https://open.jd.com/),点击右上角「注册」,选择「开发者注册」,使用京东账号登录。
登录后,完成开发者认证:个人开发者选择「个人认证」(适合基础演练、个人项目),企业开发者选择「企业认证」(权限更高,支持更多字段调用)。
认证材料:个人认证需上传身份证正反面、人脸识别;企业认证需上传营业执照、法人信息,审核通常1-2个工作日可通过。
step 2:创建应用,获取App Key和App Secret
认证通过后,进入「开发者控制台」,点击左侧「应用管理」→「创建应用」。
选择应用类型:实战演练推荐选择「服务型应用」,适配商品搜索接口调用场景,填写应用名称(如“京东item_search实战演练”)、应用描述、应用场景(如“电商数据分析”)。
提交应用审核,审核通过后,进入应用详情页,即可看到「App Key」和「App Secret」,复制保存(建议加密存储,严禁明文泄露)。
step 3:申请item_search接口权限
在应用详情页,找到「接口管理」→「接口申请」,搜索「jd.union.open.goods.search」(item_search核心对应接口)。
点击「申请权限」,填写申请理由(如“实战演练,用于学习京东接口调用,获取商品搜索数据”),提交后等待审核,个人开发者基础权限通常可快速通过。
权限申请通过后,在「已申请接口」中确认接口状态为“可用”,即可开始调用演练。
step 4:环境准备(代码实战前置)
安装Python(3.7及以上版本),官网下载即可(https://www.python.org/)。
安装核心依赖库:requests(用于发送HTTP请求),打开命令行,执行命令:
pip install requests。准备代码编辑工具(如PyCharm、VS Code,新手可用记事本直接编写)。
三、核心实战:item_search接口调用全流程演练
3.1 核心参数详解(实战重点)
参数类型 | 参数名 | 是否必传 | 类型 | 说明 | 实战示例值 |
|---|---|---|---|---|---|
公共参数 | method | ✅ | String | 接口方法名,固定为jd.union.open.goods.search | jd.union.open.goods.search |
app_key | ✅ | String | 应用唯一标识,从应用详情页获取 | 1234567890abcdef | |
sign | ✅ | String | 按规则生成的签名,验证请求合法性(核心) | 8E2F5A7B9C1D3E5F7A9B2C4D6E8F0A1B | |
timestamp | ✅ | String | 请求时间戳,格式yyyy-MM-dd HH:mm:ss(无毫秒),时间误差不超过10分钟 | 2026-05-11 17:55:00 | |
v | ✅ | String | API协议版本,固定为1.0 | 1.0 | |
业务参数 | keyword | ✅ | String | 搜索关键词,支持多词组合 | 无线蓝牙耳机 主动降噪 |
pageIndex | ❌ | Integer | 页码,默认1,最大50 | 1 | |
pageSize | ❌ | Integer | 每页条数,默认20,最大50 | 20 | |
priceFrom | ❌ | Double | 价格区间最小值 | 100.00 | |
priceTo | ❌ | Double | 价格区间最大值 | 500.00 | |
sortName | ❌ | String | 排序字段:price(价格)、sales(销量)、commission(佣金) | sales |
3.2 签名生成(实战难点,必看)
收集所有请求参数(公共参数+业务参数),排除sign本身。
过滤参数中的空值(避免签名计算错误),将剩余参数按参数名的ASCII码升序排序。
按「key=value&key=value」的格式拼接参数,去除最后一个「&」,再拼接App Secret。
对拼接后的字符串执行MD5加密,生成32位大写字符串,即为sign值。
3.3 代码实战(可直接复制运行)
实战代码(注释详细,新手可看懂)
import requests
import time
import hashlib
import json
# 1. 配置自身应用信息(替换为你自己的App Key和App Secret)
APP_KEY = "你的App Key"
APP_SECRET = "你的App Secret"
# 接口请求地址(京东开放平台官方地址,固定不变)
API_URL = "
def generate_sign(params):
"""
生成接口调用签名(核心函数,直接复用)
:param params: 所有请求参数(字典类型)
:return: 32位大写签名字符串
"""
# 步骤1:过滤空值参数,避免签名错误
valid_params = {k: v for k, v in params.items() if v is not None and v != ""}
# 步骤2:按参数名ASCII码升序排序
sorted_params = sorted(valid_params.items(), key=lambda x: x[0])
# 步骤3:拼接参数为"key=value&key=value"格式
sign_str = "&".join([f"{k}={v}" for k, v in sorted_params])
# 步骤4:拼接App Secret,执行MD5加密并转大写
sign_str += APP_SECRET
sign = hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()
return sign
def jd_item_search(keyword, page=1, page_size=20, price_min=None, price_max=None, sort="sales"):
"""
京东item_search接口调用函数,获取商品搜索结果
:param keyword: 搜索关键词
:param page: 页码
:param page_size: 每页条数
:param price_min: 价格最小值
:param price_max: 价格最大值
:param sort: 排序字段(sales=销量,price=价格)
:return: 商品搜索结果(字典),调用失败返回None
"""
# 2. 构造业务参数(根据需求调整)
biz_params = {
"keyword": keyword,
"pageIndex": page,
"pageSize": page_size,
"sortName": sort,
"sort": "desc" # 排序方式:desc=降序,asc=升序
}
# 可选参数:价格区间(有需求则添加,无则不添加)
if price_min is not None:
biz_params["priceFrom"] = price_min
if price_max is not None:
biz_params["priceTo"] = price_max
# 3. 构造公共参数
public_params = {
"app_key": APP_KEY,
"method": "jd.union.open.goods.search",
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"), # 生成当前时间戳
"v": "1.0",
"format": "json",
"param_json": json.dumps(biz_params) # 业务参数转为JSON字符串
}
# 4. 生成签名并添加到公共参数中
public_params["sign"] = generate_sign(public_params)
try:
# 5. 发送POST请求(京东接口推荐POST方式,避免参数暴露)
response = requests.post(
url=API_URL,
data=public_params,
headers={"Content-Type": "application/x-www-form-urlencoded"},
timeout=15 # 超时时间15秒,避免卡壳
)
# 6. 解析响应数据(JSON格式)
result = response.json()
# 7. 处理响应结果,判断是否调用成功
if "error_response" in result:
# 调用失败,打印错误信息
error_code = result["error_response"]["code"]
error_msg = result["error_response"]["zh_desc"]
print(f"接口调用失败【错误码:{error_code}】:{error_msg}")
return None
else:
# 调用成功,提取商品数据并返回
response_data = result["jd_union_open_goods_search_response"]["result"]
data_json = json.loads(response_data)
if data_json["code"] == 200:
return {
"total_count": data_json["totalCount"], # 总商品数
"page": page,
"page_size": page_size,
"goods_list": data_json["data"]["goodsList"] # 商品列表
}
else:
print(f"商品搜索失败:{data_json['message']}")
return None
except requests.exceptions.Timeout:
print("请求超时,请检查网络连接或重试")
return None
except Exception as e:
print(f"接口调用异常:{str(e)}")
return None
# 8. 实战测试(直接运行代码即可)
if __name__ == "__main__":
# 测试关键词:无线蓝牙耳机,筛选100-500元,按销量降序,第1页,每页20条
search_result = jd_item_search(
keyword="无线蓝牙耳机 主动降噪",
page=1,
page_size=20,
price_min=100.00,
price_max=500.00,
sort="sales"
)
# 打印搜索结果
if search_result:
print(f"\n===== 京东关键词搜索结果 =====")
print(f"搜索关键词:无线蓝牙耳机 主动降噪")
print(f"总商品数:{search_result['total_count']}")
print(f"当前页码:第{search_result['page']}页(每页{search_result['page_size']}条)")
print(f"\n前5条商品详情:")
# 遍历前5条商品,打印核心信息
for i, goods in enumerate(search_result["goods_list"][:5], 1):
print(f"\n商品{i}:")
print(f"商品ID:{goods['skuId']}")
print(f"商品标题:{goods['skuName']}")
print(f"商品价格:{goods['price']}元")
print(f"商品销量:{goods['sales']}件")
print(f"商品主图:{goods['imgUrl']}")
print(f"店铺名称:{goods['shopName']}")3.4 运行结果说明(实战验证)
===== 京东关键词搜索结果 ===== 搜索关键词:无线蓝牙耳机 主动降噪 总商品数:1286 当前页码:第1页(每页20条) 前5条商品详情: 商品1: 商品ID:100056789012 商品标题:【官方正品】无线蓝牙耳机 主动降噪 长续航 入耳式 适配苹果华为 商品价格:299.00元 商品销量:12580件 商品主图:https://img10.jd.com/imagetools/jfs/t1/12345/36/123456/123456/64a7b8c9d0e1f2/abcdef123456.jpg 店铺名称:XXX官方旗舰店 商品2: 商品ID:100045678901 商品标题:无线蓝牙耳机 主动降噪 头戴式 高音质 游戏专用 商品价格:399.00元 商品销量:8960件 商品主图:https://img11.jd.com/imagetools/jfs/t1/23456/45/234567/234567/64a7b8c9d0e1f2/123456abcdef.jpg 店铺名称:XXX数码旗舰店
四、实战避坑:常见错误及解决方案(重中之重)
4.1 签名错误(错误码:40005)
原因1:参数未按ASCII码排序,或未过滤空值。解决方案:复用代码中的generate_sign函数,无需手动排序,函数已处理空值和排序。
原因2:时间戳格式错误(带毫秒、时区错误)。解决方案:使用代码中的time.strftime函数生成时间戳,格式为yyyy-MM-dd HH:mm:ss,无毫秒。
原因3:App Secret填写错误,或拼接签名时遗漏App Secret。解决方案:核对App Secret,确保与应用详情页一致,检查签名生成函数中的拼接逻辑。
4.2 权限不足(错误码:40010)
原因1:未申请jd.union.open.goods.search接口权限。解决方案:回到应用详情页,重新申请接口权限,等待审核通过。
原因2:申请的权限等级不足,无法访问敏感字段。解决方案:若需获取销量、佣金等字段,需升级权限或申请专项权限。
4.3 调用频率超限(错误码:40007)
原因:短时间内调用次数超过QPS限制(默认≤5次/秒)。解决方案:批量调用时,在请求之间添加1-2秒间隔,可在代码中添加time.sleep(1)。
4.4 商品搜索无结果(错误码:200,但无商品数据)
原因1:关键词过于特殊,或价格区间设置不合理(如价格过低/过高)。解决方案:调整关键词(如去掉过于细分的描述),修改价格区间。
原因2:类目ID错误(若添加了categoryId参数)。解决方案:通过京东类目查询接口获取正确的三级类目ID,或删除categoryId参数,不限制类目。
五、实战进阶:接口调用优化与合规注意事项
5.1 调用优化(实战效率提升)
字段优化:无需获取所有字段,可通过参数筛选所需字段,减少数据传输,提升响应速度。
缓存机制:对高频搜索的关键词结果进行缓存(如Redis缓存),缓存时间设置1-3小时,减少接口调用次数,避免限流。
重试机制:添加异常重试逻辑(如最多重试3次),针对网络波动、临时限流等情况,提升调用成功率。
分页处理:若需获取超过50页的数据,按价格段、销量段拆分多次搜索,避免深度分页被截断。
5.2 合规注意事项(避免账号/应用被处罚)
严禁泄露App Secret:App Secret是核心密钥,严禁在前端代码、公开仓库中泄露,建议在后端加密存储。
遵守调用限制:不得恶意刷接口、超出QPS限制,否则会被限制调用,甚至封禁应用。
数据合规使用:获取的商品数据仅用于自身业务需求,不得泄露、倒卖,不得用于恶意竞争(如恶意比价、虚假宣传)。
遵守平台规则:不得利用接口数据损害京东平台、卖家、买家利益,定期查看京东开放平台接口更新通知,适配接口版本变化。