一、接口定位:item_get_web 到底是什么?
item_get_web 并不是淘宝官方文档里的标准 API 名称,而是技术社区对「Web 端商品详情页」数据的统称,通常指同时包含:
-
SKU 规格、价格、库存
-
5 张主图 + 详情图 URL
-
优惠券信息(面额、有效期)
-
券后价(原价 - 面额)
的聚合接口 或自研爬虫方案 。
下面给出一条无需登录、可并发、10 行核心代码就能跑通的「Web 端爬虫」思路,并逐行拆解。
二、整体思路(4 步 30 行代码)
| 步骤 | 目标 | 核心 URL |
|---|---|---|
| ① | 获取商品 ID | 任意搜索列表 |
| ② | 拉取详情 JSON | https://detailskip.taobao.com/json/iid={num_iid} |
| ③ | 解析 SKU / 价格 / 券 | JSON → pandas.DataFrame |
| ④ | 批量下载图片 | 异步 aiohttp + aiofiles |
三、完整源码(可直接跑)
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import re, json, asyncio, aiohttp, aiofiles
import pandas as pd
from urllib.parse import urljoin
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
"Referer": "https://item.taobao.com/",
}
async def item_get_web(num_iid: str):
"""并发获取 SKU、券后价、详情图"""
url = f"https://detailskip.taobao.com/json/iid={num_iid}&t={pd.Timestamp.now().value}"
async with aiohttp.ClientSession() as ses:
async with ses.get(url, headers=HEADERS) as resp:
txt = await resp.text()
data = json.loads(re.search(r"\(({.*})\)", txt).group(1))
# ① SKU 表格化
sku_list = []
for sku in data["sku"]["skuMap"].values():
sku_list.append({
"skuId": sku["skuId"],
"price": float(sku["price"]),
"stock": int(sku["stock"]),
"props": ";".join([f"{k}:{v}" for k, v in sku["propPath"].items()])
})
df_sku = pd.DataFrame(sku_list)
# ② 券后价计算
coupon = data.get("coupon") or {}
original_price = df_sku["price"].min()
denomination = float(coupon.get("denomination", 0))
coupon_price = original_price - denomination
# ③ 详情图列表
desc_imgs = [
urljoin("https:", img)
for img in re.findall(r'"https:(//img[^"]+)"', data["desc"])
]
return {
"num_iid": num_iid,
"title": data["item"]["title"],
"original_price": original_price,
"coupon_price": coupon_price,
"sku_df": df_sku,
"desc_imgs": desc_imgs
}
async def download_img(url, path):
async with aiohttp.ClientSession() as ses:
async with ses.get(url) as resp:
async with aiofiles.open(path, "wb") as f:
await f.write(await resp.read())
async def main(num_iid: str):
info = await item_get_web(num_iid)
print(f'{info["title"]} 原价 ¥{info["original_price"]} 券后 ¥{info["coupon_price"]}')
print("SKU 预览")
print(info["sku_df"].head())
# 异步下载详情图
tasks = [download_img(u, f"{num_iid}_{i}.jpg")
for i, u in enumerate(info["desc_imgs"][:20])]
await asyncio.gather(*tasks)
print("详情图下载完成")
if __name__ == "__main__":
asyncio.run(main("728649613560")) # 替换任意宝贝 ID
四、逐行拆解
| 行号块 | 关键知识 | 为什么这么做 |
|---|---|---|
① url |
Web 端详情接口 | 淘宝 PC 页异步地址,返回 JSONP,无需登录 |
| ② 正则抠 JSON | \(({.*})\) |
接口用 JSONP 回调,需正则剥壳 |
| ③ SKU 表格化 | skuMap |
含 price/stock/propPath,直接转 DataFrame 方便后续落库 |
| ④ 券后价计算 | original - denomination |
与官方逻辑一致,券信息在 data["coupon"] 节点 |
| ⑤ 详情图正则 | re.findall |
详情 HTML 被放在 data["desc"],一次性正则抽出所有 //img.alicdn.com 链接 |
| ⑥ 异步下载 | aiohttp+aiofiles |
详情图 20~60 张,同步下载耗时 10 s+,异步可压到 1 s |
五、常见问题速查
| 现象 | 原因 | 解决 |
|---|---|---|
desc 为空 |
商品无图文详情 | 跳过或补默认值 |
| 403/滑块 | IP 短时间 >200 次 | 单 IP 加 200 ms 延迟,或接代理池 |
| 图片 404 | 相对路径 //img |
用 urljoin("https:", url) 补全协议 |
| 券信息缺失 | 商品无优惠 | denomination=0,券后价=原价 |
六、业务落地 3 案例
-
无货源搬家
批量跑
item_get_web→ 转存 SKU 图 + 详情图到 OSS → 生成新 HTML → 上传到拼多多/抖店,完成"一键搬家"。 -
比价工具
每 30 min 轮询 Top 1000 SKU 的
coupon_price→ 写回 Redis → 前端价格曲线实时可视化。 -
库存预警
df_sku["stock"] < 10自动发飞书机器人,提醒运营及时补货。
七、小结
item_get_web 的核心就是解析淘宝 Web 端 JSONP 接口 ,一次性拿到 SKU、价格、库存、优惠券、详情图 5 大类数据。
跑通上面 30 行代码,再叠加异步下载、图片转存、字段清洗,就能在选品、比价、ERP 搬家场景中快速上线。祝你"搬"得开心,单量长虹!
如遇任何疑问或有进一步的需求,请随时与我私信或者评论联系。