在电商数据分析、比价系统开发等场景中,获取京东商品详情数据是常见需求。本文将以 Node.js 为开发环境,详细讲解如何快速接入京东 API,实现商品详情数据的抓取与处理,包含完整代码示例和关键步骤解析。
一、前置准备:环境与 API 申请
在开始编码前,需完成以下基础准备工作,确保 API 调用的合法性和环境可用性。
- 开发环境搭建
- 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
- API 申请
京东 API 调用需先完成开发者认证并创建应用,步骤如下:
- 注册认证;
- 选择 “商品查询” 相关权限;
- 获取关键信息:apiKey(应用标识)、apiSecret(签名密钥),后续调用需用到这两个参数。
二、核心原理:京东 API 调用规则
API 采用RESTful 风格,所有请求需满足以下规则,否则会被拒绝:
- 请求方式:以GET为主(部分接口支持 POST);
- 参数要求:需包含公共参数(如apiKey、timestamp、sign)和业务参数(如商品 IDskuId);
- 签名机制:通过apiSecret对参数进行加密生成sign,确保请求合法性,签名步骤如下:
- 将所有参数(除sign外)按参数名 ASCII 升序排序;
- 拼接为key=value&key=value格式的字符串;
- 用apiSecret作为密钥,对拼接字符串进行 HMAC-SHA256 加密,再转大写得到sign。
三、完整代码实现:抓取商品详情
以下代码实现 “根据商品 SKU ID 获取京东商品详情” 功能,包含参数拼接、签名生成、API 请求、数据解析全流程。
- 项目结构
jd-api-demo/
├─ .env # 存储敏感信息(appKey、appSecret)
├─ index.js # 核心代码
└─ package.json # 依赖配置
- 配置敏感信息(.env 文件)
将获取的apiKey和apiSecret填入,避免硬编码:
JD_APP_KEY=你的appKey
JD_APP_SECRET=你的appSecret
JD_API_URL=https://api.jd.com/routerjson # 京东API通用网关地址
- 核心代码(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);
});
四、代码解析与运行说明
- 关键函数解析
- generateSign:核心签名生成函数,严格遵循京东 API 签名规则,确保请求通过合法性校验;
- getJdProductDetail:业务逻辑函数,整合参数配置、签名生成、API 请求、数据解析,返回结构化的商品信息。
-
运行步骤
-
替换.env文件中的JD_APP_KEY和JD_APP_SECRET为实际值;
-
替换testSkuId为需要查询的商品 SKU ID(可从京东商品 URL 中提取,如 URLitem.jd.com/10001234567…l中的100012345678);
-
执行代码:
node index.js
- 预期输出
若请求成功,控制台将打印结构化的商品详情:
{
"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),避免无限等待。