淘宝 API 详情类 JSON 结构化解析实战(核心章节)
前言
一、前言:为什么结构化解析是核心?
字段缺失导致程序崩溃
SKU 解析混乱
价格类型不统一
图片防盗链无法展示
HTML 详情无法直接复用
二、解析目标
商品基础信息(ID、标题、类目、状态)
价格体系(原价、促销价、券后价)
SKU 规格(规格名、规格值、价格、库存)
图片资源(主图、详情图、去防盗链处理)
商品详情(HTML 清洗、文本提取)
销售信息(销量、发货地、服务)
三、原始 JSON 结构回顾(简化版)
{
"item_get_response": {
"item": {
"num_iid": "680123456789",
"title": "夏季纯棉短袖T恤",
"price": "89.00",
"promotion_price": "59.00",
"pic_url": "https://img.taobao.com/xxx.jpg",
"item_imgs": [ {"url":"https://img.taobao.com/xxx1.jpg"}, ... ],
"skus": {
"sku": [
{
"sku_id": "123456",
"price": "59.00",
"quantity": 100,
"properties_name": "颜色:白色;尺码:M"
}
]
},
"desc": "<p>商品详情HTML</p>",
"sales": 12345,
"free_ship": true
}
}}四、结构化解析实战(分步 + 代码 + 说明)
1. 根节点解析:提取 item 主体
item_get_response → item 下python运行
# 解析入口def parse_item(json_data):
# 1. 提取根节点
response = json_data.get("item_get_response", {})
item = response.get("item", {})
if not item:
raise Exception("商品数据为空")
return item2. 基础字段解析(最稳定、必用)
python运行
num_iid = item.get("num_iid", "") # 商品唯一IDtitle = item.get("title", "") # 标题cid = item.get("cid", "") # 类目IDcategory_name = item.get("category_name", "") # 类目名称location = item.get("location", "") # 发货地seller_nick = item.get("nick", "") # 卖家昵称shop_name = item.get("shop_name", "") # 店铺名detail_url = item.get("detail_url", "") # 商品链接
num_iid必须字符串类型,不能转数字(避免超长精度丢失)
3. 价格体系解析(重点)
运行
# 价格统一格式化price_data = {
"origin_price": float(item.get("price", 0)), # 原价
"sale_price": float(item.get("promotion_price", 0)),# 促销价
"final_price": 0.0}# 最终价 = 促销价优先,无促销则用原价price_data["final_price"] = price_data["sale_price"] or price_data["origin_price"]4. 图片资源解析(去防盗链)
运行
# 主图main_pic = item.get("pic_url", "")# 详情图列表item_imgs = item.get("item_imgs", [])img_list = [img.get("url", "") for img in item_imgs if img.get("url")]# 清洗:去掉协议头,兼容HTTPS/HTTPimg_list = [
url.replace("http:", "https:") for url in img_list]5. SKU 规格结构化解析(最复杂、最核心)
目标:
颜色:白色;尺码:M 解析为:plaintext
{
"specs": {"颜色":"白色","尺码":"M"},
"price":59,
"stock":100
}解析代码
运行
sku_list = []sku_array = item.get("skus", {}).get("sku", [])for sku in sku_array:
sku_id = sku.get("sku_id", "")
price = float(sku.get("price", 0))
stock = sku.get("quantity", 0)
props_name = sku.get("properties_name", "")
# 拆分规格:颜色:白色;尺码:M
specs = {}
if props_name:
prop_arr = props_name.split(";")
for p in prop_arr:
if ":" in p:
k, v = p.split(":", 1)
specs[k] = v
sku_info = {
"sku_id": sku_id,
"price": price,
"stock": stock,
"specs": specs }
sku_list.append(sku_info)6. 商品详情 HTML 解析与清洗
运行
desc_html = item.get("desc", "")# 清洗:去掉淘宝无用标签、懒加载、内链def clean_html(html):
html = html.replace("data-src", "src") # 懒加载替换
html = html.replace("taobao.com", "") # 可按需过滤
return html7. 销售与服务结构化
运行
sales_info = {
"sales": item.get("sales", 0), # 销量
"free_shipping": item.get("free_ship", False), # 是否包邮
"service": item.get("service", ""), # 服务:七天无理由
"is_on_sale": True # 可根据字段判断上下架}五、最终输出:标准结构化商品模型
json
{
"num_iid": "680123456789",
"title": "夏季纯棉短袖T恤",
"price": {
"origin": 89.00,
"sale": 59.00,
"final": 59.00
},
"images": {
"main": "https://img.taobao.com/xxx.jpg",
"list": [ "https://img.taobao.com/xxx1.jpg", ... ]
},
"skus": [
{
"sku_id": "123456",
"price": 59.00,
"stock": 100,
"specs": { "颜色": "白色", "尺码": "M" }
}
],
"sales": 12345,
"free_shipping": true,
"desc": "<p>清洗后的HTML</p>"}六、本章技术总结(可直接放文章结尾)
统一字段,消除 API 嵌套混乱
SKU 规格化,支撑下单、库存、规格选择
价格标准化,支撑比价、监控、营销
图片 / 详情清洗,支持多端展示
输出标准模型,可直接用于业务系统