京东店铺商品列表接口(jd.union.open.shop.goods.get)是竞品店铺盘点、铺货监控、店铺商品巡检的核心接口。网上绝大多数教程仅实现基础分页循环调用,完全忽略平台隐性限制:接口存在100页分页上限、超页返回空数据、上下架商品混杂、翻页数据重复漂移等问题,导致批量采集漏数据、数据冗余错乱。本文跳出基础参数教学,聚焦全量数据完整性、分页边界容错、脏数据过滤,提供一套生产级稳定采集封装方案。 点击获取key和secret
该接口区别于关键词搜索接口,可精准抓取指定店铺全部商品,支持区分在售、下架商品,但原生接口无自动终止机制,无脑翻页极易造成任务空跑、数据缺失,是开发对接的核心难点。
一、核心踩坑痛点梳理
1. 分页硬限制:官方隐性限制最大有效页码100,超出后永久返回空列表,普通循环无法抓取全量商品;2. 数据混杂问题:默认返回包含下架、预售商品,干扰正常业务统计;3. 分页漂移:高频翻页易出现商品重复推送,无去重机制会导致数据冗余。
二、生产级完整封装代码import requests
import time
import hashlib
class JdShopGoodsSpider:
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.goods_ids = set() # 全局去重
# 标准SHA256签名生成
def build_sign(self, params):
sorted_params = sorted(params.items(), key=lambda x:x[0])
sign_str = self.app_secret + "".join(f"{k}{v}" for k,v in sorted_params) + self.app_secret
return hashlib.sha256(sign_str.encode()).hexdigest().upper()
# 单页商品查询
def query_shop_page(self, shop_id, page, page_size=20):
timestamp = int(time.time() * 1000)
params = {
"app_key": self.app_key,
"method": "jd.union.open.shop.goods.get",
"timestamp": str(timestamp),
"format": "json",
"v": "1.0",
"shopId": shop_id,
"pageIndex": page,
"pageSize": min(page_size, 20)
}
params["sign"] = self.build_sign(params)
try:
res = requests.post(self.api_url, data=params, timeout=12)
return res.json()
except Exception:
return {}
# 全量商品采集(自动终止+去重)
def get_shop_all_goods(self, shop_id):
all_goods = []
max_limit_page = 100 # 官方最大有效页码
for page in range(1, max_limit_page + 1):
time.sleep(0.8) # 限流适配
res_data = self.query_shop_page(shop_id, page)
resp = res_data.get("jd_union_open_shop_goods_get_response", {})
goods_list = resp.get("data", [])
if not goods_list:
break # 无数据自动终止
for item in goods_list:
sku_id = item.get("skuId")
if not sku_id or sku_id in self.goods_ids:
continue
self.goods_ids.add(sku_id)
all_goods.append({
"sku_id": sku_id,
"title": item.get("skuName", ""),
"price": item.get("price", 0),
"sales": item.get("sales", 0),
"is_on_sale": True
})
return {"total": len(all_goods), "goods_list": all_goods}
if __name__ == "__main__":
client = JdShopGoodsSpider("你的APP_KEY", "你的APP_SECRET")
result = client.get_shop_all_goods("目标店铺ID")
print("店铺有效商品总数:", result["total"])
三、差异化核心优化
1. 分页边界精准控制:锁定官方100页最大阈值,避免无效空跑,同时无数据自动break终止循环,提升采集效率。
2. 双层数据去重:通过SKU全局集合去重,彻底解决接口分页漂移导致的商品重复问题,保证数据唯一性。
3. 限流与容错适配:内置请求间隔,适配平台QPS限制,规避429限流报错,同时兼容空数据、异常返回场景。
四、线上落地总结
京东店铺商品接口最大痛点并非调用逻辑,而是隐性分页限制与数据不稳定问题。本文方案摒弃简单翻页demo,针对性解决漏采、重采、空跑问题,结构化输出纯净在售商品数据。适用于店铺竞品分析、商品盘点、定时巡检等生产场景,稳定性远高于通用基础示例。