京东批量获取商品SKU操作指南

一、技术准备

  1. 注册京东开放平台账号

    • 访问京东开放平台完成注册,需提供企业资质(营业执照等)。
    • 创建应用:登录后进入「开发者中心」→「应用管理」→「创建应用」,填写应用名称、描述等信息,提交审核通过后获取AppKeyAppSecret
  2. API权限申请

    • 在应用管理页面,为应用添加「商品查询」相关权限(如jd.item.sku.info.getjd.union.open.goods.query等)。
    • 提交权限申请后,等待京东审核(通常1-3个工作日)。

二、核心API接口解析

  1. SKU信息查询接口 (推荐jd.item.sku.info.get

    • 功能:通过商品ID或SKU ID列表获取SKU详情(价格、库存、规格等)。

    • 请求参数

      csharp 复制代码
      python
      params = {
          "method": "jd.item.sku.info.get",
          "app_key": "YOUR_APP_KEY",
          "item_id": "商品ID",  # 或通过skuIds批量查询
          "skuIds": "SKU_ID_1,SKU_ID_2",  # 多个SKU用逗号分隔
          "timestamp": int(time.time() * 1000),  # 毫秒级时间戳
          "v": "2.0",
          "sign_method": "md5"  # 签名算法
      }
    • 响应字段

      • skuInfo:包含skuIdprice(价格)、stockQuantity(库存)、specifications(规格)等。
  2. 商品列表批量查询接口 (推荐jd.union.open.goods.query

    • 功能:按条件筛选商品(类目、价格区间、销量排序等),支持分页。

    • 请求参数

      csharp 复制代码
      python
      params = {
          "method": "jd.union.open.goods.query",
          "app_key": "YOUR_APP_KEY",
          "pageIndex": 1,  # 页码
          "pageSize": 20,  # 每页数量
          "sortType": 3,  # 按销量排序(3为销量降序)
          "timestamp": int(time.time() * 1000),
          "v": "1.0",
          "sign_method": "md5"
      }
    • 响应字段

      • wareInfoVos:包含商品名称、价格、销量、主图URL等。

三、认证与签名流程

python 复制代码
python
import hashlib
import time
 
def generate_sign(params, app_secret):
    # 按字母顺序排序参数
    sorted_params = sorted(params.items(), key=lambda x: x[0])
    # 拼接查询字符串
    query_str = ''.join([f"{k}{v}" for k, v in sorted_params])
    # 拼接AppSecret并生成MD5签名
    sign_str = query_str + app_secret
    return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()
 
# 示例:生成签名
params = {
    "method": "jd.item.sku.info.get",
    "app_key": "YOUR_APP_KEY",
    "item_id": "123456",
    "timestamp": int(time.time() * 1000),
    "v": "2.0"
}
params['sign'] = generate_sign(params, 'YOUR_APP_SECRET')

四、完整代码示例(Python)

python 复制代码
python
import requests
import json
import time
 
class JDSKUFetcher:
    def __init__(self, app_key, app_secret):
        self.app_key = app_key
        self.app_secret = app_secret
        self.base_url = "https://api.jd.com/routerjson"
 
    def fetch_sku_info(self, item_id, sku_ids=None):
        """获取单个商品或多个SKU的详情"""
        params = {
            "method": "jd.item.sku.info.get",
            "app_key": self.app_key,
            "item_id": item_id,
            "timestamp": int(time.time() * 1000),
            "v": "2.0",
            "sign_method": "md5"
        }
        if sku_ids:
            params["skuIds"] = ','.join(map(str, sku_ids))
        params['sign'] = self.generate_sign(params)
        response = requests.post(self.base_url, data=params)
        return self.parse_response(response)
 
    def generate_sign(self, params):
        """生成MD5签名"""
        sorted_params = sorted(params.items(), key=lambda x: x[0])
        query_str = ''.join([f"{k}{v}" for k, v in sorted_params])
        sign_str = query_str + self.app_secret
        return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()
 
    def parse_response(self, response):
        """解析京东API响应"""
        if response.status_code != 200:
            raise Exception(f"HTTP错误: {response.status_code}")
        data = response.json()
        if data.get('error_code') != '0':
            raise Exception(f"API错误: {data.get('error_msg')}")
        return data.get('jd_item_sku_info_get_response', {}).get('skuInfo', [])
 
# 使用示例
if __name__ == "__main__":
    fetcher = JDSKUFetcher("YOUR_APP_KEY", "YOUR_APP_SECRET")
    # 获取单个商品的所有SKU
    sku_list = fetcher.fetch_sku_info(item_id="123456")
    print(json.dumps(sku_list, indent=2))
    
    # 获取多个指定SKU的详情
    # sku_details = fetcher.fetch_sku_info(sku_ids=[1001, 1002, 1003])

五、批量处理与数据存储

  1. 分布式爬取架构(使用线程池)

    python 复制代码
    python
    from concurrent.futures import ThreadPoolExecutor
     
    def batch_fetch(sku_ids):
        with ThreadPoolExecutor(max_workers=5) as executor:
            futures = [executor.submit(fetcher.fetch_sku_info, sku_id) for sku_id in sku_ids]
            results = [f.result() for f in futures]
        return results
  2. 数据存储到SQLite

    python 复制代码
    python
    import sqlite3
     
    class DataStorage:
        def __init__(self):
            self.conn = sqlite3.connect('jd_sku.db')
            self._create_table()
     
        def _create_table(self):
            cursor = self.conn.cursor()
            cursor.execute('''
                CREATE TABLE IF NOT EXISTS sku_data (
                    sku_id INTEGER PRIMARY KEY,
                    item_id TEXT,
                    price REAL,
                    stock INTEGER,
                    specs TEXT
                )
            ''')
            self.conn.commit()
     
        def save_data(self, sku_info):
            cursor = self.conn.cursor()
            for sku in sku_info:
                cursor.execute('''
                    INSERT OR REPLACE INTO sku_data 
                    VALUES (?, ?, ?, ?, ?)
                ''', (
                    sku.get('skuId'),
                    sku.get('itemId'),
                    sku.get('price'),
                    sku.get('stockQuantity'),
                    json.dumps(sku.get('specifications'))
                ))
            self.conn.commit()

六、注意事项与合规要求

  1. 调用频率限制 :京东API对未认证应用限制10次/秒,认证后提升至50次/秒,需通过time.sleep()控制请求间隔。

  2. 数据隐私保护:禁止抓取用户手机号、地址等敏感信息,仅用于合法用途(如价格监控、库存分析)。

  3. 错误重试机制

    python 复制代码
    python
    def safe_request(func):
        def wrapper(*args, **kwargs):
            for _ in range(3):
                try:
                    return func(*args, **kwargs)
                except (requests.ConnectionError, requests.Timeout):
                    time.sleep(2)
                    continue
                except Exception as e:
                    logging.error(f"请求失败: {str(e)}")
                    break
            return None
        return wrapper
  4. 遵守京东开放平台规则:定期检查API文档更新,避免使用已废弃接口。

通过本指南,您可以高效、合规地批量获取京东商品SKU信息,适用于价格监控、库存管理、竞品分析等场景。

相关推荐
恋猫de小郭4 小时前
Flutter Zero 是什么?它的出现有什么意义?为什么你需要了解下?
android·前端·flutter
牛奔5 小时前
Go 如何避免频繁抢占?
开发语言·后端·golang
想用offer打牌10 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
崔庆才丨静觅10 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606111 小时前
完成前端时间处理的另一块版图
前端·github·web components
KYGALYX11 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了11 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅11 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅12 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端