在当今数据驱动的世界里,无论是构建搜索引擎、训练AI模型,还是进行市场舆情监控,爬虫(Web Crawler)都是一项不可或缺的技能。它就像一位不知疲倦的机器人,按照预设的规则自动从互联网上抓取你需要的任何公开数据。本文将从零开始,为你系统梳理Python爬虫的核心原理、协议规范以及四大关键步骤,帮助你快速建立起完整的知识框架。无论你是编程新手,还是想拓展技能栈的开发者,这篇文章都将是你入门的最佳起点。
提问时间:你最初是因为什么想学爬虫的?是想抓点数据做分析,还是单纯觉得“黑客”很酷?欢迎在评论区聊聊你的学习动机,看看有没有和你一样的小伙伴!
一、爬虫的四大基本步骤:从请求到存储的完整链路
一个成熟的爬虫程序,通常遵循一个循环往复的“规则链”。理解这个流程,是编写高效爬虫的第一步。整个过程可以分解为以下四个核心环节:
- 发送HTTP请求:这是爬虫与服务器对话的开始。通过模拟浏览器行为,向目标网站发送GET或POST请求,从而获取网页的原始HTML内容。
- 解析并提取数据:拿到原始内容后,我们需要从中“淘金”。利用解析库(如lxml、BeautifulSoup)从复杂的HTML/XML结构中,精准定位并提取出你需要的具体信息,比如标题、价格、评论等。
- 数据清洗:原始数据往往“脏乱差”,包含多余的空格、特殊字符或格式不一致。这一步使用正则表达式或字符串处理函数,将数据规范化,确保其质量。
- 数据存储:最后,将清洗干净的数据持久化保存到本地文件(如CSV、JSON)或数据库中,供后续分析使用。
需要注意的是,这四个步骤并非一成不变。在实际项目中,可能会在存储后再次发起新的请求(例如分页抓取),形成一个动态的循环。掌握这种灵活的思路,比死记硬背步骤更重要。
✍️ 动手思考:如果让你设计一个爬虫,先从这四步中挑一个你觉得最难的,会是什么?可以在纸上画一个简单的流程图,加深理解。
二、遵守规则:读懂网站的“说明书”——robots.txt
在开始任何爬取工作之前,尊重网站的规则是爬虫开发者的基本素养。几乎所有正规网站都会在根目录下提供一个名为 的文件。你可以把它想象成网站给爬虫的“说明书”,明确告知哪些资源可以抓取,哪些被禁止访问。robots.txt
- 如何查看:在浏览器地址栏直接输入
,例如网站域名/robots.txt,就能看到该文件的内容。https://example.com/robots.txt - 文件结构:它通常由多个逻辑块组成,每个块包含若干键值对,常见字段如下:
| 字段 | 含义 |
|---|---|
| User-Agent | 指定爬虫类型,网站通过此请求头识别爬虫身份。 |
| Disallow | 禁止爬虫访问的路径。 |
| Allow | 允许爬虫访问的路径。 |
| Sitemap | 网站地图地址,帮助爬虫更高效地发现页面(网站也可借此提升曝光)。 |
| Crawl-delay | 请求间隔时间(秒),防止高并发请求给服务器造成压力。 |
核心原则:遵守 不仅是技术规范,更是合法合规抓取的前提。忽视它可能会导致你的IP被封锁,甚至面临法律风险。robots.txt
立刻试试:现在打开浏览器,找一个你常逛的网站,在地址栏后面加上 ,看看它有什么有趣的内容。把最让你惊讶的一条规则分享到评论区,比如“什么?这个网站居然不允许百度爬?”
三、核心工具链:从请求到存储的利器
在Python生态中,每个步骤都有对应的成熟工具。下面我们逐一介绍,并穿插一些实战建议。
请求发送:requests 库
发送HTTP请求是爬虫的第一步。Python的第三方库 是目前最流行、最易用的选择。安装只需一行命令:requests
pip install requests
它支持GET、POST等多种请求方式,并能方便地处理Cookies、Headers等参数,是爬虫开发者的“瑞士军刀”。
小挑战:安装好 requests 后,试着用 3 行代码请求 并打印状态码。你成功收到 200 了吗?可以把你的代码截图晒在评论区,看看谁的写法最简洁。
网页结构速览:HTML、CSS与JavaScript
一个完整的网页由三部分组成:
- HTML(骨架):定义页面的结构和内容,如标题、段落、表格。
- CSS(长相):控制页面的样式和布局,让页面更美观。
- JavaScript(行为):赋予页面动态交互能力,如点击、滑动、异步加载。
对于爬虫来说,我们只需重点关注HTML标签结构,找到目标数据所在的标签即可。JavaScript生成的动态内容则需要使用更高级的工具(如Selenium)来处理。
互动联想:如果把网页比作一个人,HTML是骨架,CSS是衣服发型,JS是动作习惯。那么你觉得,爬虫最“关心”这个人的哪一部分?可以在评论区说出你的比喻,想象力越丰富越好!
数据解析与提取:lxml + XPath
解析网页推荐使用 库。它基于C语言实现,解析速度极快,并且支持XPath语法进行节点定位。XPath是一种专门用于在XML/HTML文档中导航和查询的语言,非常强大。lxml
XPath常用语法速查
| 语法 | 说明 |
|---|---|
| 从根节点选取直接子元素(如 )。 | |
| 从任意位置选取节点(如 选取所有 标签)。 | |
| 选取当前节点,常与 或 连用。 | |
| 选取第 n 个元素(如 选取第 3 个 标签)。 | |
| 选取最后一个元素。 | |
| 选取具有某属性的元素(如 )。 | |
| 选取属性值等于指定值的元素(如 )。 | |
| 和 | 通配符: 匹配任何元素节点, 匹配任何属性。 |
| 获取标签中的文本内容,通常放在 XPath 表达式末尾。 |
课后测验:不看表格,你能说出 这行 XPath 的含义吗?试着把它拆解成一步步,在评论区写下你的理解,我会来批改哦~
数据存储:CSV文件操作
在实际项目中,我们经常将爬取结果保存为CSV格式,方便用Excel打开或进一步处理。这里推荐两种方式:
- 方式一:直接写入文本(不推荐)
with open("01.csv", "w", encoding="utf-8") as f:
f.write("姓名,年龄,性别,爱好\n")
f.write("王林,32,女,'Python'\n")
这种方法虽然简单,但字段中出现逗号、换行或引号时极易出错,格式不可控。
- 方式二:使用csv模块的DictWriter(推荐)
import csv
with open("resources/02.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["姓名", "年龄", "性别", "爱好"])
writer.writeheader()
writer.writerow({"姓名": "王林", "年龄": 29, "性别": "男", "爱好": "Python,Java"})
⚠️ 注意点:
- 必须添加
参数,否则写入的行之间会出现多余空行。newline="" - 使用
可通过键值对明确字段内容,数据更规范、更灵活。DictWriter
动手实践:把上面推荐的代码复制到你的编辑器里运行一下,然后试着再添加两个人物的信息。运行后打开生成的 CSV 文件,看看效果。遇到空行问题了吗?如果遇到了,你知道怎么解决了吗?欢迎私信或评论交流你的输出结果。
数据清洗:正则表达式
抓取到的原始数据往往包含多余的字符、空白或格式不一致,因此需要进行清洗。正则表达式正是处理这类文本匹配与替换的强大工具。简单理解:它就是一套用于文本处理的“高级查找与匹配公式”。
Python中的re模块
:从字符串开头匹配,返回Match对象。match(pattern, string):从任意位置搜索第一个匹配项,返回Match对象。search(pattern, string):搜索所有匹配项,返回Match对象列表。findall(pattern, string)
示例:提取手机号
import re
s = "联系方式:13812345678,备用:15900001111"
phones = re.findall(r"1[3-9]\d{9}", s)
print(phones) # ['13812345678', '15900001111']
注意正则表达式前的 表示原始字符串,防止反斜杠 r 被当作转义字符。\d
正则表达式核心语法
| 元素 | 说明 |
|---|---|
| 普通字符 | 字母、数字、汉字等直接匹配自身。 |
| 匹配除换行符外的任意单个字符。 | |
| 匹配数字 0-9。 | |
| 匹配非数字。 | |
| 匹配单词字符(字母、数字、下划线)。 | |
| 匹配非单词字符(如标点符号)。 | |
| 匹配空白字符(空格、制表符等)。 | |
| 匹配非空白字符。 | |
| 前面的字符出现 0 次或多次。 | |
| 前面的字符至少出现 1 次。 | |
| 前面的字符出现 0 次或 1 次。 | |
| 固定出现 m 次。 | |
| 至少出现 m 次。 | |
| 出现 m 到 n 次。 | |
| 逻辑“或”,匹配左右任一表达式。 | |
| 分组,将括号内的内容视为一个整体。 | |
| 匹配字符串开头。 | |
| 匹配字符串结尾。 |
正则实战挑战:给你一个字符串 ,请写出能提取出邮箱地址的正则表达式。想好之后在评论区亮出你的答案,我会选几个有代表性的来点评。提示:邮箱格式大致是 。
四、总结:爬虫开发流程与工具全景图
回顾整个爬虫开发流程,每一步都有对应的Python工具支撑:
| 步骤 | 操作 | 推荐工具 |
|---|---|---|
| 前期检查 | 查看 robots 协议 | 浏览器直接访问 |
| 1. 请求 | 发送 HTTP 请求 | 库 |
| 2. 解析提取 | 解析 HTML 并定位 | + XPath 语法 |
| 3. 数据清洗 | 文本筛选与规范化 | 模块(正则表达式) |
| 4. 存储 | 保存结构化数据 | 模块 |
理论知识是深入实践的基石。除了Python,许多开发者也会使用C++、TypeScript、Java、Go等语言编写高性能爬虫,但Python凭借其简洁的语法和丰富的生态,依然是初学者的最佳选择。希望这篇文章能帮你在正式编写爬虫前建立起清晰的知识脉络。
[AFFILIATE_SLOT_1]结课互动小调查:学完本文后,你觉得最难掌握的是哪一部分?
A. 正则表达式
B. XPath 语法
C. robots 协议理解
D. Python 文件操作
在评论区打出你的选项,看看大家是不是都“栽”在同一个地方。我也许会针对呼声最高的部分出一篇详细讲解哦!
课后请务必多动手实践,用代码巩固所学。遇到问题时再回头复盘理论,真正做到学以致用。如果你觉得这篇文章有帮助,欢迎点赞、收藏、关注支持!你的每一个反馈都是我持续输出的动力~
[AFFILIATE_SLOT_2]/robots.txthttps://httpbin.org/get//html////a<a>.///[n]//p[3]<p>[last()][@attr]//p[@color][@attr='value']//p[@color='red']*@**@*text()//div[@class='content']/p[2]/text().\d\D\w\W\s\S*+?{m}{m,}{m,n}或()^$"我的邮箱是test@example.com,有问题请发邮件"名称@域名.后缀requestslxmlrecsv
浙公网安备 33010602011771号