单元 3 · 进阶爬取 — 预计 50 分钟
JSON 接口与数据存储
📍 本课路径
- 识别并请求 JSON 接口
- 解析嵌套 JSON 结构
- 使用 SQLite 存储结构化数据
🎯 学习节奏:① 看目标 → ② 先思考再动手 → ③ 在运行器写代码 → ④ 失败时按提示重试 → ⑤ 通过后看思路
很多现代网站的数据根本不在 HTML 里——它在背后一个 JSON 接口 返回,前端再用 JS 渲染。直接抓接口,往往比解析 HTML 更干净、更稳。
一、发现 JSON 接口
打开浏览器 F12 → Network,筛选 XHR / Fetch,刷新页面,看那些返回 Content-Type: application/json 的请求。它的 URL 就是你要抓的接口。
import requests
resp = requests.get(api_url, headers=headers, timeout=5)
data = resp.json() # 直接把响应体解析成 dict / list
接口常带分页参数(如
?offset=0&limit=20),翻页方式和 HTML 分页一样。
二、可运行:解析嵌套 JSON
下面给你一段 JSON 接口的返回数据,你需要补全解析逻辑:
import json
raw = '{"total": 2, "items": [{"id": 1, "title": "Python 入门", "price": 59}, {"id": 2, "title": "爬虫实战", "price": 69}]}'
# TODO 1: 用 json.loads(raw) 解析为 Python 字典 data
data = json.loads(raw)
# TODO 2: 打印 data total(总数)
print("共", data["total"], "本")
# TODO 3: 遍历 data items,打印每本书的 title 和 price
for item in data["items"]:
print(item["title"], "->", item.get("price"))三、用 SQLite 持久化
抓来的数据要落库才方便查询。标准库 sqlite3 零配置,下面需要你补全建表、插入、查询:
import sqlite3
conn = sqlite3.connect(":memory:")
c = conn.cursor()
# TODO 1: 创建表 book,字段为 title TEXT 和 price INTEGER
c.execute("CREATE TABLE book (title TEXT, price INTEGER)")
# TODO 2: 插入第一条 Python 入门 59
c.execute("INSERT INTO book VALUES (?, ?)", ("Python 入门", 59))
# TODO 3: 插入第二条 爬虫实战 69
c.execute("INSERT INTO book VALUES (?, ?)", ("爬虫实战", 69))
# TODO 4: SELECT 查询并打印所有行
for row in c.execute("SELECT * FROM book"):
print(row)
conn.close()真实场景把
:memory:换成文件名(如"books.db"),数据就持久保存在磁盘上。
四、串联靶站
去 Level 4 靶站 找一个返回 JSON 的接口,用 resp.json() 解析,再写进 SQLite。
五、小结
- JSON 接口:Network → XHR/Fetch 找
application/json请求,resp.json()解析。 - 嵌套 JSON 用字典取值;缺失字段用
.get兜底。 sqlite3零配置:connect→execute(CREATE/INSERT/SELECT)→close。- 内存库
:memory:适合练手,真实数据用文件名持久化。
靶站实战:前往 /practice/level4-json-api/ 动手练习本课内容。