如何使用京东开放平台API获取店铺所有商品

3 阅读2分钟

在电商开发中,整合京东平台数据是常见需求。本文将一步步指导您通过京东开放平台API获取指定店铺的所有商品信息。京东API采用OAuth 2.0认证,支持分页查询,确保数据完整获取。以下是详细实现方案(基于京东开放平台最新文档,实际使用时请参考官方文档确认细节)。

步骤1: 准备工作

  • 注册开发者账号:访问京东开放平台,注册账号并创建应用,获取App KeyApp Secret
  • 权限申请:在控制台申请“商品信息读取”权限,审核通过后获得API调用资格。
  • 工具准备:推荐使用Python语言,安装requests库处理HTTP请求。

步骤2: 确定API接口

京东提供多个商品相关API,核心接口为jingdong.goods.get(获取单个商品)和jingdong.goods.search(搜索商品)。要获取所有商品,需使用搜索接口并添加店铺ID参数:

  • API端点https://api.jd.com/routerjson

  • 请求方法:POST

  • 关键参数

    • method: 设为jingdong.goods.search
    • shop_id: 店铺唯一ID(可从商家后台获取)
    • page_no: 页码(从1开始)
    • page_size: 每页商品数(建议设为100,京东API上限)
    • 其他参数如access_token(认证令牌)需动态生成。

步骤3: 处理认证和分页

京东API需签名认证,使用HMAC-SHA256算法生成签名。分页逻辑基于总商品数NN和每页大小SS,计算总页数:

总页数=NS\text{总页数} = \left\lceil \frac{N}{S} \right\rceil

其中NN通过首次API响应中的total字段获取,SSpage_size。循环调用API直到所有页遍历完成。

步骤4: 代码实现示例

以下Python代码演示完整流程(使用伪参数,替换为您的App KeyApp Secretshop_id):

import requests
import hashlib
import time
import json

# 配置参数
app_key = "YOUR_APP_KEY"
app_secret = "YOUR_APP_SECRET"
shop_id = "YOUR_SHOP_ID"  # 替换为实际店铺ID
access_token = "YOUR_ACCESS_TOKEN"  # 通过OAuth流程获取

def generate_sign(params, app_secret):
    """生成API签名(HMAC-SHA256)"""
    sorted_params = sorted(params.items())
    query_str = app_secret + ''.join([f"{k}{v}" for k, v in sorted_params]) + app_secret
    return hashlib.sha256(query_str.encode('utf-8')).hexdigest().upper()

def fetch_all_goods(shop_id, max_page_size=100):
    """获取店铺所有商品"""
    base_url = "https://api.jd.com/routerjson"
    all_goods = []
    page_no = 1
    total_pages = 1  # 初始值,后续更新
    
    while page_no <= total_pages:
        # 构建请求参数
        params = {
            "method": "jingdong.goods.search",
            "timestamp": str(int(time.time())),
            "format": "json",
            "v": "2.0",
            "app_key": app_key,
            "shop_id": shop_id,
            "page_no": page_no,
            "page_size": max_page_size,
            "access_token": access_token
        }
        params["sign"] = generate_sign(params, app_secret)
        
        # 发送API请求
        response = requests.post(base_url, data=params)
        data = response.json()
        
        # 错误处理
        if "error_response" in data:
            error_code = data["error_response"]["code"]
            error_msg = data["error_response"]["msg"]
            raise Exception(f"API错误: 代码{error_code}, 消息: {error_msg}")
        
        # 解析数据
        result = data["jingdong_goods_search_responce"]["result"]
        goods_list = result["goods_list"]
        total_goods = result["total"]  # 总商品数
        all_goods.extend(goods_list)
        
        # 更新分页信息
        total_pages = (total_goods + max_page_size - 1) // max_page_size  # 计算总页数: $\left\lceil \frac{N}{S} \right\rceil$
        page_no += 1
    
    return all_goods

# 执行示例
try:
    goods_data = fetch_all_goods(shop_id)
    print(f"成功获取{len(goods_data)}个商品")
    # 可保存为JSON文件: with open("jd_goods.json", "w") as f: json.dump(goods_data, f)
except Exception as e:
    print(f"获取失败: {e}")

步骤5: 数据解析与处理

API响应为JSON格式,关键字段包括:

  • goods_list: 商品数组,每个商品含sku_id(商品ID)、name(名称)、price(价格)等。
  • total: 总商品数,用于分页控制。
    建议存储到数据库或文件(如JSON/CSV),便于后续分析。

注意事项

  1. 频率限制:京东API有调用频率限制(通常100次/分钟),超出会报错code: 13,需添加延时(如time.sleep(0.5))。
  2. 认证更新access_token有效期2小时,过期需刷新(使用refresh_token)。
  3. 数据完整性:确保处理网络异常(添加重试机制),并校验响应中的total与实际获取数是否一致。
  4. 官方参考:京东API可能更新,请定期查看文档

通过以上步骤,您可以高效集成京东商品数据。如有疑问,欢迎在评论区讨论!