你想通过 Python 解析淘宝商品详情 API 返回的 JSON 数据结构,核心是精准提取商品标题、价格、规格、库存等核心字段,并处理多层嵌套、字段缺失等常见问题。我会从数据结构分析、核心字段提取、异常处理、完整代码示例四个维度,给出可直接落地的解析方案。
一、淘宝商品详情 API 返回的 JSON 结构特征
淘宝商品详情 API(如开放平台的taobao.item.get接口)返回的 JSON 数据具有多层嵌套、字段标准化、部分字段可选的特点,核心结构分为「公共返回层」和「商品数据层」:
典型 JSON 结构示例
json
{ "request_id": "123456789", // 公共返回字段:请求ID "code": 0, // 公共返回字段:0=成功,非0=失败 "msg": "success", // 公共返回字段:提示信息 "data": { // 核心商品数据层 "item": { "num_iid": "1234567890",// 商品ID(唯一标识) "title": "2025新款夏季短袖T恤男女宽松纯棉百搭上衣", // 商品标题 "price": "59.90", // 商品价格(字符串类型,需转浮点数) "sales": "10000+", // 销量 "stock": 5000, // 库存数量 "item_imgs": [ // 商品图片列表(数组) {"url": "https://img1.xxx.com/xxx/1.jpg"}, {"url": "https://img1.xxx.com/xxx/2.jpg"} ], "props": [ // 商品属性(如品牌、材质) {"name": "品牌", "value": "XX优选"}, {"name": "材质", "value": "纯棉"} ], "sku_list": [ // SKU规格列表(可选,多规格商品才有) { "sku_id": "987654321", "sku_name": "白色-L", "sku_price": "59.90", "sku_stock": 1000 }, { "sku_id": "987654322", "sku_name": "黑色-M", "sku_price": "59.90", "sku_stock": 800 } ], "seller": { // 卖家信息(嵌套对象) "nick": "XX服饰旗舰店", "shop_id": "987654321", "score": 4.8 // 店铺评分 }, "shipping": { // 物流信息(可选) "type": "包邮", "fee": "0.00" } } } }
核心字段分类
| 字段层级 | 字段名 | 类型 | 说明 |
| 公共层 | code/msg/request_id | 整型 / 字符串 / 字符串 | 接口调用状态,优先校验code=0再解析数据 |
| 商品基础层 | num_iid/title/price | 字符串 / 字符串 / 字符串 | 核心标识与基础信息,price 需转浮点数 |
| 数组层 | item_imgs/props/sku_list | 数组 | 图片、属性、SKU 等列表数据 |
| 嵌套对象层 | seller/shipping | 对象 | 卖家、物流等子结构 |
二、Python 解析核心步骤与技巧
1. 基础解析:提取核心字段
使用 Python 内置的json模块解析 JSON 字符串,通过「键索引 + 循环」提取多层嵌套字段,核心技巧:
- 用
get()方法替代直接索引(避免字段缺失报错); - 数组字段通过循环遍历提取;
- 数值型字符串(如 price)需转换为对应类型。
2. 异常处理:应对字段缺失 / 类型异常
淘宝 API 返回的部分字段(如sku_list、shipping)仅在特定场景下存在,需处理:
- 字段不存在:用
get(key, 默认值)兜底; - 类型异常:用
try-except捕获转换错误(如 price 非数字); - 数组为空:判断长度后再遍历。
三、完整解析代码示例
以下代码包含「JSON 解析、核心字段提取、异常处理、数据格式化」全流程,可直接复用:
python
运行
import json def parse_taobao_item_json(json_str): """ 解析淘宝商品详情API返回的JSON数据 :param json_str: API返回的JSON字符串 :return: 格式化的商品数据字典(含核心字段) """ # 初始化返回结果 result = { "success": False, "error_msg": "", "item_data": {} } try: # 1. 解析JSON字符串 data = json.loads(json_str) # 2. 校验接口调用是否成功 if data.get("code") != 0: result["error_msg"] = f"API调用失败:{data.get('msg', '未知错误')}" return result # 3. 提取核心商品数据层(item) item = data.get("data", {}).get("item", {}) if not item: result["error_msg"] = "未获取到商品数据" return result # 4. 提取基础字段(用get兜底,避免字段缺失) item_data = { "商品ID": item.get("num_iid", ""), "标题": item.get("title", ""), "价格": 0.0, "销量": item.get("sales", ""), "库存": item.get("stock", 0), "商品图片": [], "商品属性": {}, "SKU列表": [], "卖家昵称": "", "店铺评分": 0.0, "物流类型": "" } # 5. 处理价格(字符串转浮点数,捕获异常) price_str = item.get("price", "0.00") try: item_data["价格"] = float(price_str) except (ValueError, TypeError): item_data["价格"] = 0.0 # 6. 提取商品图片列表(数组遍历) item_imgs = item.get("item_imgs", []) for img in item_imgs: img_url = img.get("url", "") if img_url: item_data["商品图片"].append(img_url) # 7. 提取商品属性(数组转字典,便于查询) props = item.get("props", []) for prop in props: prop_name = prop.get("name", "") prop_value = prop.get("value", "") if prop_name: item_data["商品属性"][prop_name] = prop_value # 8. 提取SKU列表(多规格商品) sku_list = item.get("sku_list", []) for sku in sku_list: sku_info = { "SKU_ID": sku.get("sku_id", ""), "规格名称": sku.get("sku_name", ""), "规格价格": 0.0, "规格库存": 0 } # SKU价格转换 sku_price_str = sku.get("sku_price", "0.00") try: sku_info["规格价格"] = float(sku_price_str) except (ValueError, TypeError): sku_info["规格价格"] = 0.0 # SKU库存 sku_info["规格库存"] = sku.get("sku_stock", 0) item_data["SKU列表"].append(sku_info) # 9. 提取卖家信息(嵌套对象) seller = item.get("seller", {}) item_data["卖家昵称"] = seller.get("nick", "") try: item_data["店铺评分"] = float(seller.get("score", 0.0)) except (ValueError, TypeError): item_data["店铺评分"] = 0.0 # 10. 提取物流信息(可选字段) shipping = item.get("shipping", {}) item_data["物流类型"] = shipping.get("type", "不包邮") # 11. 解析成功,更新结果 result["success"] = True result["item_data"] = item_data except json.JSONDecodeError: result["error_msg"] = "JSON格式解析失败" except Exception as e: result["error_msg"] = f"解析异常:{str(e)}" return result # -------------------------- 测试示例 -------------------------- if __name__ == "__main__": # 模拟淘宝API返回的JSON字符串 test_json = ''' { "request_id": "123456789", "code": 0, "msg": "success", "data": { "item": { "num_iid": "1234567890", "title": "2025新款夏季短袖T恤男女宽松纯棉百搭上衣", "price": "59.90", "sales": "10000+", "stock": 5000, "item_imgs": [ {"url": "https://img1.xxx.com/xxx/1.jpg"}, {"url": "https://img1.xxx.com/xxx/2.jpg"} ], "props": [ {"name": "品牌", "value": "XX优选"}, {"name": "材质", "value": "纯棉"} ], "sku_list": [ { "sku_id": "987654321", "sku_name": "白色-L", "sku_price": "59.90", "sku_stock": 1000 }, { "sku_id": "987654322", "sku_name": "黑色-M", "sku_price": "59.90", "sku_stock": 800 } ], "seller": { "nick": "XX服饰旗舰店", "shop_id": "987654321", "score": 4.8 }, "shipping": { "type": "包邮", "fee": "0.00" } } } } ''' # 调用解析函数 parse_result = parse_taobao_item_json(test_json) # 输出解析结果 if parse_result["success"]: print("✅ 解析成功:") for key, value in parse_result["item_data"].items(): print(f"{key}: {value}") else: print(f"❌ 解析失败:{parse_result['error_msg']}")
代码关键说明
- 容错处理:所有字段提取均使用
get()方法,避免KeyError;数值转换(如价格)加try-except,防止非数字字符串导致崩溃。 - 数据格式化:
- 商品属性从「数组」转为「字典」(如
{"品牌": "XX优选"}),便于按属性名快速查询; - SKU 列表保留原结构,但统一字段名和数据类型,方便后续批量处理。
- 状态校验:先校验 API 返回的
code字段,确保接口调用成功后再解析商品数据,避免无效解析。
四、扩展场景:批量解析与数据存储
若需批量解析多个商品的 JSON 数据,可基于上述函数扩展:
python
运行
def batch_parse_taobao_items(json_str_list): """批量解析多个淘宝商品JSON数据""" batch_result = [] for json_str in json_str_list: item_result = parse_taobao_item_json(json_str) batch_result.append(item_result) return batch_result # 示例:将解析结果存入CSV import csv def save_to_csv(item_data, csv_path): """将解析后的商品数据存入CSV""" # 定义CSV表头 headers = ["商品ID", "标题", "价格", "销量", "库存", "卖家昵称", "物流类型"] # 提取数据行 row = [ item_data["商品ID"], item_data["标题"], item_data["价格"], item_data["销量"], item_data["库存"], item_data["卖家昵称"], item_data["物流类型"] ] # 写入CSV with open(csv_path, "a", encoding="utf-8-sig", newline="") as f: writer = csv.writer(f) # 首次写入表头(判断文件是否为空) import os if os.path.getsize(csv_path) == 0: writer.writerow(headers) writer.writerow(row) # 调用示例 # save_to_csv(parse_result["item_data"], "淘宝商品数据.csv")
总结
Python 解析淘宝商品详情 API JSON 数据的核心要点:
- 容错优先:用
get()替代直接索引,数值转换加异常捕获,应对字段缺失 / 类型异常; - 分层解析:先校验公共返回字段(code/msg),再提取商品核心层,最后处理数组 / 嵌套对象;
- 格式统一:将数组型字段(如属性、SKU)转换为易使用的结构(字典 / 标准化列表),便于后续分析 / 存储。
如果需要,我可以补充「淘宝 API 返回的特殊字段(如促销价格、运费模板)解析代码」,或「解析结果可视化(如价格 / 库存统计图表)」的实现方案。