如何使用Python进行京东商品详情API的JSON数据解析?
·
你想知道如何用 Python 解析京东商品详情 API 返回的 JSON 数据,我会从「数据结构分析→基础解析→复杂字段解析→异常处理」全流程拆解,结合真实的 JSON 示例给出可直接运行的代码,确保你能精准提取价格、销量、规格等核心字段,同时规避解析过程中的常见坑。
一、核心前提
- 数据准备:先通过京东 API(开放平台 / 第三方 / 抓包)获取 JSON 格式的商品详情数据(下文附真实示例);
- 依赖说明:仅需 Python 内置的
json模块(无需额外安装),如需批量处理可搭配pandas。
二、京东商品详情 API JSON 数据示例(真实结构)
先看一份典型的京东商品详情 JSON 返回(第三方 API / 开放平台通用结构),后续解析均基于此:
json
{
"error_code": 0,
"reason": "success",
"result": {
"sku_id": "100060195820",
"title": "京东京造 轻量便携保温杯 350ml 白色 316不锈钢水杯",
"price": "99.9",
"original_price": "129.9",
"sales": "10万+",
"stock_state": "有货",
"stock_num": "10000+",
"shop_name": "京东京造官方旗舰店",
"brand": "京东京造",
"pic_url": "https://img10.360buyimg.com/n1/jfs/t1/24350/10/5360/133513/66f19952F80d97870/xxx.jpg",
"spec_info": "颜色:白色|容量:350ml",
"spec_list": [
{"name": "颜色", "value": "白色"},
{"name": "容量", "value": "350ml"}
],
"delivery_place": "北京",
"good_rate": "98%",
"category": "家居>厨具>水杯>保温杯"
}
}
三、Python 解析 JSON 数据全流程(分步实现)
步骤 1:基础解析(提取核心简单字段)
先将 JSON 字符串转为 Python 字典,再提取标题、价格、店铺名称等基础字段,这是最常用的解析场景。
python
运行
import json
# 1. 模拟API返回的JSON字符串(实际开发中替换为API请求的response.text)
json_str = '''
{
"error_code": 0,
"reason": "success",
"result": {
"sku_id": "100060195820",
"title": "京东京造 轻量便携保温杯 350ml 白色 316不锈钢水杯",
"price": "99.9",
"original_price": "129.9",
"sales": "10万+",
"stock_state": "有货",
"shop_name": "京东京造官方旗舰店"
}
}
'''
# 2. 将JSON字符串解析为Python字典(核心步骤)
try:
# 解析JSON,ensure_ascii=False保留中文
data = json.loads(json_str)
except json.JSONDecodeError as e:
print(f"JSON解析失败:{e}")
exit()
# 3. 提取核心字段(用dict.get()避免字段缺失报错,新手必学)
if data.get("error_code") == 0: # 先判断API调用是否成功
item = data.get("result", {}) # 商品数据主体
# 提取简单字段(基础信息)
sku_id = item.get("sku_id", "未知") # 字段缺失时返回"未知"
title = item.get("title", "未知")
price = float(item.get("price", 0.0)) # 价格转为浮点数(便于计算)
original_price = float(item.get("original_price", 0.0))
sales = item.get("sales", "0")
stock_state = item.get("stock_state", "未知")
shop_name = item.get("shop_name", "未知")
# 打印解析结果
print("=== 基础字段解析结果 ===")
print(f"商品ID:{sku_id}")
print(f"商品标题:{title}")
print(f"当前价格:{price}元(原价:{original_price}元)")
print(f"销量:{sales}")
print(f"库存状态:{stock_state}")
print(f"店铺名称:{shop_name}")
else:
print(f"API调用失败:{data.get('reason', '未知原因')}")
步骤 2:复杂字段解析(规格、分类等)
针对 JSON 中的数组、字符串拼接的复杂字段(如规格列表、分类路径),需做针对性解析:
python
运行
# 接上文的data变量,继续解析复杂字段
item = data.get("result", {})
# 1. 解析规格列表(数组类型)
spec_list = item.get("spec_list", [])
print("\n=== 规格列表解析结果 ===")
for spec in spec_list:
spec_name = spec.get("name", "未知")
spec_value = spec.get("value", "未知")
print(f"{spec_name}:{spec_value}")
# 2. 解析拼接的规格字符串(如"颜色:白色|容量:350ml")
spec_info = item.get("spec_info", "")
if spec_info:
spec_dict = {}
# 按|分割,再按:分割键值
for s in spec_info.split("|"):
if ":" in s:
k, v = s.split(":", 1) # 1表示只分割一次,避免值含:
spec_dict[k.strip()] = v.strip()
print("\n=== 拼接规格字符串解析结果 ===")
print(spec_dict)
# 3. 解析分类路径(如"家居>厨具>水杯>保温杯")
category = item.get("category", "")
if category:
category_list = category.split(">")
print("\n=== 分类路径解析结果 ===")
print(f"一级分类:{category_list[0] if category_list else '未知'}")
print(f"二级分类:{category_list[1] if len(category_list)>=2 else '未知'}")
print(f"末级分类:{category_list[-1] if category_list else '未知'}")
# 4. 销量字段标准化(将"10万+"转为数值100000)
sales = item.get("sales", "0")
def parse_sales(sales_str):
if "万+" in sales_str:
return int(float(sales_str.replace("万+", "")) * 10000)
elif "万" in sales_str:
return int(float(sales_str.replace("万", "")) * 10000)
else:
return int(float(sales_str.replace("+", ""))) if sales_str.replace("+", "").isdigit() else 0
sales_num = parse_sales(sales)
print("\n=== 销量标准化结果 ===")
print(f"原始销量:{sales} → 数值销量:{sales_num}")
步骤 3:批量解析(多商品 JSON 数据)
如果返回的是多商品 JSON 数组,或批量采集了多个商品的 JSON 数据,可循环解析:
python
运行
# 模拟多商品JSON数组
multi_json_str = '''
[
{
"error_code": 0,
"reason": "success",
"result": {"sku_id": "100060195820", "title": "保温杯", "price": "99.9"}
},
{
"error_code": 0,
"reason": "success",
"result": {"sku_id": "100080907904", "title": "充电宝", "price": "89.9"}
}
]
'''
# 批量解析
try:
multi_data = json.loads(multi_json_str)
print("\n=== 批量解析结果 ===")
for idx, item_data in enumerate(multi_data):
if item_data.get("error_code") == 0:
item = item_data.get("result", {})
print(f"商品{idx+1}:ID={item.get('sku_id')},标题={item.get('title')},价格={item.get('price')}元")
except Exception as e:
print(f"批量解析失败:{e}")
步骤 4:结合 Pandas 解析(便于数据分析)
如需将解析后的数据存入表格 / 做分析,可搭配pandas:
python
运行
import pandas as pd
# 解析后的数据存入列表
parsed_data = []
item = data.get("result", {})
parsed_data.append({
"sku_id": item.get("sku_id"),
"title": item.get("title"),
"price": float(item.get("price", 0.0)),
"sales": parse_sales(item.get("sales", "0")),
"stock_state": item.get("stock_state")
})
# 转为DataFrame
df = pd.DataFrame(parsed_data)
print("\n=== Pandas解析结果(表格) ===")
print(df)
# 保存为CSV
df.to_csv("jd_item_parsed.csv", index=False, encoding="utf-8-sig")
print("解析后的数据已保存为jd_item_parsed.csv")
四、解析过程中的核心避坑点
- 避免 KeyError:
- 不要直接用
data["result"]["price"],而是用data.get("result", {}).get("price", "未知"),字段缺失时返回默认值;
- 不要直接用
- 数据类型转换:
- 价格、销量等字段返回的是字符串,需转为
float/int才能做计算(如价格对比、销量排序);
- 价格、销量等字段返回的是字符串,需转为
- JSON 格式错误:
- 解析前用
try-except捕获JSONDecodeError,避免因 API 返回非标准 JSON 导致程序崩溃;
- 解析前用
- 特殊字符处理:
- 解析规格、标题等含特殊字符的字段时,用
strip()去除首尾空格,避免数据脏污;
- 解析规格、标题等含特殊字符的字段时,用
- 多层级嵌套:
- 开放平台 API 的 JSON 可能有多层嵌套(如
response["data"]["item"]["price"]),需逐层用get()解析。
- 开放平台 API 的 JSON 可能有多层嵌套(如
总结
- 核心步骤:
json.loads()将 JSON 字符串转字典 → 用dict.get()安全提取字段 → 针对复杂字段(规格、销量)做格式化处理; - 关键技巧:所有字段提取均用
get()+ 默认值,避免 KeyError;数值型字段(价格、销量)务必做类型转换; - 扩展场景:批量解析用循环,数据分析用 Pandas,核心逻辑不变。
更多推荐



所有评论(0)