一、技术准备
-
注册京东开放平台账号
- 访问京东开放平台完成注册,需提供企业资质(营业执照等)。
- 创建应用:登录后进入「开发者中心」→「应用管理」→「创建应用」,填写应用名称、描述等信息,提交审核通过后获取AppKey 和AppSecret。
-
- 在应用管理页面,为应用添加「商品查询」相关权限(如
jd.item.sku.info.get
、jd.union.open.goods.query
等)。 - 提交权限申请后,等待京东审核(通常1-3个工作日)。
- 在应用管理页面,为应用添加「商品查询」相关权限(如
二、核心API接口解析
-
SKU信息查询接口 (推荐
jd.item.sku.info.get
)-
功能:通过商品ID或SKU ID列表获取SKU详情(价格、库存、规格等)。
-
请求参数:
csharppython 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
)-
功能:按条件筛选商品(类目、价格区间、销量排序等),支持分页。
-
请求参数:
csharppython 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])
五、批量处理与数据存储
-
分布式爬取架构(使用线程池)
pythonpython 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
-
数据存储到SQLite
pythonpython 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()
六、注意事项与合规要求
-
调用频率限制 :京东API对未认证应用限制10次/秒,认证后提升至50次/秒,需通过
time.sleep()
控制请求间隔。 -
数据隐私保护:禁止抓取用户手机号、地址等敏感信息,仅用于合法用途(如价格监控、库存分析)。
-
错误重试机制:
pythonpython 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
-
遵守京东开放平台规则:定期检查API文档更新,避免使用已废弃接口。
通过本指南,您可以高效、合规地批量获取京东商品SKU信息,适用于价格监控、库存管理、竞品分析等场景。