
本文教你如何识别并直接解析返回纯 json 数据的 api 接口(而非 html 页面),避免错误使用 beautifulsoup,通过 response.json() 高效提取结构化字段,如商品 id、类型、价格等。
本文教你如何识别并直接解析返回纯 json 数据的 api 接口(而非 html 页面),避免错误使用 beautifulsoup,通过 response.json() 高效提取结构化字段,如商品 id、类型、价格等。
你当前遇到的核心问题,是一个典型的「API 响应类型误判」:你调用的是 https://us.mspapis.com/shopinventory/v1/shops/listings/{ID} 这类标准 RESTful API 接口,它根本不会返回 HTML 文本,而是直接返回格式良好的 JSON 数据(如你贴出的字典结构所示)。因此,用 BeautifulSoup 解析纯 JSON 字符串不仅无效,还会导致解析失败或返回空/乱码内容——因为 BeautifulSoup 是为解析 HTML/XML 设计的,不是为 JSON。
✅ 正确做法是:跳过 HTML 解析步骤,直接调用 requests.Response.json() 方法。该方法会自动解码响应体、校验 JSON 语法,并返回 Python 原生字典(dict)或列表(list),可直接通过键名访问嵌套数据。
以下是优化后的完整示例代码(含错误处理与批量扩展提示):
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
import requests
import time
def fetch_item_data(item_id: int) -> dict:
url = f"https://us.mspapis.com/shopinventory/v1/shops/listings/{item_id}"
try:
resp = requests.get(url, timeout=10)
resp.raise_for_status() # 抛出 4xx/5xx 状态码异常
return resp.json()
except requests.exceptions.RequestException as e:
print(f"请求 ID {item_id} 失败: {e}")
return None
# 示例:获取单个商品的 item.id 和 type
IDNum = 688
data = fetch_item_data(IDNum)
if data and "item" in data:
item = data["item"]
print(f"商品 ID: {item.get('id')}, 类型: {item.get('type')}, 是否单次购买: {item.get('singlePurchase')}")
# ✅ 批量抓取 13000+ ID 的关键提示:
# - 添加请求间隔(如 time.sleep(0.1))避免被限流
# - 使用 session 复用连接提升效率
# - 将结果写入 JSONL 或 CSV 文件,而非内存累积⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- 不要再对 API 响应使用 BeautifulSoup(page.text, 'html.parser') —— 它无法解析 JSON,且 page.text 在 JSON 场景下已是字符串,无需“解析”。
- resp.json() 内部已处理字符编码(如 UTF-8),无需手动解码。
- 务必调用 resp.raise_for_status(),否则 HTTP 错误(如 404、429)会被静默忽略,导致后续 .json() 报 JSONDecodeError。
- 若需提取全部 13000+ 商品的 item.id,建议构建循环 + 异常重试机制,并将结果逐行写入文件(例如 with open("item_ids.txt", "a") as f: f.write(item_id + "\n")),避免内存溢出。
总结:识别接口本质是关键——看响应头 Content-Type: application/json 或直接打印 resp.text[:200] 观察是否为 { 开头的结构化文本。一旦确认为 JSON,就坚定使用 resp.json(),这是最简洁、高效、符合 Python 惯例的解析方式。


















