实战解析:如何精准定位并提取京东商品的 SKU 数据

简介: 实战解析:如何精准定位并提取京东商品的 SKU 数据

一、为什么要做 SKU 采集
在电商精细化运营、比价系统、价格监控、库存同步、智能补货、竞品分析等场景中,“SKU(Stock Keeping Unit)” 是最小粒度、最稳定、最不可再拆分的商品单元。京东把同一 SPU(Standard Product Unit,标准商品)下的不同颜色、尺码、版本、套餐拆成多条 SKU,每条 SKU 具备独立的 id、价格、库存、促销、图片、规格参数。
因此,能否“精准”而非“暴力”地拿到 SKU 维度数据,直接决定了后续业务逻辑的准确性。
二、京东前端渲染链路的演进

  1. 2016 年以前:服务端直出 HTML,页面源码里直接嵌 JSON。
  2. 2017-2019 年:开始 React 同构,HTML 中仍保留 window.pageConfig、window.skudata 等全局变量。
  3. 2020 以后:大部分页面升级为 Next.js 同构 + JFS(京东前端服务)SSR,首屏 HTML 只剩骨架,真正的 SKU 数据放在异步接口;同时接口加签、加滑块、加 m.jd.com 的协议头,风控显著增强。
    结论:
    – 2025 年的今天,想拿到 100% 准确的 SKU,必须“浏览器环境 + 接口逆向”两条腿走路。
    – 接口逆向的核心是定位“SKU 聚合接口”并“还原签名算法”。
    三、整体技术方案
  4. 浏览器层:Puppeteer/Playwright 模拟真机环境,绕过滑块、滑条、智能验证码。
  5. 逆向层:在 DevTools 中把 SKU 接口(getWareBusiness、getSeparateWareStyle、getSizeColor 等)的请求/响应完整抓出来,剥离出 query 参数、cookie、sign、functionId。
  6. 纯后端层:用 Python 复现签名算法,脱离浏览器做高并发调用。
    四、环境准备

    系统:Ubuntu 22.04

    python3.11 -m venv venv
    source venv/bin/activate
    pip install playwright requests loguru pydantic fake-useragent
    playwright install chromium
    五、浏览器层:用 Playwright 拿原始接口

    file: jd_sku_browser.py

    import asyncio, re, json
    from playwright.async_api import async_playwright
    from loguru import logger

JD_ITEM_URL = "https://item.jd.com/100012043978.html"

async def run():
async with async_playwright() as pw:
iphone_ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1"
iphone = pw.devices['iPhone 14 Pro']
browser = await pw.webkit.launch(headless=False, slow_mo=200)
page = await browser.new_page(iphone, user_agent=iphone_ua)
await page.route("
/*", lambda route: route.continue_()) # 全放行
res_list = []

    async def handle_res(res):
        url = res.url
        if "getWareBusiness" in url or "getSeparateWareStyle" in url:
            try:
                txt = await res.text()
                res_list.append({"url": url, "json": json.loads(txt)})
            except Exception as e:
                logger.warning(e)

    page.on("response", handle_res)

    await page.goto(JD_ITEM_URL, timeout=30_000)
    await page.wait_for_load_state("networkidle")
    await asyncio.sleep(3)
    await browser.close()
    return res_list

if name == "main":
print(asyncio.run(run()))
运行后会在终端打印出两条核心 JSON:
– getWareBusiness:包含价格、库存、促销、Plus 价、秒杀价。
– getSeparateWareStyle:包含颜色、尺码、版本、套餐维度及对应的 SKU ID。
六、逆向层:剥离出关键参数
以 getWareBusiness 为例,浏览器 Network 面板看到的 URL:
https://api.m.jd.com/api?appid=item-view&functionId=getWareBusiness&client=m&clientVersion=12.0.0&uuid=163521234567890&t=1724745123456&skuId=100012043978&sign=c5c4c3b2a1...
经过断点调试(webpack:// jd-module-sign.js)发现 sign 的算法:
sign = md5(
"functionId=" + functionId +
"&body=" + body +
"&uuid=" + uuid +
"&client=" + client +
"&clientVersion=" + clientVersion +
"&t=" + t +
"&appid=" + appid +
"&token=" + (token || "")
)
其中 body 是 URL 编码后的 JSON 字符串,token 为空。
七、Python 复现签名算法

file: jd_sign.py

import hashlib, time, urllib.parse

def jd_sign(function_id: str, body: dict, uuid: str, client="m", client_version="12.0.0", appid="item-view") -> str:
body_str = urllib.parse.quote(json.dumps(body, separators=(",", ":"), ensure_ascii=False))
t = str(int(time.time() * 1000))
raw = (
f"functionId={function_id}"
f"&body={body_str}"
f"&uuid={uuid}"
f"&client={client}"
f"&clientVersion={client_version}"
f"&t={t}"
f"&appid={appid}"
"&token="
)
return hashlib.md5(raw.encode()).hexdigest(), t
八、纯后端:高并发拉取 SKU 维度数据

file: jd_sku.py

import httpx, json, asyncio, random
from jd_sign import jd_sign
from loguru import logger

BASE = "https://api.m.jd.com/api"
HEADERS = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1",
"Referer": "https://item.m.jd.com/"
}

async def fetch_sku(sku_id: str):
uuid = "".join(random.choices("0123456789", k=15))
body = {"skuId": sku_id, "catId": "", "areaId": "19_1601_50258_51885"}
sign, t = jd_sign("getWareBusiness", body, uuid)
params = {
"appid": "item-view",
"functionId": "getWareBusiness",
"client": "m",
"clientVersion": "12.0.0",
"uuid": uuid,
"t": t,
"skuId": sku_id,
"sign": sign,
"body": json.dumps(body, separators=(",", ":"))
}
async with httpx.AsyncClient(timeout=10, headers=HEADERS) as cli:
r = await cli.get(BASE, params=params)
r.raise_for_status()
return r.json()

if name == "main":
sku = "100012043978"
data = asyncio.run(fetch_sku(sku))
print(json.dumps(data, ensure_ascii=False, indent=2))
九、结果解析与落地

  1. 价格:data["price"]["p"] 为当前售价,data["price"]["op"] 为原价。
  2. 库存:data["stock"]["skuState"] 1 为有货,0 为无货;data["stock"]["StockState"] 33 为现货,34 为预订,40 为无货。
  3. 促销:data["promotion"] 为数组,包含满减、秒杀、白条分期。
  4. SKU 维度:data["colorSize"] 为颜色/尺码矩阵,每条记录包含 skuId、image、name。
    示例落地 MySQL 表:
    CREATE TABLE jd_sku (
    id BIGINT PRIMARY KEY,
    sku_id BIGINT UNIQUE,
    spu_id BIGINT,
    name VARCHAR(255),
    price DECIMAL(10,2),
    stock TINYINT,
    spec JSON,
    utime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    );
    将脚本封装成定时任务,每分钟批量刷新,即可实现分钟级价格/库存监控。
    十、风控与合规提示
  5. 京东对 UA、Cookie、Sign、滑块、IP 频率均有风控,建议:
    – 合理并发(QPS<1)
    – 使用住宅代理轮换,例如:亿牛云
    – 遵守 robots.txt 及京东开放平台 ToS
相关文章
|
19天前
|
JSON fastjson Java
FastJson 完全学习指南(初学者从零入门)
摘要:本文是FastJson的入门学习指南,主要内容包括: JSON基础:介绍JSON格式特点、键值对规则、数组和对象格式,以及嵌套结构的访问方式。FastJson是阿里巴巴开源的高性能JSON解析库,具有速度快、功能全、使用简单等优势,并介绍如何引入依赖,如何替换Springboot默认的JackJson。 核心API: 序列化:将Java对象转换为JSON字符串,演示对象、List和Map的序列化方法; 反序列化:将JSON字符串转回Java对象,展示基本对象转换方法;
|
1月前
|
人工智能 自然语言处理 机器人
智能体平台哪家值得选?盘点国内外12家AI Agent平台技术特色
智能体平台正引领人机协作新潮流,将“智能”交给机器,让“平台”服务于人。2024年被Gartner定义为“AgenticAI元年”,预示未来企业交互将由智能体主导。面对百余平台,可从三条赛道入手:通用大模型、RPA升级派与垂直场景定制。不同需求对应不同方案,选对平台,才能让AI真正助力工作。
|
21天前
|
前端开发 JavaScript 开发者
React:构建用户界面的JavaScript库
React:构建用户界面的JavaScript库
|
17天前
|
人工智能 自然语言处理 IDE
模型微调不再被代码难住!PAI和Qwen3-Coder加速AI开发新体验
通义千问 AI 编程大模型 Qwen3-Coder 正式开源,阿里云人工智能平台 PAI 支持云上一键部署 Qwen3-Coder 模型,并可在交互式建模环境中使用 Qwen3-Coder 模型。
253 109
|
1月前
|
并行计算 前端开发 JavaScript
Web Worker:让前端飞起来的隐形引擎
在现代 Web 开发中,前端性能优化是一个至关重要的课题,尤其是对于计算密集型的应用,如图像处理、视频处理、大规模数据分析等任务。单线程的 JavaScript 引擎常常成为性能瓶颈,导致应用变得迟缓。Web Worker,作为一种强大的技术,使得前端能够在后台进行并行计算,从而实现高效的任务处理,不影响主线程的运行和用户的交互体验。
298 108
|
1月前
|
API
免费的股票实时行情API接口(散户量化)
散户量化,股票下单交易API接口,免费实时行情API接口
|
25天前
|
安全 数据挖掘 BI
三步打通飞书多维表格与Quick BI,让数据分析“飞”起来
本文介绍了如何将多维表格接入Quick BI,实现数据自动同步与深度分析。通过三步操作,即可轻松整合数据,提升效率。
|
1月前
|
人工智能 前端开发 Java
构建能源领域的AI专家:一个多智能体框架的实践与思考
本文介绍了作者团队在能源领域构建多智能体(Multi-Agent)框架的实践经验。面对单智能体处理复杂任务时因“注意力发散”导致的效率低下问题,团队设计了一套集“规划-调度-执行-汇总”于一体的多智能体协作系统。
346 19

热门文章

最新文章