×

api开发 电商平台 数据挖掘

Node.js 实战:快速接入京东 API 并抓取商品详情数据

admin admin 发表于2025-09-10 17:58:45 浏览18 评论0

抢沙发发表评论

在电商数据分析、比价系统开发等场景中,获取京东商品详情数据是常见需求。本文将以 Node.js 为开发环境,详细讲解如何快速接入京东 API,实现商品详情数据的抓取与处理,包含完整代码示例和关键步骤解析。

一、前置准备:环境与 API 申请

在开始编码前,需完成以下基础准备工作,确保 API 调用的合法性和环境可用性。

1. 开发环境搭建

  • Node.js 安装:确保本地已安装 Node.js(建议 v14+),可通过node -v命令验证版本。

  • 依赖包选择:核心依赖包括:

  • axios:用于发送 HTTP 请求,与京东 API 进行数据交互;

  • crypto-js:京东 API 要求签名验证,需通过该包实现 MD5、HMAC-SHA256 等加密算法;

  • dotenv:管理 API 密钥等敏感信息,避免硬编码泄露。

通过 npm 安装依赖:

npm init -y
npm install axios crypto-js dotenv

2. API 申请

京东 API 调用需先完成开发者认证并创建应用,步骤如下:

  1. 注册认证;

  2. 选择 “商品查询” 相关权限;

  3. 获取关键信息:apiKey(应用标识)、apiSecret(签名密钥),后续调用需用到这两个参数。

二、核心原理:京东 API 调用规则

API 采用RESTful 风格,所有请求需满足以下规则,否则会被拒绝:

  1. 请求方式:以GET为主(部分接口支持 POST);

  2. 参数要求:需包含公共参数(如apiKey、timestamp、sign)和业务参数(如商品 IDskuId);

  3. 签名机制:通过apiSecret对参数进行加密生成sign,确保请求合法性,签名步骤如下:

  • 将所有参数(除sign外)按参数名 ASCII 升序排序;

  • 拼接为key=value&key=value格式的字符串;

  • 用apiSecret作为密钥,对拼接字符串进行 HMAC-SHA256 加密,再转大写得到sign。

三、完整代码实现:抓取商品详情

以下代码实现 “根据商品 SKU ID 获取京东商品详情” 功能,包含参数拼接、签名生成、API 请求、数据解析全流程。

1. 项目结构

jd-api-demo/
├─ .env                # 存储敏感信息(appKey、appSecret)
├─ index.js            # 核心代码
└─ package.json        # 依赖配置

2. 配置敏感信息(.env 文件)

将获取的apiKey和apiSecret填入,避免硬编码:

JD_APP_KEY=你的appKey
JD_APP_SECRET=你的appSecret
JD_API_URL=https://api.jd.com/routerjson  # 京东API通用网关地址

3. 核心代码(index.js)

// 导入依赖包
const axios = require('axios');
const CryptoJS = require('crypto-js');
require('dotenv').config(); // 加载.env配置

/**
 * 生成京东API请求签名
 * @param {Object} params - 请求参数(含公共参数和业务参数)
 * @param {string} appSecret - 应用密钥
 * @returns {string} 签名结果(大写)
 */
function generateSign(params, appSecret) {
  // 1. 按参数名ASCII升序排序
  const sortedParams = Object.keys(params).sort().reduce((obj, key) => {
    obj[key] = params[key];
    return obj;
  }, {});

  // 2. 拼接为"key=value&key=value"格式
  const paramStr = Object.entries(sortedParams)
    .map(([key, value]) => `${key}=${value}`)
    .join('&');

  // 3. HMAC-SHA256加密 + 转大写
  const sign = CryptoJS.HmacSHA256(paramStr, appSecret);
  return CryptoJS.enc.Hex.stringify(sign).toUpperCase();
}

/**
 * 调用京东API获取商品详情
 * @param {string} skuId - 商品SKU ID(京东商品唯一标识,可从商品URL中获取)
 * @returns {Promise<Object>} 商品详情数据
 */
async function getJdProductDetail(skuId) {
  try {
    // 1. 配置公共参数(所有API请求必传)
    const publicParams = {
      app_key: process.env.JD_APP_KEY,
      method: 'jd.union.open.goods.detail.query', // 商品详情查询接口(京东官方接口名)
      format: 'json', // 响应格式
      v: '1.0', // API版本
      timestamp: new Date().toISOString().replace(/T/, ' ').replace(/\.\d+Z$/, ''), // 时间戳(格式:YYYY-MM-DD HH:mm:ss)
      sign_method: 'hmac-sha256' // 签名算法
    };

    // 2. 配置业务参数(当前接口需传商品SKU ID)
    const businessParams = {
      skuIds: skuId // 支持多个SKU,用英文逗号分隔(如"123456,789012")
    };

    // 3. 合并参数(公共参数 + 业务参数)
    const requestParams = {
      ...publicParams,
      param_json: JSON.stringify(businessParams) // 业务参数需转JSON字符串
    };

    // 4. 生成签名
    requestParams.sign = generateSign(requestParams, process.env.JD_APP_SECRET);

    // 5. 发送GET请求调用API
    const response = await axios.get(process.env.JD_API_URL, {
      params: requestParams
    });

    // 6. 解析响应数据(根据京东API返回格式处理)
    const result = response.data;
    if (result.code === 0 && result.data) {
      // 提取关键商品信息(可根据需求扩展)
      const product = result.data[0];
      return {
        skuId: product.skuId,
        name: product.skuName, // 商品名称
        price: product.price, // 商品价格
        imageUrl: product.imageUrl, // 商品主图
        shopName: product.shopName, // 店铺名称
        category: product.categoryName // 商品分类
      };
    } else {
      throw new Error(`API请求失败:${result.msg || '未知错误'}`);
    }
  } catch (error) {
    console.error('获取商品详情失败:', error.message);
    throw error; // 抛出错误,供调用方处理
  }
}

// 测试:获取指定SKU的商品详情(示例SKU:京东自营商品)
const testSkuId = '100012345678'; // 替换为实际需要查询的SKU ID
getJdProductDetail(testSkuId)
  .then(product => {
    console.log('商品详情获取成功:');
    console.log(JSON.stringify(product, null, 2));
  })
  .catch(err => {
    console.error('测试失败:', err.message);
  });

四、代码解析与运行说明

1. 关键函数解析

  • generateSign:核心签名生成函数,严格遵循京东 API 签名规则,确保请求通过合法性校验;

  • getJdProductDetail:业务逻辑函数,整合参数配置、签名生成、API 请求、数据解析,返回结构化的商品信息。

2. 运行步骤

  1. 替换.env文件中的JD_APP_KEY和JD_APP_SECRET为实际值;

  2. 替换testSkuId为需要查询的商品 SKU ID(可从京东商品 URL 中提取,如 URLhttps://item.jd.com/100012345678.html中的100012345678);

  3. 执行代码:

node index.js

3. 预期输出

若请求成功,控制台将打印结构化的商品详情:

{
  "skuId": "100012345678",
  "name": "【京东自营】XX品牌 55英寸4K智能电视",
  "price": 2999.00,
  "imageUrl": "https://img14.360buyimg.com/n1/jfs/t1/xxx/xxx/xxx/xxx.jpg",
  "shopName": "XX品牌京东自营旗舰店",
  "category": "家用电器>电视>4K电视"
}

五、注意事项与优化建议

1.API 权限与限流:

  • 确保创建的京东应用已申请 “商品详情查询” 相关权限,否则会返回 “权限不足” 错误;

  • 京东 API 有调用频率限制(如个人开发者默认 100 次 / 小时),高并发场景需做好请求节流,避免 IP 被封禁。

2.敏感信息安全:

  • 严禁将apiSecret硬编码到代码或提交到 Git 仓库,必须通过.env或配置中心管理;

  • 生产环境建议对 API 请求日志脱敏,避免泄露关键参数。

3.异常处理优化:

  • 可扩展代码中的异常处理逻辑,如添加重试机制(针对网络波动导致的请求失败);

  • 对返回的商品数据进行合法性校验(如价格非空、SKU ID 匹配),避免脏数据进入下游系统。

4.功能扩展:

  • 支持多 SKU 批量查询:修改businessParams.skuIds为逗号分隔的 SKU 列表(如"123456,789012");

  • 数据持久化:将获取的商品详情存入 MySQL、MongoDB 等数据库,或导出为 Excel 文件;

  • 定时抓取:结合node-schedule包实现定时更新商品价格、库存等数据。

六、常见问题排查

1.签名错误(sign invalid):

  • 检查参数排序是否按 ASCII 升序;

  • 确认apiSecret是否正确,是否包含特殊字符;

  • 时间戳格式是否符合 “YYYY-MM-DD HH:mm:ss”(需与京东服务器时间一致,误差不超过 5 分钟)。

2.SKU 不存在或无权限:

  • 确认 SKU ID 是否正确(可在京东商品页面验证);

  • 检查应用是否已开通 “联盟商品查询” 或 “自营商品查询” 权限(不同商品类型需对应权限)。

3.请求超时:

  • 检查网络是否能访问API ;

  • 给 axios 添加超时配置(如timeout: 5000),避免无限等待。


少长咸集

群贤毕至

访客