京东商品数据采集 API 接口接入全流程

京东API商品数据采集指南

一、前期准备:注册与认证

  1. 注册京东开发者账号

    • 访问京东开放平台 ,点击 "注册",选择 "开发者账号"
    • 个人开发者:完成实名认证 (身份证 + 人脸识别)
    • 企业开发者:提交营业执照 + 对公账户验证 (推荐,QPS 可达 100 次 / 分钟)
  2. 创建应用获取凭证

    • 登录后进入 "应用管理",创建 "电商服务类" 应用
    • 填写应用名称 (如 "XX 商品数据分析系统"),提交审核
    • 审核通过后获取三大凭证:
      • AppKey:应用唯一标识 (公开)
      • AppSecret:签名密钥 (安全保存,严禁前端暴露)
      • AccessToken:通过 OAuth2.0 获取,有效期 30 天 (部分接口需要)
  3. 申请接口权限

    • 在 "API 权限管理" 页面搜索并申请所需接口权限
    • 必选接口:商品详情查询 (jd.item.get 或 jd.union.open.goods.detail.query)
    • 可选接口:商品搜索 (jd.item.search)、店铺商品查询 (jd.item.search.shop)、SKU 详情

二、核心接口详解与选择

根据采集需求选择合适接口:

接口名称功能描述适用场景返回核心数据
jd.item.get获取单商品详情单品分析、价格监控标题、价格、库存、主图、SKU 信息
jd.item.search关键词搜索商品列表市场调研、竞品分析商品 ID、标题、价格、销量、店铺 ID
jd.item.search.shop获取店铺所有商品店铺分析、供应商管理店铺商品列表 (支持分页)
batch_get_item_info批量获取多商品详情 (最多 1000 个 SKU)大规模数据采集结构化商品数据 (300 + 字段)

三、接口接入核心流程:从请求到数据

1. 签名生成 (关键安全环节)

京东 API 采用签名验证机制防止请求篡改,生成步骤:

python

运行

def generate_sign(params, app_secret):
    # 1. 按参数名ASCII升序排序
    sorted_params = sorted(params.items(), key=lambda x: x[0])
    # 2. 拼接参数字符串
    param_str = "&".join([f"{k}={v}" for k, v in sorted_params])
    # 3. 使用AppSecret进行HMAC-SHA256加密(或MD5)
    sign = hmac.new(
        app_secret.encode("utf-8"),
        param_str.encode("utf-8"),
        hashlib.sha256
    ).hexdigest().upper()
    return sign

2. 完整请求流程示例

商品详情查询为例:

python

运行

import requests
import time
import hashlib
import hmac

# 初始化
APP_KEY = "your_app_key"
APP_SECRET = "your_app_secret"
API_URL = "https://api.jd.com/routerjson"  # 固定网关地址

def get_product_detail(sku_id):
    # 1. 构造基础参数
    params = {
        "app_key": APP_KEY,
        "method": "jd.union.open.goods.detail.query",  # 接口方法名
        "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),  # 时间戳
        "format": "json",
        "v": "1.0",
        "skuId": sku_id  # 商品SKU ID(从商品URL提取)
    }
    
    # 2. 生成签名
    params["sign"] = generate_sign(params, APP_SECRET)
    
    # 3. 发送请求
    try:
        response = requests.get(API_URL, params=params, timeout=10)
        response.raise_for_status()  # 检查HTTP错误
        result = response.json()
        
        # 4. 处理响应
        if result.get("code") == 200:  # 业务成功
            return result["jd_union_open_goods_detail_query_response"]["result"]
        else:  # 业务失败
            print(f"API调用失败: {result['code']}, {result['msg']}")
            return None
    except Exception as e:
        print(f"请求异常: {str(e)}")
        return None

# 调用示例
product_data = get_product_detail("100012345678")  # 商品ID从京东商品URL获取
print(product_data)

3. 店铺商品批量采集示例

python

运行

def get_shop_products(shop_id, page=1):
    params = {
        "app_key": APP_KEY,
        "method": "jd.item.search.shop",
        "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
        "shop_id": shop_id,  # 店铺ID
        "page": page,        # 页码
        "page_size": 100     # 每页最多100条
    }
    
    params["sign"] = generate_sign(params, APP_SECRET)
    
    response = requests.get(API_URL, params=params)
    result = response.json()
    
    if result.get("code") == 200:
        return result["jd_item_search_shop_response"]["result"]["items"]
    else:
        return None

# 采集某店铺所有商品(自动分页)
def get_all_shop_products(shop_id):
    products = []
    page = 1
    
    while True:
        page_products = get_shop_products(shop_id, page)
        
        if not page_products:  # 没有更多数据
            break
            
        products.extend(page_products)
        page += 1
        
        # 控制调用频率(避免超过QPS限制)
        time.sleep(1)
    
    return products

四、数据解析与存储优化

1. 关键数据提取

商品详情响应主要字段:

字段名说明用途
skuId商品唯一标识数据关联、去重
title商品标题内容分析、展示
price商品价格 (元)价格监控、竞品分析
stock库存数量库存预警、供应链管理
sales销量销售趋势分析
img_urls图片 URL 列表素材管理、展示
shop_id/name店铺 ID / 名称店铺分析、供应商管理

2. 数据存储方案

方案 A:轻量级存储 (适合小规模)

  • CSV 文件:使用 pandas 库直接保存,适合临时分析
  • JSON 文件:直接存储 API 返回的结构化数据

方案 B:数据库存储 (推荐,适合大规模)

python

运行

import pymysql

def save_to_mysql(product_data, db_config):
    # 连接数据库
    conn = pymysql.connect(**db_config)
    cursor = conn.cursor()
    
    # 插入数据SQL
    sql = """
    INSERT INTO jd_products (
        sku_id, title, price, stock, sales, 
        img_urls, shop_id, shop_name, create_time
    ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
    """
    
    # 执行插入
    try:
        cursor.execute(sql, (
            product_data["skuId"],
            product_data["title"],
            product_data["price"],
            product_data["stock"],
            product_data.get("sales", 0),
            json.dumps(product_data["img_urls"]),
            product_data["shopId"],
            product_data["shopName"],
            time.strftime("%Y-%m-%d %H:%M:%S")
        ))
        conn.commit()
        print("数据成功保存到MySQL")
    except Exception as e:
        conn.rollback()
        print(f"MySQL保存失败: {str(e)}")
    finally:
        conn.close()

五、常见问题与优化策略

1. 签名错误 (最常见问题)

原因排查:

  • 时间戳格式错误 (必须为 "YYYY-MM-DD HH:MM:SS" 且与京东服务器时间偏差 < 5 分钟)
  • 参数未按 ASCII 升序排序
  • AppSecret 错误或泄露
  • 特殊字符未正确编码

解决方案:

  • 使用 NTP 同步服务器时间
  • 使用sorted()函数确保参数排序正确
  • AppSecret 通过环境变量读取,定期更换
  • 对含特殊字符的参数进行 URL 编码

2. 调用频率控制 (QPS 限制)

  • 个人账号:≤10 次 / 分钟
  • 企业账号:≤100 次 / 分钟
  • 服务商账号:最高 500 次 / 分钟(需单独申请)

优化方案:

  • 实现令牌桶算法控制调用频率,预留 20% 缓冲
  • 批量接口优先 (batch_get_item_info 支持单次 1000 个 SKU)
  • 添加重试机制处理临时失败

python

运行

from tenacity import retry, stop_after_attempt, wait_exponential

@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def safe_get_product_detail(sku_id):
    return get_product_detail(sku_id)

3. 数据一致性问题

** 问题表现:**API 返回数据与京东前端显示不一致

解决方案:

  • 开通商品变更回调功能,实时接收更新通知 (需在开放平台配置回调地址)
  • 对关键商品增加采集频率
  • 记录数据版本和采集时间,便于追溯差异

六、应用场景示例

1. 电商竞品分析系统

实现步骤:

  1. 采集竞品店铺所有商品信息
  2. 设置价格变动监控 (±5% 触发警报)
  3. 分析竞品热销品类和价格带
  4. 定期生成竞品分析报表

核心接口组合:jd.item.search.shop + jd.item.get + batch_get_item_info

2. 供应商商品管理系统

实现步骤:

  1. 同步供应商店铺商品到自有系统
  2. 设置库存阈值 (如 < 10 件触发补货提醒)
  3. 自动更新商品信息 (价格、库存、图片)
  4. 分析供应商销售表现

核心接口组合:jd.item.search.shop + jd.item.get(定期轮询) + 商品变更回调

七、合规使用边界 (重要!)

京东对 API 使用有严格规定,违规将导致权限回收或账号处罚:

  • 禁止行为:

    • 将数据提供给第三方 (除非有明确授权)
    • 用于竞品攻击或不正当竞争
    • 超出授权范围使用接口
    • 绕过 API 限制进行数据爬取
    • 接口调用日志未留存 (需保存至少 3 个月)
  • 合规建议:

    • 仅在授权范围内使用接口
    • 明确数据用途 (如 "内部分析,不对外提供")
    • 定期检查账号权限状态
    • 建立数据安全管理制度,防止泄露

总结与下一步

京东 API 提供了合规、高效的商品数据采集渠道,相比爬虫具有数据稳定、结构清晰、合法合规等优势。接入流程主要包括:注册认证→创建应用→申请权限→接口调用→数据处理。

接口实现类LinkJOS 扩展于:public class LinkJOS extends LinkOAuth2(LinkOAuth2 extends JspEasy) 构造函数 LinkJOS(HttpServletRequest request,HttpServletResponse response) 京东JOS接口访问函数 public String link2(String link,String method,Bag sys,Bag apps,String appSecret,String file,String FileField) 作用:访问京东JOS平台的所有接口 参数: String link,京东JOS平台接口访问地址,目前固定为:https://api.jd.com/routerjson String method,向京东JOS平台提交数据时的方法,需要应用级别参数时建议用POST方法,不需要时用GET(参见后边的实例) Bag sys,系统级别参数书包(一般只需在接口参数文件中放入接口方法即可,参见后边的实例) Bag apps,应用级别参数书包(在接口参数文件中放入必须的应用级别参数,若不需要应用级别参数时直接用new Bag(-1)构造一个空书包即可,参见后边的实例) String appSecret,应用证书中的App Secret,前边已经设置,固定用"@{pPage:app_secret}"即可 String file,调用上传文件接口上传文件(如图片)到京东JOS平台时的文件全名(含相对路径,如:images/logo.png),不是调用上传文件接口时为空字符串即可(参见后边的实例) String FileField,调用上传文件接口上传文件(如图片)到京东JOS平台时的字段名,配合前边的参数,不是调用上传文件接口时为空字符串即可(参见后边的实例) 返回为京东JOS平台接口对应的JSON格式的字符串 JSON文本解析方法 public void parseJson(String json) 作用:解析京东JOS平台接口返回的JSON格式的字符串,并根据内容生成N个对应的书包 参数:String json,京东JOS平台接口返回的JSON格式的字符串 根据JSON文本的内容在系统中生成N个书包,根书包名称为j0,下一层的josn文本内容生成的书包名称用上一层的Key放在上一层的书名中,下边用实例说明寻找对应书包的方法: 如店铺信息查询接口jingdong.vender.shop.query返回的json文本为 { "jingdong_vender_shop_query_responce": { "shop_jos_result": { "open_time": "", "shop_id": "", "category_main_name": "", "category_main": "", "vender_id": "", "brief": "", "logo_url": "", "shop_name": "" } } } 找出店铺信息书包名的方法如下 @{j0:jingdong_vender_shop_query_responce} @{@{pPage:bag}:shop_jos_result} 这时候的@{pPage:bag}即为需要的店铺信息书包名 具体用法请阅读下载包中的《京东卖家如何快速开发网店工具软件》
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值