利用京東商品詳情 ID(即 SKU ID)獲取商品詳細(xì)信息,可通過京東開放平臺(tái)官方 API 或非官方接口(逆向解析)實(shí)現(xiàn)。以下是兩種方式的示例展示,包含代碼實(shí)現(xiàn)與數(shù)據(jù)解析:
一、核心概念:京東商品 ID(SKU ID)
京東商品詳情頁 URL 格式為:https://item.jd.com/[SKU_ID].html
例如:https://item.jd.com/100032608854.html
中,100032608854
即為 SKU ID。
二、方式一:京東開放平臺(tái)官方 API(推薦,合規(guī)穩(wěn)定)
1. 準(zhǔn)備工作
- 注冊(cè)京東開放平臺(tái)開發(fā)者賬號(hào):https://open.jd.com/
- 創(chuàng)建應(yīng)用,獲取
app_key
和app_secret
2. 接口調(diào)用示例(Python)
import requests
import time
import hashlib
import json
class JDProductAPI:
def __init__(self, app_key, app_secret):
self.app_key = app_key
self.app_secret = app_secret
self.url = "https://api.jd.com/routerjson" # 官方API網(wǎng)關(guān)
def _sign(self, params):
"""生成簽名(京東API簽名規(guī)則)"""
sorted_params = sorted(params.items(), key=lambda x: x[0])
sign_str = self.app_secret
for k, v in sorted_params:
sign_str += f"{k}{v}"
sign_str += self.app_secret
return hashlib.md5(sign_str.encode()).hexdigest().upper()
def get_product_detail(self, sku_id):
"""獲取商品詳情"""
params = {
"method": "biz.product.detail.get", # 商品詳情接口
"app_key": self.app_key,
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
"format": "json",
"v": "1.0",
"360buy_param_json": json.dumps({"skuId": sku_id}) # 商品ID參數(shù)
}
params["sign"] = self._sign(params)
response = requests.get(self.url, params=params)
return response.json()
# 使用示例
if __name__ == "__main__":
# 替換為你的app_key和app_secret
# 封裝好API供應(yīng)商demo url=o0b.cn/ibrad
app_key = "你的app_key"
app_secret = "你的app_secret"
sku_id = "100032608854" # 商品SKU ID
jd_api = JDProductAPI(app_key, app_secret)
result = jd_api.get_product_detail(sku_id)
# 解析核心數(shù)據(jù)
if result.get("success"):
product = result["result"]["data"]["product"]
print(f"商品名稱:{product['name']}")
print(f"當(dāng)前價(jià)格:¥{product['price']['jdPrice']['price']}")
print(f"原價(jià):¥{product['price']['marketPrice']}")
print(f"店鋪名稱:{product['shopInfo']['shopName']}")
print(f"商品標(biāo)簽:{[tag['name'] for tag in product.get('tags', [])]}")
print(f"庫存狀態(tài):{product['stock']['stockStateName']}")
else:
print(f"獲取失?。簕result.get('errorMessage')}")
3. 官方 API 返回核心字段
字段路徑 | 說明 | 示例值 |
---|---|---|
product.name | 商品名稱 | "Apple iPhone 14 128GB" |
product.price.jdPrice.price | 當(dāng)前售價(jià) | 5999.00 |
product.price.marketPrice | 市場(chǎng)價(jià)(原價(jià)) | 6999.00 |
product.shopInfo.shopName | 店鋪名稱 | "Apple 京東自營旗艦店" |
product.stock.stockStateName | 庫存狀態(tài) | "有貨" |
product.skuAttrs.skuAttr | SKU 屬性(顏色 / 尺寸等) | [{"attrName":"顏色", "attrValues":["黑色","白色"]}] |
三、方式二:非官方接口(逆向解析,適合快速驗(yàn)證)
通過分析京東商品頁網(wǎng)絡(luò)請(qǐng)求,獲取非官方接口數(shù)據(jù)。
1. 商品詳情接口(非官方)
import requests
import json
def get_jd_product_detail(sku_id):
"""逆向獲取京東商品詳情(非官方接口)"""
# 商品基本信息接口
# 封裝好API供應(yīng)商demo url=o0b.cn/ibrad
url = f"https://item-soa.jd.com/getItemDetail?skuId={sku_id}"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Referer": f"https://item.jd.com/{sku_id}.html"
}
response = requests.get(url, headers=headers)
data = response.json()
if data.get("code") == 0:
result = data["data"]
return {
"name": result["itemName"],
"price": result["price"]["p"], # 當(dāng)前價(jià)
"original_price": result["price"]["m"], # 原價(jià)
"shop_name": result["shopInfo"]["name"],
"stock": result["stock"]["stockNum"], # 庫存數(shù)量
"brand": result["brand"]["name"], # 品牌
"main_image": result["itemImg"]["slaveUrl"][0] # 主圖
}
else:
return {"error": "獲取失敗"}
# 使用示例
if __name__ == "__main__":
sku_id = "100032608854"
detail = get_jd_product_detail(sku_id)
if "error" not in detail:
print(f"商品名稱:{detail['name']}")
print(f"當(dāng)前價(jià)格:¥{detail['price']}")
print(f"原價(jià):¥{detail['original_price']}")
print(f"店鋪:{detail['shop_name']}")
print(f"庫存:{detail['stock']}件")
print(f"品牌:{detail['brand']}")
print(f"主圖:{detail['main_image']}")
四、擴(kuò)展應(yīng)用:SKU 多規(guī)格信息獲取
通過商品 ID 獲取所有 SKU(如不同顏色 / 尺寸的價(jià)格、庫存):
def get_jd_skus(sku_id):
"""獲取商品所有SKU信息"""
url = f"https://cd.jd.com/skuDetail?skuId={sku_id}"
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers)
# 解析SKU數(shù)據(jù)(非官方接口返回格式可能為JavaScript變量)
import re
sku_data = re.findall(r"skuMap\s*=\s*({.*?});", response.text)
if sku_data:
sku_map = json.loads(sku_data[0])
skus = []
for sku in sku_map.values():
skus.append({
"sku_id": sku["skuId"],
"attr": sku["skuAttr"], # 規(guī)格描述(如"顏色:黑色;尺寸:128GB")
"price": sku["price"],
"stock": sku["stockNum"]
})
return skus
return []
# 使用示例
skus = get_jd_skus("100032608854")
print("\nSKU列表:")
for sku in skus[:3]: # 打印前3個(gè)SKU
print(f"規(guī)格:{sku['attr']},價(jià)格:¥{sku['price']},庫存:{sku['stock']}件")
總結(jié)
- 官方 API:適合企業(yè)級(jí)應(yīng)用,數(shù)據(jù)穩(wěn)定、合規(guī),需申請(qǐng)權(quán)限。
- 非官方接口:適合快速驗(yàn)證或個(gè)人學(xué)習(xí),需處理反爬和接口變更風(fēng)險(xiǎn)。
通過商品 ID 可獲取價(jià)格、庫存、SKU 規(guī)格、店鋪信息等核心數(shù)據(jù),結(jié)合定時(shí)任務(wù)可實(shí)現(xiàn)價(jià)格監(jiān)控、庫存預(yù)警等功能。