一、技术准备

注册京东开放平台账号

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

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

二、核心API接口解析

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

功能:通过商品ID或SKU ID列表获取SKU详情(价格、库存、规格等)。请求参数: 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:包含skuId、price(价格)、stockQuantity(库存)、specifications(规格)等。 商品列表批量查询接口(推荐jd.union.open.goods.query)

功能:按条件筛选商品(类目、价格区间、销量排序等),支持分页。请求参数: 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

import hashlibimport timedef 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_secretreturn 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

import requestsimport jsonimport timeclass JDSKUFetcher:def __init__(self, app_key, app_secret):self.app_key = app_keyself.app_secret = app_secretself.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_secretreturn 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")# 获取单个商品的所有SKUsku_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])

五、批量处理与数据存储

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

python

from concurrent.futures import ThreadPoolExecutordef 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 数据存储到SQLite

python

import sqlite3class 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()

六、注意事项与合规要求

调用频率限制:京东API对未认证应用限制10次/秒,认证后提升至50次/秒,需通过time.sleep()控制请求间隔。数据隐私保护:禁止抓取用户手机号、地址等敏感信息,仅用于合法用途(如价格监控、库存分析)。错误重试机制: 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)continueexcept Exception as e:logging.error(f"请求失败: {str(e)}")breakreturn Nonereturn wrapper 遵守京东开放平台规则:定期检查API文档更新,避免使用已废弃接口。

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

2025-12-07 03:10:09