单元 2 · 数据解析 — 预计 45 分钟
单页数据实战
📍 本课路径
- 独立完成单页爬取流程
- 将结果保存为 CSV
- 结合靶站 Level 1 实操
🎯 学习节奏:① 看目标 → ② 先思考再动手 → ③ 在运行器写代码 → ④ 失败时按提示重试 → ⑤ 通过后看思路
前面学的解析(BeautifulSoup、XPath)终于要落地了:这一章我们完整爬取一个列表页,并把结果存成 CSV 文件。凡是「列表页 → 抓数据 → 落库」,骨架都一样。
一、单页爬取的通用四步
请求(request) → 解析(parse) → 提取(extract) → 存储(store)
- 请求:拿到网页 HTML(用
requests.get)。 - 解析:
BeautifulSoup(html, "lxml")变成可查询对象。 - 提取:
select/xpath取出每一条数据,整理成字典列表。 - 存储:写进 CSV / 数据库。
二、可运行:解析列表并收集为字典列表
下面需要你补全——给定图书列表 HTML,把每本书解析成 {"title":..., "price":...} 字典并收集:
from bs4 import BeautifulSoup
html = """<ul class="books">
<li class="book"><span class="title">Python 入门</span><span class="price">59</span></li>
<li class="book"><span class="title">爬虫实战</span><span class="price">69</span></li>
<li class="book"><span class="title">数据分析</span><span class="price">79</span></li>
</ul>"""
# TODO 1: 用 BeautifulSoup 解析 html(lxml)
soup = BeautifulSoup(html, "lxml")
books = []
# TODO 2: 用 soup.select(".books li.book") 遍历每本书
for li in soup.select(".books li.book"):
# TODO 3: 提取 .title 和 .price 的文本,append 到 books 列表
books.append({
"title": li.select_one(".title").get_text(strip=True),
"price": li.select_one(".price").get_text(strip=True),
})
print("共抓到:", len(books), "本")
for b in books:
print(b)三、保存为 CSV
拿到字典列表后,用标准库 csv 落盘。你需要补全写入逻辑:
import csv, io
books = [
{"title": "Python 入门", "price": "59"},
{"title": "爬虫实战", "price": "69"},
{"title": "数据分析", "price": "79"},
]
buf = io.StringIO()
writer = csv.DictWriter(buf, fieldnames=["title", "price"])
writer.writeheader()
# TODO: 用 writerows 把 books 全部写进去,然后打印 buf.getvalue()
writer.writerows(books)
print(buf.getvalue())真实落地只要把
io.StringIO()换成open("books.csv", "w", newline="", encoding="utf-8"),其余写法完全一致。newline=""能避免 Windows 下多出空行。
四、串联靶站
打开 Level 1 靶站,用浏览器「检查」观察表格结构,然后用本课的思路把 24 行书名价格抓出来。本页底部的「代码实战」会带你做一遍。
五、小结
- 单页爬取四步:请求 → 解析 → 提取 → 存储。
- 提取的核心是「每条数据 → 一个字典」,再汇总成列表。
csv.DictWriter把字典列表写成 CSV;newline=""防空行。- 先把整条链路用内联 HTML 跑通,再换成真实
requests+open落地。
靶站实战:前往 /practice/level1-books/ 动手练习本课内容。