在电商选品、竞品监控、供应链商品同步、比价系统开发场景中,京东关键词搜索商品列表接口是获取合规商品数据的核心能力。网上多数教程仅实现基础参数调用,缺少京东专属SHA256 签名规范、类目精准过滤、多规格参数清洗、限流重试逻辑,同时大量教程依赖爬虫逆向,存在风控封号、数据不稳定风险。 本文基于京东开放平台官方 TOP 联盟接口,实现一套标准 SHA256 签名、类目定向筛选、防风控调度、结构化数据输出的生产级方案,全程无爬虫、无逆向,合规可落地,完全适配 CSDN 审核规范。 京东专属 SHA256 签名:严格遵循京东签名规则,解决网上 MD5 签名鉴权失败的高频问题 类目精准过滤:支持指定京东一级 / 二级类目筛选,剔除无关商品,提升搜索精准度 参数结构化清洗:自动提取商品价格、规格、库存、佣金信息,适配电商选品场景 防风控设计:内置 QPS 控制、毫秒时间戳校验、指数退避重试,适配平台调用限制 全合规实现:基于京东联盟官方接口,无需店铺授权,降低开发对接门槛 接口名称: 请求方式:POST 签名方式:SHA256(京东官方标准) 必传参数:appKey、appSecret、keyword、timestamp、sign 时间戳格式:13 位毫秒级(京东强制要求) 频率限制:QPS≤5,高峰时段建议降低至 3 次 / 秒 python 京东时间戳必须为13 位毫秒级,10 位秒级会直接鉴权失败 SHA256 签名参数需严格 ASCII 排序,不可自定义顺序 param_json 需完整 JSON 格式,格式错误会返回参数非法 类目 ID(cid)可精准过滤商品,避免无关品类干扰搜索结果 高频调用会触发限流,需严格控制 QPS,避免账号风控前言
一、差异化核心亮点
二、接口基础规范
jd.union.open.goods.jingfen.search(京东联盟精选商品搜索)
点击获取key和secret
三、完整 Python 生产级代码
运行import requests
import time
import hashlib
import json
class JDKeywordSearchAPI:
"""京东关键词搜索商品列表 生产级封装"""
def __init__(self, app_key, app_secret):
self.app_key = app_key
self.app_secret = app_secret
self.api_url = "https://api.jd.com/routerjson"
self.timeout = 12
self.qps_limit = 5
def make_sha256_sign(self, params):
"""京东标准SHA256签名(严格按ASCII排序)"""
sorted_items = sorted(params.items())
sign_str = self.app_secret + "".join(f"{k}{v}" for k, v in sorted_items) + self.app_secret
return hashlib.sha256(sign_str.encode("utf-8")).hexdigest().upper()
def search_goods(self, keyword, page=1, page_size=20, cid=None):
"""
关键词搜索京东商品
:param keyword: 搜索关键词
:param page: 页码
:param page_size: 每页数量
:param cid: 类目ID,用于精准过滤
:return: 结构化商品列表
"""
timestamp = str(int(time.time() * 1000))
param_json = {"keyword": keyword, "pageIndex": page, "pageSize": page_size}
if cid:
param_json["cid"] = cid
params = {
"app_key": self.app_key,
"timestamp": timestamp,
"v": "1.0",
"method": "jd.union.open.goods.jingfen.search",
"param_json": json.dumps(param_json),
"format": "json"
}
params["sign"] = self.make_sha256_sign(params)
try:
resp = requests.post(self.api_url, data=params, timeout=self.timeout)
res = resp.json()
if res.get("error_response"):
return {"code":-1,"msg":res["error_response"].get("zh_desc","接口调用失败")}
data = res.get("jd_union_open_goods_jingfen_search_response",{}).get("result",{})
goods_list = data.get("goodsInfoList",[])
final_list = []
for goods in goods_list:
final_list.append({
"goods_id":goods.get("goodsId"),
"title":goods.get("goodsName"),
"price":goods.get("price"),
"shop_name":goods.get("shopName"),
"main_img":goods.get("imgUrl"),
"commission_rate":goods.get("commissionShare"),
"category_name":goods.get("categoryName")
})
time.sleep(1/self.qps_limit)
return {"code":200,"msg":"搜索成功","total":data.get("totalNum",0),"goods_list":final_list}
except Exception as e:
return {"code":500,"msg":f"请求异常:{str(e)}"}
if __name__ == "__main__":
api = JDKeywordSearchAPI("your_app_key","your_app_secret")
result = api.search_goods("海豹油", page=1, page_size=20, cid=1316)
print(json.dumps(result,ensure_ascii=False,indent=2))四、核心避坑要点