简介:这份PDF面向零基础到进阶的Python爬虫学习者,系统梳理了从入门到实战的完整知识框架,帮助初学者解决“学什么、怎么学、在哪里学”的困惑。内容围绕爬虫三部曲展开:获取数据环节讲解urllib、requests、aiohttp等请求库及异步抓取思路;解析数据环节对比pyquery、BeautifulSoup、XPath与正则表达式的适用场景;数据存储环节则涉及TXT、JSON、CSV及MySQL、MongoDB等方案,并补充代理IP、请求头伪装、Selenium动态渲染与分布式爬取等进阶技巧,同时提醒Robots协议与合规边界。资源为单个PDF文件,压缩包约2.1MB,轻量便携,适合随时查阅。目前已有174人学习,可作为搭建爬虫知识体系、按图索骥查漏补缺的参考框架。
1. 爬虫学习框架总览:从请求到入库的完整知识地图
很多人学 Python 爬虫,第一反应是去找一个“万能模板”,复制粘贴跑通一个网站就觉得自己会了。但真到换一个目标站点,面对异步加载、登录校验、数据量暴涨的时候,立刻翻车。问题不在于代码写得少,而在于脑子里没有一张完整的知识地图。这份 2023 年最新 Python 爬虫的完整学习框架,核心价值就是先把地图给你画出来:爬虫的本质是模拟浏览器发送请求、下载网页代码、提取有用数据、存入数据库或文件,对应“获取数据 → 解析数据 → 存储数据”三部曲。围绕这条主线,知识被拆成轻量级爬虫、工程化爬虫两大阶段,每个阶段再细分请求库、解析库、数据库、框架选型。适合已经能写几行 Python、想系统梳理一遍爬虫体系的人,也适合复习时快速定位自己卡在哪一层。先看清全貌,再逐个模块啃,比盲目追新库高效得多。
2. 轻量级爬虫三件套:请求、解析、存储的复习重点
轻量级爬虫是绝大多数人入门的第一站,也是面试和实际小项目里最常考的部分。它不要求你理解 HTTP、TCP、IP 的底层网络传输结构,因为 Python 提供了功能齐全的类库帮你完成请求。但“会用”和“知道为什么这么用”之间,差的就是这一章要梳理的内容。下面按请求库、解析库、数据库三个模块拆开,每个模块都给出选型逻辑和容易忽略的细节。
2.1 请求库选型:urllib、requests、aiohttp 怎么选
请求是爬虫的第一步,模拟浏览器向服务器发送请求。Python 自带的标准库 urllib 系列是内置的 HTTP 请求库,如果只进行基本的网页抓取,它足够用。但实际写起来,urllib 处理编码、异常、会话维持都比较繁琐。Requests 的定位就是“为人类设计的 HTTP 库”,相对 urllib 简洁很多,并且自带 JSON 解析器,是日常同步爬虫的首选。
当目标站点是异步加载的动态网站时,有两种思路:一是用浏览器抓包分析真实请求,直接请求数据接口;二是用 Selenium 模拟浏览器操作,支持页面交互和动态加载的爬取。如果追求速度,aiohttp 是值得掌握的异步请求库,借助 async/await 关键字,写法比传统回调清晰很多。有数据统计,正常情况下请求同一个页面 100 次,同步方式最少要 30 秒左右,而异步请求只需要 3 秒左右,差距非常明显。
选型建议很明确:先从 urllib 开始理解请求的本质,再过渡到 requests 作为主力,遇到动态页面先抓包、抓不到再上 Selenium,最后在需要高并发采集时引入 aiohttp。不要一上来就 all in 异步,调试成本会让你怀疑人生。
import requests # 设置请求头,模拟真实浏览器,降低被识别为爬虫的概率 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", "Accept-Language": "zh-CN,zh;q=0.9", } # 带超时和状态码检查的请求,避免程序卡死 resp = requests.get("https://example.com/list", headers=headers, timeout=10) resp.raise_for_status() # 非 2xx 状态码直接抛异常 resp.encoding = resp.apparent_encoding # 自动推断编码,防止中文乱码 html = resp.text这段代码里,headers里的 User-Agent 是最基础的伪装,timeout防止请求无限等待,raise_for_status让错误尽早暴露,apparent_encoding解决中文站点常见的乱码问题。参数看着简单,但每一条都是踩坑之后加上的。
2.2 解析库对比:BeautifulSoup、PyQuery、XPath、正则的适用场景
爬回来的网页代码里,只有一部分数据是有用的,解析就是定位并提取这部分数据。从 Web 上采集回来的数据类型主要有 HTML、JavaScript、JSON、XML 等格式。解析库的选择,本质上是在“定位精度”和“编写成本”之间做权衡。
BeautifulSoup 借助网页的结构和属性来解析,能自动转换编码,支持 Python 标准库的 HTML 解析器,也支持第三方解析器,容错性好,适合结构不太规整的页面。PyQuery 使用 lxml 解析器,提供和 jQuery 类似的语法,支持 CSS 选择器,前端基础扎实的人用起来非常顺手。XPath 最初用于搜寻 XML 文档,同样适用于 HTML,提供了超过 100 个内建函数,用于字符串、数值、日期时间比较、节点处理、序列处理、逻辑值等,定位能力强,表达式写熟了效率极高。正则表达式 re 通常用来检索、替换符合某个模式的文本,速度比较快,但写正则比较麻烦,可读性差,适合提取格式非常固定的零散信息。
梳理下来会发现,没有哪个解析库能通吃。常见组合是:结构清晰的页面用 PyQuery 或 XPath,结构混乱的用 BeautifulSoup 兜底,JSON 接口直接用 requests 自带的解析器,只有极少数格式固定的场景才动用正则。
| 解析库 | 核心优势 | 适合场景 | 主要短板 |
|---|---|---|---|
| BeautifulSoup | 容错好、自动编码转换 | 结构不规整的 HTML | 速度相对慢 |
| PyQuery | jQuery 语法、CSS 选择器 | 前端基础好的人 | 依赖 lxml |
| XPath | 函数丰富、定位精准 | 复杂层级、XML/HTML | 表达式学习曲线陡 |
| re 正则 | 速度快 | 格式固定的零散文本 | 可读性差、易写错 |
2.3 数据存储:TXT、CSV、MySQL、MongoDB、Redis 的分层使用
数据量小的时候,用文档形式存储完全够用,支持 TXT、JSON、CSV 等格式。但数据量一大,文档方式就行不通了,掌握一种数据库是必须的。MySQL 作为关系型数据库的代表,体系成熟,适合存储结构化数据,但在海量数据处理时效率会显著变慢。MongoDB 相对 MySQL,可以方便地存储非结构化数据,比如各种评论文本、图片链接,配合 PyMongo 能在 Python 中更方便地操作。Redis 是内存数据库,支持 hash、set、list 等丰富的数据结构,数据全部存在内存,访问速度快,一般应用于分布式爬虫的数据存储和去重队列。
这里最容易忽略的是:数据库知识在爬虫里用到的其实非常简单,主要是数据如何入库、如何提取,不需要一开始就系统学完数据库课程,在需要的时候再学就行。选型逻辑可以记成一句话:小数据走文件,结构化走 MySQL,非结构化走 MongoDB,高并发去重和缓存走 Redis。
3. 工程化爬虫框架:Scrapy、PySpider、Nutch 的定位差异
当你掌握了前面的技术,就能实现轻量级爬虫,一般量级的数据和代码基本没有问题。但在面对复杂情况时,比如需要分布式抓取、任务调度、断点续爬、大规模去重,手写脚本的表现就力不从心了。这时候,工程化爬虫框架的价值就体现出来。这一章梳理三个最有代表性的框架,重点不是比较谁更好,而是搞清楚它们各自解决什么问题,以及学习顺序怎么安排。
3.1 Scrapy:最灵活的定制化爬取框架
Scrapy 是 GitHub 上 star 数很高的爬虫框架,功能非常强大。它不仅能便捷地构建 request,还有强大的 selector 方便解析 response,最让人惊喜的是超高的性能,让你可以将爬虫工程化、模块化。学会 Scrapy,你可以自己去搭建一些爬虫框架,基本就具备爬虫工程师的思维了。
Scrapy 的核心概念包括 Spider(定义抓取逻辑)、Item(定义数据结构)、Pipeline(定义存储逻辑)、Middleware(定义请求和响应的处理逻辑)。这套抽象一开始会觉得绕,但一旦理解,就能把“抓取—解析—存储”拆成独立模块,各自维护。它适合需要长期运行、规则复杂、数据量大的采集任务。
import scrapy class BookSpider(scrapy.Spider): name = "book" start_urls = ["https://example.com/books"] def parse(self, response): # 用 CSS 选择器定位列表项,逐个提取字段 for item in response.css("div.book-item"): yield { "title": item.css("h3::text").get(), "price": item.css("span.price::text").get(), "link": item.css("a::attr(href)").get(), } # 翻页:找到下一页链接并继续请求 next_page = response.css("a.next::attr(href)").get() if next_page: yield response.follow(next_page, self.parse)这段 Spider 展示了 Scrapy 的基本写法:start_urls定义入口,parse方法处理响应,yield返回数据或新的请求。response.follow会自动处理相对链接,比手动拼接 URL 省事。实际项目中,字段提取规则、翻页逻辑、去重策略都会比这个复杂,但骨架就是这些。
3.2 PySpider:产品级 WebUI 的调度框架
PySpider 是人气很高的国产框架,满足了绝大多数 Python 爬虫的需求,主打定向抓取和结构化解析。它最大的特点是能在浏览器界面上进行脚本编写、功能调度和爬取结果的实时查看,后端使用常用数据库进行结果存储。功能强大到更像一个产品而不是一个框架。
对于不习惯纯代码调试、希望可视化看到任务队列和抓取结果的人来说,PySpider 的上手体验很好。它适合快速搭建中小型采集任务,尤其是需要频繁调整规则、实时观察抓取状态的场景。但它的定制化能力不如 Scrapy 灵活,超大规模分布式场景下也不是首选。
3.3 Nutch:为搜索引擎而生的分布式方案
Nutch 是 Apache 顶级项目,提供了运行自己的搜索引擎所需的全部工具。它支持分布式抓取,并有 Hadoop 支持,可以进行多机分布抓取、存储和索引。很吸引人的一点是它提供了一种插件框架,使得对各种网页内容的解析、各种数据的采集、查询、集群、过滤等功能能够方便地进行扩展。
Nutch 的定位非常明确:不是通用爬虫框架,而是搜索引擎解决方案的一部分。如果你要做的是全网级或站内搜索索引,Nutch 是绕不开的选项;如果只是采集电商价格、新闻列表,用 Nutch 就是杀鸡用牛刀。
三个框架的学习顺序,建议先从最接近爬虫本质的 Scrapy 学起,理解工程化爬虫的模块划分和调度逻辑;再去接触人性化的 PySpider,感受可视化调度的便利;最后如果有搜索引擎相关的需求,再研究 Nutch。这个顺序能让你每一步都建立在已有认知上,而不是被各种新概念同时轰炸。
4. 易漏点与易错点:请求头、编码、反爬、存储的常见翻车现场
这一章专门整理复习时最容易漏掉、实际写代码时最容易翻车的地方。每一条都按“易漏点 → 为什么漏 → 怎么补”的结构写,方便对照检查。
易漏点一:请求头只写 User-Agent,忽略 Referer 和 Cookie。为什么漏?因为入门教程通常只教加 User-Agent,跑通一个简单站点后就以为万事大吉。怎么补?遇到 403 或返回空数据时,用浏览器开发者工具抓完整请求头,把 Referer、Accept、Accept-Language 甚至 Cookie 都带上,再逐步删减,找到最小必要集合。
易漏点二:编码处理想当然,中文乱码后才回头找原因。为什么漏?因为 requests 的resp.text在部分站点会自动猜错编码,而初学者往往直接.text就用。怎么补?统一用resp.apparent_encoding或手动指定resp.encoding = 'utf-8',存储前打印前 200 个字符确认没有乱码。
易漏点三:忽略 Robots 协议和访问频率,导致 IP 被限制。为什么漏?因为本地测试请求量小,感觉不到压力,上线后并发一开就被目标站点拦截。怎么补?先看目标站点根目录下的 robots.txt,了解哪些页面允许抓取;请求之间加随机延时,必要时使用代理 IP 池轮换,但代理本身也要做可用性检测。
易漏点四:数据存储不做去重,重复入库浪费空间。为什么漏?因为小数据量时重复不明显,数据量上来后才发现大量重复记录。怎么补?入库前用唯一键(如 URL 的哈希值)做去重,Redis 的 set 结构非常适合这个场景,或者用数据库的唯一索引兜底。
易漏点五:异常处理只写 try-except 不写重试,网络抖动就丢数据。为什么漏?因为本地网络稳定,体会不到超时和连接重置的频繁程度。怎么补?对请求封装重试逻辑,设置最大重试次数和退避策略,记录失败 URL 以便后续补爬。
5. 复习清单与查漏补缺:从请求到入库的自检流程
复习爬虫知识,最怕的是“感觉都会,一写就废”。下面这份自检清单,按爬虫执行流程排列,每一项都对应一个可以动手验证的动作。你可以拿一个自己熟悉的站点,从第一步走到最后一步,卡在哪一步就回去补对应章节。
| 检查项 | 自检动作 | 对应模块 |
|---|---|---|
| 请求能否成功 | 用 requests 带完整请求头访问目标页,打印状态码和前 200 字符 | 请求库 |
| 编码是否正确 | 检查中文是否乱码,确认 encoding 设置 | 请求库 |
| 解析是否精准 | 用 PyQuery 或 XPath 提取目标字段,打印条数和样例 | 解析库 |
| 翻页是否完整 | 检查是否漏掉最后一页或重复抓取第一页 | 解析库 |
| 存储是否去重 | 连续跑两次,检查数据库记录数是否翻倍 | 存储 |
| 异常是否兜底 | 断网或改错 URL,观察程序是否优雅报错并记录 | 异常处理 |
| 频率是否合规 | 检查请求间隔,确认没有对目标站点造成压力 | 反爬与合规 |
这份清单的价值在于,它把“复习”变成了“可执行的验证”。每通过一项,就说明对应的知识模块真正掌握了;哪一项卡住,就回到对应章节重新梳理。比起反复看书,动手跑一遍流程的记忆效果好得多。
从那以后我每次接手一个新的采集任务,都强制走一遍这个清单,先确认请求通、编码对、解析准,再考虑并发和分布式。很多翻车现场,其实在第一步就能避免。希望这份梳理能帮到你,让你在爬虫学习路上少走一些弯路。
本文还有配套的精品资源,点击获取