在电商数据分析、价格监控、竞品分析等场景中,实时获取商品详情数据具有重要价值。京东作为国内领先的电商平台,其商品数据接口的开发与实践一直是开发者关注的焦点。本文将详细讲解京东平台商品详情实时数据采集接口的开发过程,包括接口设计思路、技术选型、核心代码实现及注意事项。
一、接口开发需求分析
商品详情数据采集接口需满足以下核心需求:
二、技术选型
基于需求分析,选择以下技术栈:
开发语言:Python(高效的爬虫生态与接口开发库)
网络请求:Requests(处理 HTTP 请求)+ Selenium(应对动态渲染页面)
数据解析:BeautifulSoup(HTML 解析)+ JSONPath(JSON 数据提取)
缓存机制:Redis(减轻重复请求压力,提高响应速度)
接口框架:FastAPI(高性能 API 服务开发)
三、核心实现方案
3.1 京东商品数据获取原理
京东商品详情页 URL 格式通常为:https://item.jd.com/{商品ID}.html,其中商品 ID 为关键标识。获取数据的两种主要方式:
直接解析 HTML 页面(适用于静态数据)
调用京东内部 API 接口(适用于动态加载数据,如价格、库存)
3.2 接口设计
设计 RESTful 风格 API,核心接口定义:
3.3 核心代码实现
3.3.1 项目结构
3.3.2 配置文件(config.py)
3.3.3 缓存处理(cache.py)
3.3.4 京东数据爬取逻辑(jd_spider.py)
import requests
import json
from bs4 import BeautifulSoup
from config import TIMEOUT, JD_PRICE_API, JD_STOCK_API
from cache import RedisCache
import hashlib
cache = RedisCache()
class JDProductSpider:
def __init__(self):
# 设置请求头,模拟浏览器
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36",
"Referer": "https://www.jd.com/"
}
def get_product_detail(self, product_id, fields=None):
"""获取商品详情主方法"""
# 先检查缓存
cache_key = f"jd_product:{product_id}"
cached_data = cache.get(cache_key)
if cached_data:
return json.loads(cached_data)
# 组合各类数据
product_data = {
"product_id": product_id,
"basic_info": self.get_basic_info(product_id),
"price_info": self.get_price_info(product_id),
"stock_info": self.get_stock_info(product_id),
"spec_info": self.get_spec_info(product_id)
}
# 按字段筛选(如果指定)
if fields:
fields = fields.split(',')
filtered_data = {}
for field in fields:
if field in product_data:
filtered_data[field] = product_data[field]
product_data = filtered_data
# 存入缓存
cache.set(cache_key, json.dumps(product_data), expire=300)
return product_data
def get_basic_info(self, product_id):
"""获取商品基本信息(标题、图片等)"""
url = f"https://item.jd.com/{product_id}.html"
try:
response = requests.get(url, headers=self.headers, timeout=TIMEOUT)
soup = BeautifulSoup(response.text, "html.parser")
# 提取标题
title = soup.select_one(".sku-name")?.text.strip() or ""
# 提取主图
main_img = soup.select_one("#spec-img")?.get("data-origin") or ""
# 提取店铺信息
shop_name = soup.select_one(".shop-name a")?.text.strip() or ""
return {
"title": title,
"main_img": main_img,
"shop_name": shop_name
}
except Exception as e:
print(f"获取基本信息失败: {str(e)}")
return {}
def get_price_info(self, product_id):
"""获取商品价格信息"""
try:
params = {
"skuIds": f"J_{product_id}",
"type": "1"
}
response = requests.get(
JD_PRICE_API,
headers=self.headers,
params=params,
timeout=TIMEOUT
)
price_data = response.json()
if price_data and len(price_data) > 0:
return {
"original_price": price_data[0].get("m", ""), # 原价
"current_price": price_data[0].get("p", "") # 当前价
}
return {}
except Exception as e:
print(f"获取价格信息失败: {str(e)}")
return {}
def get_stock_info(self, product_id):
"""获取商品库存信息"""
try:
params = {
"skuId": product_id,
"area": "1_72_2799_0", # 地区编码,可根据需求调整
"venderId": "1000000000",
"cat": "1,2,3" # 分类信息,可动态获取
}
response = requests.get(
JD_STOCK_API,
headers=self.headers,
params=params,
timeout=TIMEOUT
)
# 京东库存接口返回的是JSONP格式,需要处理
stock_data = json.loads(response.text.lstrip("jQuery1124037746267620312745_1646607123606(").rstrip(");"))
return {
"stock_status": stock_data.get("stock", {}).get("stockStatusName", ""),
"remain": stock_data.get("stock", {}).get("remainCount", 0)
}
except Exception as e:
print(f"获取库存信息失败: {str(e)}")
return {}
def get_spec_info(self, product_id):
"""获取商品规格参数"""
try:
url = f"https://item.jd.com/{product_id}.html"
response = requests.get(url, headers=self.headers, timeout=TIMEOUT)
soup = BeautifulSoup(response.text, "html.parser")
# 提取规格参数
spec_list = []
for item in soup.select(".Ptable-item"):
name = item.select_one(".fl").text.strip() if item.select_one(".fl") else ""
value = item.select_one(".fr").text.strip() if item.select_one(".fr") else ""
spec_list.append({
"name": name,
"value": value
})
return {"spec_list": spec_list}
except Exception as e:
print(f"获取规格信息失败: {str(e)}")
return {}3.3.5 API 服务入口(app.py)
四、接口测试与使用
启动服务后,可通过以下方式调用接口:
返回示例:
五、注意事项
反爬机制应对:
接口稳定性:
合规性说明:
本接口仅用于技术学习,使用时需遵守京东平台规则
商业使用需获得京东官方授权,避免法律风险
控制请求频率,避免对平台服务器造成压力
六、总结
本文实现的京东商品详情数据采集接口,通过结合页面解析与内部 API 调用,能够高效获取商品核心信息。通过 FastAPI 构建的服务具有良好的扩展性,可根据实际需求增加更多字段提取或功能扩展(如批量查询、历史价格追踪等)。在实际应用中,需重点关注反爬策略与合规性,确保接口长期稳定运行。