大家好,我是python网络爬虫这门课程的主要讲师geo
为什么在爬虫课程中必须讲数据保存
许多初学者在学习网络爬虫时,会将注意力几乎全部放在请求是否成功、反爬是否绕过、网页是否能解析。但在真实项目中,爬虫只是整个数据流程中最短暂的一步。
如果抓到的数据没有被正确保存,那么这些数据无法复用、无法分析,也无法作为资产积累。每一次分析都要重新爬取,不仅浪费时间,也容易触发封锁机制。
从工程角度来看,爬虫负责的是数据获取,数据保存负责的是数据资产管理。一个不能稳定保存数据的爬虫系统,在商业与研究环境中几乎没有价值。
网络爬虫中的数据生命周期
一个完整的数据流程包括以下阶段:
网页或 API 提供原始数据
↓
通过 HTTP 请求获取响应
↓
解析 HTML 或 JSON 内容
↓
将解析结果转为 Python 中的结构化数据
↓
将结构化数据保存为文件或数据库
↓
后续进行清洗、分析、建模或可视化
本讲稿的核心关注点,是结构化数据到长期存储这一阶段。
爬虫中常见的数据形态
在实际爬虫项目中,保存的数据并不只有一种类型。
最常见的是文本数据,例如新闻标题、商品名称、文章内容、评论文字。这类数据在 Python 中通常以字符串形式存在。
其次是数值数据,例如价格、评分、浏览量、金融市场中的开盘价和收盘价。这类数据需要注意类型转换,确保保存时保持数值属性。
第三类是结构化数据,通常表现为字典或由字典组成的列表。几乎所有实际爬虫项目最终都会将数据整理成这种形式。
最后是嵌套或半结构化数据,例如评论中包含用户信息、商品中包含规格列表。这类数据非常适合使用 JSON 或 NoSQL 数据库保存。
使用 TXT 文件保存数据的教学场景
TXT 是最基础的保存方式,也是教学中最早可以引入的方式。它的主要用途并不是最终数据存储,而是调试、验证与保留原始内容。
在教学中,TXT 非常适合用来保存原始 HTML,帮助学生理解网页结构,也便于排查解析错误。
with open("test.txt", "w", encoding="utf-8") as f:
f.write("Hello, file!")
CSV 文件在爬虫教学中的核心地位
CSV 是网络爬虫教学中最重要的文件格式之一。它兼容 Excel,能直接被 Pandas 读取,是数据分析和机器学习的标准输入格式。
在教学中,可以将 CSV 视为“二维表格数据”的标准表示方式。每一行是一条记录,每一列是一个字段。
import csv
data = [
["Name", "Age"],
["Alice", 30],
["Bob", 25]
]
with open("test.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerows(data)
pandas
import pandas as pd
df = pd.DataFrame(data)
df.to_csv("products.csv", index=False, encoding="utf-8-sig")
使用 JSON 保存爬虫数据的实践方式
JSON 是网络爬虫中最自然、最常见的数据保存格式。大量网页接口本身就是以 JSON 形式返回数据,因此在很多场景下,爬虫只是做了“转存”工作。
JSON 能够自然地表达嵌套结构,非常适合保存复杂对象,例如商品详情、用户信息、评论列表等。
import json
data = {"name": "Alice", "age": 30}
with open("test.json", "w", encoding="utf-8") as f:
json.dump(data, f)
网络爬虫数据保存的核心观念总结
在爬虫课程中,最终必须建立一个清晰的认知:爬虫只是手段,数据才是目标。
真正有价值的能力,不是写出一个能跑的爬虫脚本,而是设计一个稳定、可扩展、可复用的数据存储体系。
一个优秀的爬虫工程师,应该随时清楚自己的数据存在哪里、以什么结构保存、未来如何被使用。
还能保存成下列的资料类型
文本与数据类
| 文件类型 | 描述 | 模块/方法 |
|---|---|---|
.txt |
普通文本 | open(..., "w") |
.json |
JSON 数据 | json.dump() |
.csv |
表格数据 | csv.writer() |
.xml |
XML 数据 | xml.etree.ElementTree |
.yaml / .yml |
配置数据(类似 JSON) | PyYAML 模块 |
.ini |
配置文件(键值对) | configparser |
数据分析 / 科学计算
| 文件类型 | 描述 | 模块/方法 |
|---|---|---|
.xlsx / .xls |
Excel 文件 | openpyxl, pandas, xlwt |
.h5 |
HDF5 数据文件 | h5py, pandas |
.parquet |
列式存储文件(大数据) | pyarrow, pandas |
.pkl / .pickle |
Python 对象序列化 | pickle.dump() |
图片与图形类
| 文件类型 | 描述 | 模块/方法 |
|---|---|---|
.png, .jpg |
图片文件 | PIL.Image.save() |
.svg |
矢量图形 | svgwrite, matplotlib |
.pdf |
PDF 文件 | reportlab, fpdf, PyPDF2(读取) |
音频 / 视频 / 压缩
| 文件类型 | 描述 | 模块/方法 |
|---|---|---|
.mp3, .wav |
音频文件 | pydub, wave, scipy.io.wavfile |
.mp4, .avi |
视频文件 | moviepy, opencv |
.zip, .tar.gz |
压缩包 | zipfile, tarfile |
机器学习 / 模型存储
| 文件类型 | 描述 | 模块/方法 |
|---|---|---|
.pkl |
存储模型对象 | pickle |
.joblib |
存储大模型(更高效) | joblib.dump() |
.h5 |
Keras 模型权重 | model.save("model.h5") |
.onnx |
通用神经网络格式 | onnx.save() |