×

京东店铺全量商品接口:分页边界修复与数据完整性采集方案

Ace Ace 发表于2026-08-19 17:13:53 浏览7 评论0

抢沙发发表评论

京东店铺商品列表接口(jd.union.open.shop.goods.get)是竞品店铺盘点、铺货监控、店铺商品巡检的核心接口。网上绝大多数教程仅实现基础分页循环调用,完全忽略平台隐性限制:接口存在100页分页上限、超页返回空数据、上下架商品混杂、翻页数据重复漂移等问题,导致批量采集漏数据、数据冗余错乱。本文跳出基础参数教学,聚焦全量数据完整性、分页边界容错、脏数据过滤,提供一套生产级稳定采集封装方案。
该接口区别于关键词搜索接口,可精准抓取指定店铺全部商品,支持区分在售、下架商品,但原生接口无自动终止机制,无脑翻页极易造成任务空跑、数据缺失,是开发对接的核心难点。


一、核心踩坑痛点梳理
1. 分页硬限制:官方隐性限制最大有效页码100,超出后永久返回空列表,普通循环无法抓取全量商品;2. 数据混杂问题:默认返回包含下架、预售商品,干扰正常业务统计;3. 分页漂移:高频翻页易出现商品重复推送,无去重机制会导致数据冗余。

点击获取key和secret
二、生产级完整封装代码

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,针对性解决漏采、重采、空跑问题,结构化输出纯净在售商品数据。适用于店铺竞品分析、商品盘点、定时巡检等生产场景,稳定性远高于通用基础示例。

群贤毕至

访客