用 Python 写你的第一个爬虫:小白也能轻松搞定数据抓取(超详细包含最新所有Python爬虫库的教程)
本文是一篇面向爬虫爱好者的超详细 Python 爬虫入门教程,涵盖了从基础到进阶的所有关键技术点:使用 Requests 与 BeautifulSoup 实现静态网页数据抓取,运用 lxml、XPath、CSS 选择器等高效解析技术,深入 Scrapy 框架搭建分布式爬虫项目,掌握 Selenium 和 Playwright 浏览器自动化处理 JS 动态渲染,探索 aiohttp、HTTPX 异步爬虫提升并发性能,并结合代理 IP 池、User-Agent 伪装、验证码识别等反爬虫策略应对电商数据抓取、新闻数据爬取、社交媒体采集等场景。快速上手大规模爬虫项目,打造可扩展、高效稳定的数据抓取解决方案。
- 前言
- 爬虫基础知识
- 2.1 什么是爬虫?
- 2.2 爬虫的应用场景
- 2.3 爬虫基本流程
- 2.4 需要注意的法律与伦理问题
- 开发环境准备
- 3.1 安装 Python(建议 3.8 及以上)
- 3.2 创建虚拟环境并激活
- 3.3 常用开发工具推荐
- 基础篇:用 Requests + BeautifulSoup 做简单爬虫
- 4.1 安装必要库
- 4.2 认识 HTTP 请求与响应
- 4.3 编写第一个爬虫:抓取网页标题
- 4.4 解析HTML:BeautifulSoup 用法详解
- 4.5 文件存储:将抓到的数据保存为 CSV/JSON
- 4.6 常见反爬措施及应对策略
- 进阶篇:更强大的解析工具
- 5.1 lxml (XPath)
- 5.2 parsel(Scrapy 内置的解析器)
- 5.3 PyQuery(类似 jQuery 的解析方式)
- 5.4 正则表达式在爬虫中的应用
- 框架篇:Scrapy 全面入门
- 6.1 Scrapy 简介
- 6.2 安装与项目结构
- 6.3 编写第一个 Scrapy 爬虫 Spider
- 6.4 Item、Pipeline、Settings 详解
- 6.5 Scrapy Shell 在线调试
- 6.6 分布式与多线程:Scrapy 爬虫并发配置
- 6.7 Scrapy 中间件与扩展(Downloader Middleware、Downloader Handler)
- 动态内容爬取:Selenium 与 Playwright
- 7.1 为什么需要浏览器自动化?
- 7.2 Selenium 基础用法
- 7.3 Playwright for Python(更快更轻量)
- 7.4 无头浏览器(headless)模式及性能优化
- 7.5 结合 Selenium/Playwright 与 BeautifulSoup 解析
- 异步爬虫:aiohttp + asyncio 与 HTTPX
- 8.1 同步 vs 异步:性能原理简述
- 8.2 aiohttp 入门示例
- 8.3 使用 asyncio 协程池提高并发
- 8.4 HTTPX:Requests 的异步升级版
- 8.5 异步下使用解析库示例(aiohttp + lxml)
- 数据存储与去重
- 9.1 本地文件:CSV、JSON、SQLite
- 9.2 MySQL/PostgreSQL 等关系型数据库
- 9.3 MongoDB 等 NoSQL 存储
- 9.4 Redis 用作去重与短期缓存
- 9.5 去重策略:指纹、哈希、Bloom Filter
- 分布式爬虫:Scrapy-Redis 与分布式调度
- 10.1 为什么要做分布式?
- 10.2 Scrapy-Redis 简介与安装
- 10.3 分布式去重队列与调度
- 10.4 多机协作示例
- 常见反爬与反制策略
- 11.1 频率限制与请求头伪装
- 11.2 登录验证与 Cookie 管理
- 11.3 验证码识别(简单介绍)
- 11.4 代理 IP 池的搭建与旋转
- 完整案例:爬取某新闻网站并存入数据库
- 12.1 需求分析
- 12.2 使用 Scrapy + MySQL 完整实现
- 12.3 代码详解与常见 Q&A
- Python 爬虫相关的常用第三方库一览(截至 2024 年底)
- 13.1 基础请求与解析
- 13.2 浏览器自动化
- 13.3 异步爬取
- 13.4 登录模拟与验证码处理
- 13.5 反爬与代理
- 13.6 分布式调度
- 13.7 其它有用工具
- 附录
- 14.1 常见报错及解决方案
- 14.2 常用 HTTP 状态码速查
- 14.3 学习资源与进阶指南
- 总结
在信息爆炸的时代,互联网早已成为最丰富、最便捷的数据来源。从电商平台的商品价格到新闻网站的最新动态,从社交媒体的热门话题到招聘网站的职位信息,只要你想得到,几乎都能通过爬虫从网页里“扒”出来。对于初学者而言,爬虫其实并不神秘:只要理解 HTTP、HTML 及基本的 Python 编程,就能快速入门。本教程面向“零基础”“小白”用户,讲解从最基本的抓取到进阶框架、异步、分布式再到反爬策略,逐步深入,手把手指导你搭建完整爬虫,并总结截至 2025 年最常用的 Python 爬虫库。
本教程特色
- 循序渐进:从最简单的 开始,到 Scrapy、Selenium、Playwright、异步爬虫,一步步掌握。
- 超详细示例:每个工具/框架都配有完整可运行的示例代码,你可以直接复制、运行、观察。
- 最新库盘点:整理并介绍了截至 2025 年所见的常用爬虫生态中的主流库,助你选对最合适的工具。
- 反爬与实战:从简单的 User-Agent 伪装到代理 IP 池、验证码识别、分布式部署,多角度应对目标网站的各种反爬机制。
温馨提示:本教程示例均基于 Python 3.8+,强烈建议使用 Python 3.10 或更高版本来获得更好的兼容性与性能。爬取网站数据时,请务必遵守目标网站的 以及相关法律法规,避免给他人服务器带来不必要的压力。本文所列“最新库”信息截止到 2024 年底,2025 年及以后的新库、新特性请结合官方文档或社区资源进行补充。
2.1 什么是爬虫?
- 定义:爬虫(Web Crawler,也称 Spider、Bot)是一种通过程序自动访问网页,并将其中有用信息提取下来存储的数据采集工具。
- 原理简述:爬虫首先向指定 URL 发起 HTTP 请求,获取网页源代码(HTML、JSON、图片等),再通过解析技术(如 XPath、CSS 选择器、正则)从源码中提取所需数据,最后将数据保存到文件或数据库中。
2.2 爬虫的应用场景
- 数据分析:电商价格监控、商品评论分析、竞品调研。
- 舆情监控:社交媒体热搜、论坛帖子、新闻资讯统计。
- 搜索引擎:Google、Bing、Baidu 等搜索引擎通过爬虫定期抓取网页进行索引。
- 招聘信息采集:自动抓取招聘网站的岗位、薪资、公司信息。
- 学术研究:论文元数据爬取、知识图谱构建等。
- 内容聚合:如各类聚合网站把分散站点的文章集中到一个平台。
2.3 爬虫基本流程
- 确定目标 URL:明确要爬取的网页地址,可能是静态页面,也可能是动态加载。
- 发送 HTTP 请求:通常使用 、、 等库向目标 URL 发送 GET、POST 请求,并获取响应。
- 解析响应内容:响应可能是 HTML、JSON、XML、图片等,常用解析工具有 BeautifulSoup、lxml、parsel、PyQuery、正则表达式等。
- 提取数据:根据标签名、属性、XPath、CSS Selector 等定位到目标内容,抽取文本或属性。
- 数据处理与存储:将提取到的内容清洗、去重,然后保存到 CSV、JSON、SQLite、MySQL、MongoDB 等介质中。
- 翻页/递归:如果需要多个页面的数据,就要分析翻页逻辑(URL 模板、Ajax 请求),循环执行请求与解析。
- 异常处理与反爬对策:设置代理、随机 User-Agent、限速、IP 轮换,处理 HTTP 403、验证码、重定向等。
2.4 需要注意的法律与伦理问题
- 请求前务必查看目标站点的 (通常在 ),遵从抓取规则;
- 有些站点禁止大量抓取、禁止商业用途,在爬取前请阅读并遵守版权与隐私政策;
- 不要对目标站点造成过大压力,建议设置合适的延时()、并发数限制;
- 遵守爬虫与爬取数据后续处理相关法律法规,切勿用于违法用途。
3.1 安装 Python(建议 3.8 及以上)
- Windows:
- 前往 https://www.python.org/downloads 下载对应 3.8+ 的安装包,默认选中“Add Python 3.x to PATH”,点击“Install Now”。
- macOS:
Linux (Ubuntu/Debian 系):
执行:
即可确认。
安装完成后,执行:
确认无误后即可。
建议使用 Homebrew 安装:
安装完成后,打开命令行(Win + R → 输入 → 回车),执行:
确认 Python 与 pip 已成功安装。
提示:如果你机器上同时安装了 Python 2.x 和 Python 3.x,可能需要使用 、 来替代 、。
3.2 创建虚拟环境并激活
为了避免全局依赖冲突,强烈建议为每个爬虫项目创建独立的虚拟环境:
激活后,终端左侧会显示 ,此时安装的所有包都只作用于该环境。
3.3 常用开发工具推荐
- IDE/编辑器:
- PyCharm Community / Professional:功能强大,集成测试、版本管理。
- VS Code:轻量且插件丰富,适合快速编辑。
- Sublime Text:轻量,启动快;对于小脚本很方便。
- 调试工具:
- VS Code/PyCharm 自带的调试器,可以单步、断点调试。
- 对于命令行脚本,也可以使用 。
- 版本管理:
- Git + VS Code / PyCharm Git 插件,实现代码托管与协作。
- 将项目托管到 GitHub/Gitee 等。
- 其他辅助:
- Postman / Insomnia:用于模拟 HTTP 请求、查看响应头;
- Charles / Fiddler:抓包工具,可调试 AJAX 请求、Cookie、headers 等。
4.1 安装必要库
在虚拟环境中,执行:
- :Python 最常用的 HTTP 库,用于发送 GET/POST 请求。
- :常见的 HTML/XML 解析库,入门简单。
- :速度快、功能强大的解析器,供 BeautifulSoup 使用。
4.2 认识 HTTP 请求与响应
- HTTP 请求:由方法(GET、POST、PUT 等)、URL、请求头(Headers)、请求体(Body)等组成。
- HTTP 响应:包含状态码(200、404、500 等)、响应头、响应体(通常为 HTML、JSON、图片、文件等)。
- Requests 常用参数:
- :请求地址。
- :URL 参数(字典/字符串)。
- :自定义请求头(例如 User-Agent、Referer、Cookie)。
- / :POST 请求时发送的表单或 JSON 数据。
- :超时时间(秒),防止请求一直卡住。
- :配置代理(详见后文)。
示例:
4.3 编写第一个爬虫:抓取网页标题
下面以爬取「https://www.example.com」网页标题为例,演示最简单的流程:
运行结果示例:
4.4 解析HTML:BeautifulSoup 用法详解
库使用简单,常用方法如下:
- 查找单个节点
- 示例:
- 可以使用 精确定位。
- 查找所有节点
- 示例: 返回所有带 的链接。
- CSS 选择器
- ,返回列表。
- 支持 id()、class()、属性()等。
- 获取属性或文本
- :拿属性值;
- :同上,但如果属性不存在会抛异常;
- :获取节点文本,并去除前后空白;
- :获取节点及子节点合并文本。
- 常用属性
- / /
- / / / 等快捷属性。
示例:提取列表页所有文章链接
创建对象
4.5 文件存储:将抓到的数据保存为 CSV/JSON
- 能兼容 Excel 打开时不出现乱码。
SQLite 存储(适合小规模项目)
JSON 格式
CSV 格式
4.6 常见反爬措施及应对策略
- 默认 的 User-Agent 大多被识别为“爬虫”,容易被屏蔽。
- 应用:在请求头中随机选用常见浏览器 User-Agent。
- IP 限制
- 如果同一 IP 在短时间内发起大量请求,服务器可能会封禁或返回 403。
- 应对:使用代理池(详见第 11 节),定期更换 IP。
- 某些网站登录后才能访问完整内容,需要先模拟登录获取 Cookie,再在后续请求中带上。
- 用 管理会话,同一 Session 自动保存并发送 Cookie。
- 验证码
- 简易验证码有时可通过 OCR 自动识别,但复杂图片验证码需要专门打码平台或人工识别。
- 在入门阶段,尽量选择不需要验证码或抢先获取 API。
- AJAX / 动态渲染
- 如果页面数据是通过 JavaScript 动态加载,直接用 只能获取静态 HTML。
- 应用:可分析 AJAX 请求接口(Network 面板),直接请求接口返回的 JSON;或使用浏览器自动化工具(Selenium/Playwright)模拟浏览器渲染。
Cookie 验证
User-Agent 检测
虽然 BeautifulSoup 足以应付大部分新手场景,但当你遇到结构复杂、嵌套多、或需要批量高效提取时,下面这些工具会更适合。
5.1 lxml (XPath)
- 特点:基于 C 语言实现,解析速度快,支持标准的 XPath 查询。
- 常见 XPath 语法:
- :查找所有符合条件的 tag。
- :获取文本节点;
- :获取属性值;
- :查找 div 下所有后代中的 a;
- :查找第一个 li;
- :class 中包含 foo 的元素。
示例:
安装:
5.2 parsel(Scrapy 内置的解析器)
- 特点:Scrapy 自带的一套基于 Css/XPath 的快速解析工具,接口与 lxml 类似,但更贴合 Scrapy 的数据提取习惯。
- 对象在 Scrapy 中经常用到,直接拿过来在项目外部也能用。
示例:
安装:
5.3 PyQuery(类似 jQuery 的解析方式)
- 特点:接口风格类似 jQuery,习惯了前端的同学会很快上手。
- PyQuery 内部使用 lxml 作为解析器,速度不逊于直接调用 lxml。
示例:
安装:
5.4 正则表达式在爬虫中的应用
- 正则并不是万能的 HTML 解析方案,但在提取简单规则(如邮箱、电话号码、特定模式字符串)时非常方便。
- 在爬虫中,可先用 BeautifulSoup/lxml 找到相应的大块内容,再对内容字符串用正则提取。
示例:
如果你想快速搭建一个可维护、可扩展的爬虫项目,Scrapy 是 Python 爬虫生态中最成熟、最流行的爬虫框架之一。
6.1 Scrapy 简介
- Scrapy:一个专门为大规模网络爬取与信息提取设计的开源框架,具有高性能、多并发、支持分布式、内置各种中间件与管道。
- 适用场景:
- 大规模爬取同类型大量网页。
- 对页面进行复杂数据清洗、去重、存储。
- 需要高度定制化中间件或扩展时。
6.2 安装与项目结构
项目目录结构(示例):
创建 Scrapy 项目:
安装 Scrapy:
6.3 编写第一个 Scrapy 爬虫 Spider
假设我们要爬去 网站上所有名言及作者:
运行爬虫:
运行后,会在项目根目录生成 ,其中包含抓取到的所有名言数据。
配置数据存储 Pipeline(可选存储到 JSON/CSV/数据库),如在 :
并在 中启用:
定义 Item 模型 ():
在 下新建 :
6.4 Item、Pipeline、Settings 详解
- Items ():定义要提取的数据结构与字段,相当于“数据模型”。
- Spiders ():每个 spider 文件对应一个任务,可接收 、、 回调等。可自定义不同的回调函数来解析不同页面。
- Pipelines ():处理从 Spider 返回的 Item,常见操作包括数据清洗(去重、格式化)、存储(写入 JSON/CSV、入库)、下载附件等。
- Settings ():全局配置文件,包含并发数()、下载延时()、中间件配置、管道配置、User-Agent 等。
常见 Settings 配置示例:
6.5 Scrapy Shell 在线调试
- Shell 模式下,你可以快速试错、验证提取逻辑,比写完整 Spider 再跑要高效很多。
进入 shell 后,你可以执行:
Scrapy 提供了 命令,可以快速测试 XPath、CSS 选择器。
6.6 分布式与多线程:Scrapy 爬虫并发配置
- 并发请求数:在 中设置 (默认 16);
- 单域名并发:(默认 8);
- 单 IP 并发:;
- 下载延时:(默认 0);
- 自动限速:,配合 、 等。
- 并行请求:Scrapy 内部使用 Twisted 异步网络库实现高并发,单机即可轻松处理成千上万请求。
6.7 Scrapy 中间件与扩展(Downloader Middleware、Downloader Handler)
- Downloader Middleware:位于 Scrapy 引擎与下载器之间,可控制请求/响应,常用于:
- 动态设置 User-Agent、Proxy;
- 拦截并修改请求/响应头;
- 处理重试(Retry)、重定向(Redirect)等。
- Downloader Handler:更底层的接口,一般不常用,Scrapy 已提供 、 等。
示例:随机 User-Agent Middleware
并在 中配置:
当目标网页内容依赖 JavaScript 动态渲染时,单纯用 或 Scrapy 获取到的 HTML 往往不包含最终可视化的数据。此时可以使用“浏览器自动化”工具,让其像真实浏览器一样加载页面,再提取渲染后的内容。
7.1 为什么需要浏览器自动化?
- 许多现代网站(尤其是单页应用 SPA)使用 React、Vue、Angular 等框架,通过 AJAX 或 API 获取数据并在前端渲染,直接请求 URL 只能拿到空白或框架代码。
- 浏览器自动化可以:
- 启动一个真实或无头浏览器实例;
- 访问页面,等待 JavaScript 执行完成;
- 拿到渲染完毕的 DOM,然后再用解析库提取。
7.2 Selenium 基础用法
- 下载 WebDriver(以 Chrome 为例):
- 前往 ChromeDriver 下载页面 ,下载与本地 Chrome 版本相匹配的 。
- 将 放置在系统 PATH 下,或在代码中指定路径。
- 显式等待与隐式等待
- 隐式等待:,在寻找元素时最长等待 10 秒;
显式等待:使用 与 ,例如:
示例:抓取动态网页内容
安装:
7.3 Playwright for Python(更快更轻量)
- Playwright:由微软维护、继承自 Puppeteer 的跨浏览器自动化库,支持 Chromium、Firefox、WebKit,无需单独下载 WebDriver。
- 优点:启动速度快、API 简洁、并发控制更灵活。
同步版 Playwright
如果你不想使用异步,也可以借助 :
示例:抓取动态内容
安装:
7.4 无头浏览器(headless)模式及性能优化
- 无头模式:在 Linux 服务器等环境下,没有图形界面,需要 参数;在 macOS/Windows 上也可加速启动。
- 资源限制:可以通过设置启动参数降低资源占用,如:
- Chrome:、、;
- Playwright:。
- 避免过度渲染:如果只想拿纯数据,尽量通过分析接口(XHR 请求)直接调用后台 API,不必启动完整浏览器。
7.5 结合 Selenium/Playwright 与 BeautifulSoup 解析
一般流程:
- 用 Selenium/Playwright 拿到渲染后的 或 ;
- 用 BeautifulSoup/lxml 对 HTML 进行二次解析与提取。
示例综合:
当面对上千个、甚至上万个链接需要同时抓取时,同步阻塞式的 就显得效率低下。Python 原生的 协程、 库或 异步模式可以极大提升并发性能。
8.1 同步 vs 异步:性能原理简述
- 同步(Blocking):一次请求完毕后才开始下一次请求。
- 异步(Non-Blocking):发出请求后可立即切换到其他任务,网络 I/O 等待期间不阻塞线程。
- 对于 I/O 密集型爬虫,异步能显著提高吞吐量。
8.2 aiohttp 入门示例
- 说明:
- 将并发连接限制在 50,避免短时间打开过多连接被服务器封。
- 创建并发 Task,交由事件循环调度。
- 等待所有任务完成。
使用 asyncio + aiohttp 并发抓取
安装:
8.3 使用 asyncio 协程池提高并发
如果需要对抓取和解析做更精细的并行控制,可使用 或第三方协程池库(如 aiomultiprocess、aiojobs)来控制并发数。
8.4 HTTPX:Requests 的异步升级版
- HTTPX:由 Encode 团队开发,与 API 十分相似,同时支持同步与异步模式。
- 与 兼容的 API(如 、、、 等),极大降低了上手门槛。
示例:
安装:
8.5 异步下使用解析库示例(aiohttp + lxml)
爬虫的最终目的是获取并存储有价值的数据,因此选择合适的存储方式与去重机制至关重要。
9.1 本地文件:CSV、JSON、SQLite
- CSV/JSON:
- 适合一次性、容量较小、对数据结构要求不高的场景。
- 直接用 Python 标准库即可读写。
- SQLite:
- 轻量级嵌入式数据库,无需额外部署数据库服务器。
- 适合中小规模项目,比如几万条数据。
示例:
9.2 MySQL/PostgreSQL 等关系型数据库
- 优点:适合大规模数据存储,支持 SQL 强大的查询功能,能更好地做数据分析、统计。
示例(MySQL):
安装:先安装对应数据库服务器(MySQL、MariaDB、PostgreSQL),然后在 Python 中安装驱动:
9.3 MongoDB 等 NoSQL 存储
- 优点:文档型数据库,对半结构化 JSON 数据支持友好,可灵活存储字段不同的条目。
- 安装与驱动:
- 本地安装 MongoDB 或使用云服务;
- Python 驱动:。
示例:
9.4 Redis 用作去重与短期缓存
- Redis:键值存储,支持超高并发访问,非常适合做指纹去重、短期缓存、队列等。
- 布隆过滤器(Bloom Filter):当 URL 数量达到数百万级别时,普通 Python 集合会占用大量内存,布隆过滤器用空间换时间,以极少内存判断某个 URL 是否已爬取(有一定误判率)。可以使用 或直接在 Redis 中搭建 Bloom Filter(如 RedisBloom 模块)。
- Redis Set:小规模去重可直接用 Redis set 存储已爬 URL。
常见策略:
9.5 去重策略:指纹、哈希、Bloom Filter
- 指纹:通常对 URL 做标准化(去掉排序不同但内容相同的参数、多余的斜杠),然后对标准化后 URL 做哈希(如 MD5、SHA1),存到 Set 中对比。
- Bloom Filter:一种以极少内存做到高效去重的概率算法,对大规模 URL 判断去重十分划算,但有极小误判率(可能会把未访问的 URL 误判为已访问)。
- 库推荐:
- :纯 Python 布隆过滤器库;
- 或 Redis 官方 模块(需 Redis 安装相应扩展);
- Scrapy 内置 ,默认用的是文件或 Redis 存储的指纹去重。
当单机爬虫难以满足高并发、大规模抓取时,就需要分布式爬虫,将任务分布到多台机器协同完成。Scrapy-Redis 是 Scrapy 官方推荐的分布式方案之一。
10.1 为什么要做分布式?
- 海量链接:需要抓取数百万、上亿条 URL 时,单机进程/线程或协程都难以在可接受时间内完成。
- 速度要求:需要更短时间内获取全量数据,提高爬取速度。
- 容错与扩展:分布式部署可实现节点增减、机器故障自愈等。
10.2 Scrapy-Redis 简介与安装
- Scrapy-Redis:基于 Redis 存储队列与去重指纹,实现分布式调度、分布式去重、数据共享的 Scrapy 扩展。
安装:
10.3 分布式去重队列与调度
- 在 Scrapy 项目中集成 Scrapy-Redis
-
- 继承 或 ,将原本的 替换为从 Redis 队列中获取种子 URL。
- 将种子 URL 推入 Redis
- 启动分布式爬虫
- 所有实例会从同一个 Redis 队列中获取 URL,去重也基于 Redis,互不重复。
在多台服务器或多终端分别启动爬虫:
在本地或远程机器上,用 将种子 URL 推入列表:
修改 Spider
修改 :
10.4 多机协作示例
- 部署多台服务器(A、B、C),都能访问同一个 Redis 实例。
- 在 A、B、C 机上,各自拉取完整的 Scrapy 项目代码,并配置好 中的 。
- 三台机器会自动协调,每台都从 Redis 队列中取 URL,去重也由 Redis 统一维护。
- 数据收集:
- 爬取的 Item 通过 自动存入 Redis 列表(key: );
- 之后可通过独立脚本或 pipeline 再将数据持久化到数据库/文件。
在 A、B、C 分别运行:
在 A 机或任意一处,将种子 URL 塞入 Redis:
在 A 机上运行:
11.1 频率限制与请求头伪装
- 访问频率控制(限速)
- Scrapy 中使用 、 等。
- User-Agent 伪装
- 通过随机 User-Agent 模拟不同浏览器。
- 代码示例见第 4.6 节。
- Referer、Accept-Language、Accept-Encoding 等 Headers
模拟真实浏览器请求时携带的完整 Header:
对目标站设置随机或固定延时:
11.2 登录验证与 Cookie 管理
- Session 对象:在 中,使用 方便统一管理 Cookie。
- 模拟登录流程:
- 获取登录页 请求,拿到隐藏的 token(如 CSRF);
- 结合用户名/密码、token, 到登录接口;
- 成功后, 内部有了 Cookie,后续使用同一 session 发起请求即可保持登录状态。
带 Cookie 抓取:
11.3 验证码识别(简单介绍)
- 常见验证码类型:
- 验证码图片(扭曲字母/数字);
- 滑动验证码(拼图/拖动)
- 点选验证码(选特定图像)
- 行为生物特征(人机验证)
- 常用方案:
- 打码平台/人工打码:当验证码过于复杂时,可调用第三方打码平台 API(如超级鹰、打码兔等),将图片发送给平台,由平台返回识别结果;或者简单地由人工识别。
- 绕过/获取接口:很多网站的登录并不真用验证码进行提交,而是在前端校验。可以抓包找到真实的登录接口,模拟接口请求,绕过验证码。
简单 OCR 识别:用 对简单数字/字母验证码进行识别,但对扭曲度高或干扰线多的验证码成功率不高。
11.4 代理 IP 池的搭建与旋转
- 为什么要用代理
- 同一 IP 短时间内请求次数过多容易被封禁;使用代理 IP 池可以不断切换 IP,降低单 IP 请求频率。
- 获取代理
- 免费代理:网上公开的免费代理 IP,但一般不稳定、易失效。可用爬虫定期从免费代理网站(如 xicidaili、kuaidaili)抓取可用代理,并验证可用性。
- 付费代理:阿布云、快代理等付费代理服务,更稳定、更安全。
- 在 Scrapy 中配置代理
- 这样 Scrapy 在每次请求时会随机从 中取一个代理。
自定义 :
简单在 中设置:
搭建本地简单代理池示例(以免费代理为例,仅供学习)
本节以“爬取某模拟新闻网站(示例:)的头条新闻,并将标题、摘要、链接存入 MySQL 数据库”为例,完整演示 Scrapy + MySQL 的使用。
12.1 需求分析
- 目标数据:新闻标题、摘要(简介)、文章链接、发布时间。
- 爬取范围:首页头条新闻(假设分页结构或动态加载,可视情况调整)。
- 存储方式:MySQL 数据库,表名 ,字段:。
- 反爬策略:设置随机 User-Agent、下载延时、简单 IP 伪装。
12.2 使用 Scrapy + MySQL 完整实现
- 运行爬虫
- 确保 MySQL 已创建数据库 ,用户名、密码正确;
运行期间,日志会显示抓取进度,成功后可在 表中查看抓取结果:
在项目根目录执行:
编写 Spider ()
MySQL Pipeline ()
自定义中间件:随机 User-Agent ()
设置 MySQL 配置 ()
定义 Item ()
安装依赖
创建 Scrapy 项目
12.3 代码详解与常见 Q&A
- Q:为什么要在 方法中发起新的 Request 到详情页?
- 因为首页展示的数据有限,有些字段(如精确发布时间、作者、正文)要到详情页才能拿到。 参数可将部分已抓取的字段传递到下一个回调。
- Q:如何将字符串 转为 ?
- 使用 Python 标准库 ,传入对应格式;若格式不一致,可先 或正则提取。
- Q:如果目标网站有登录或验证码怎么办?
- 可在 方法里模拟登录(使用 + 或 Selenium),登录后获取 Cookie,再将 Cookie 带入 Scrapy 调用。
- Q:如何处理分页数量巨大(上千页)?
- 可分析 URL 规律(如 ),使用 。注意限速与 IP 轮换,防止被封。
- Q:为什么要随机 User-Agent?
- 防止被网站识别为爬虫。
- Q:如何在 Scrapy 中使用代理?
- 参考第 11.4 节,在 中配置自己的 ,或直接使用 Scrapy-Proxy-Pool 等库。
以下对各类常用库进行分类归纳,并附简要说明与典型使用场景。
13.1 基础请求与解析
requests 同步 HTTP 请求,API 简洁,生态成熟 绝大多数简单爬虫,表单提交、Cookie 支持
httpx 支持同步 & 异步的 HTTP 客户端,与 requests 兼容 需要异步或更多高级功能时的首选
aiohttp 原生 asyncio 协程模式的 HTTP 客户端 高并发抓取、异步爬虫
urllib3 低级 HTTP 客户端,requests 底层依赖 需要更底层的控制、定制化管理连接池时
BeautifulSoup (bs4) HTML/XML 解析,入门简单、灵活 初学者快速上手、解析复杂 HTML
lxml 基于 libxml2/libxslt 的高性能解析器,支持 XPath 需要高性能、大量数据解析时,结合 XPath 提取
parsel Scrapy 自带的解析器,支持 CSS/XPath Scrapy 项目中快捷解析、项目外独立解析
PyQuery 类似 jQuery 的解析 API,基于 lxml 前端同学更习惯 CSS 选择器,快速上手
re (正则) Python 内置正则模块,对结构简单的文本进行模式匹配 提取邮箱、电话号码、URL、数字等简单模式
html5lib 兼容性最强的解析器(支持容错 HTML),速度相对较慢 需要解析结构严重不规范的 HTML 时
13.2 浏览器自动化
Selenium 最成熟的浏览器自动化框架,支持 Chrome、Firefox、Edge 等 需模拟用户操作 (点击、滑动、表单提交)、抓取 JS 渲染内容
Playwright 微软出品,继承 Puppeteer,API 简洁,支持多浏览器 高性能 headless 模式,异步/同步模式都支持
Pyppeteer Puppeteer 的 Python 移植版 Node.js 用户转 Python 时快速上手
undetected-chromedriver 对抗反爬,屏蔽 Selenium 特征 需要更强的逃避检测能力,尤其面对高级反爬
Splash 由 Scrapy-Splash 提供,基于 QtWebKit 的渲染服务 Scrapy 与动态渲染结合,用于批量异步渲染
13.3 异步爬取
asyncio Python 标准库,提供事件循环与异步协程基础 编写异步爬虫主框架
aiohttp 基于 asyncio 的 HTTP 客户端 高并发抓取、配合 BeautifulSoup/lxml 解析
httpx 支持同步 & 异步,与 requests 接口兼容 希望无缝从 requests 切换到异步模式
trio 另一个异步框架,示意图结构友好,但生态相对较小 深度研究异步原理或希望新尝试
curio 纯 Python 异步库,强调简洁 研究异步 I/O 原理的场景
aiofiles 异步文件操作 异步模式下同时要读写大量文件
13.4 登录模拟与验证码处理
requests +
Session 模拟登录,自动管理 Cookie 大部分需要登录后抓取的场景
selenium 浏览器自动化登录,执行 JS,处理复杂登录逻辑 登录时有 JS 加密或动态 token
Playwright 与 Selenium 类似,但速度更快,接口更现代 更轻量级的浏览器自动化
pytesseract OCR 识别图片文字 简单验证码识别
captcha_solver 第三方打码平台 SDK 需要调用付费打码平台处理验证码
twoCaptcha 付费打码平台 Python 客户端 需要可靠的验证码打码服务
13.5 反爬与代理
fake-useragent 随机生成 User-Agent 防止被识别为爬虫
scrapy-fake-useragent Scrapy 专用随机 UA 插件 Scrapy 项目中一键启用随机 UA
requests-random-user-agent 为 requests 提供随机 UA 支持 轻松控制 requests 请求头
scrapy-rotating-proxies Scrapy 专用代理轮换中间件,用于自动切换代理池(付费或免费) Scrapy 大规模抓取时避免单 IP 封禁
scrapy-proxies 开源 Scrapy 代理中间件,可使用免费代理池 入门级 Scrapy 项目快速使用代理
proxylist2 Python 包,从多个免费代理网站抓取代理 IP 自动化维护免费代理列表
requests-redis-rotating-proxies 结合 Redis 存储代理列表,实现高可用代理池 中大型项目需集中管理代理 IP
scrapy-user-agents Scrapy 插件,内置常见 UA 列表 简化 Scrapy 中的 UA 列表管理
cfscrape 用于绕过 Cloudflare 简易 JS 保护 某些站点需要绕过 Cloudflare 5 秒验证页面
13.6 分布式调度
scrapy-redis Scrapy 分布式爬虫扩展,统一 Redis 作为队列与去重存储 分布式 Scrapy 项目
scrapy-cluster 基于 Kafka + Redis 的 Scrapy 分布式爬虫系统 企业级分布式环境,需与消息队列协同
Frigate 高性能分布式爬虫,结合 Redis + MongoDB 大规模分布式爬取且需要与 NoSQL 存储集成
PhantomJS + Splash 无头浏览器渲染服务,可与 Scrapy 搭配形成分布式渲染环境 需要大规模渲染 JS 页面后再抓取
13.7 其它有用工具
robotparser Python 内置 ,解析 robots.txt 爬虫前先检查 robots.txt
tldextract 提取域名、子域名、后缀 需要对 URL 做域名归类或统计时
url-normalize URL 规范化,去除重复查询参数 爬虫过程对 URL 进行标准化去重
logging Python 标准库,用于日志输出 任何爬虫项目都应进行日志记录
fake_useragent 动态获取并生成随机 UA 避免 UA 列表过时
termcolor 终端字符着色,调试输出更直观 爬虫日志、调试时需要彩色提示
psutil 系统资源监控,可查看 CPU、内存占用 长时间运行爬虫时监控资源使用情况
schedule 定时任务库,可定时运行脚本 需要定时执行爬虫任务
watchdog 文件系统监控,当文件/目录变化时触发回调 实时监控爬取结果文件、触发后续任务
说明:因篇幅所限,上表仅列出截至 2024 年底常用或较为稳定的 Python 爬虫库,后续可能有新库或旧库迭代,请根据实际需求及时查阅官方文档或社区资源。
14.1 常见报错及解决方案
-
- 原因:未安装该包或安装在全局而非虚拟环境中。
- 解决:确认当前虚拟环境是否已激活,并执行 。
-
- 原因:本机 CA 证书有问题,无法验证 HTTPS。
- 解决:
- 升级 :;
- 临时忽略:(不推荐用于生产)。
- 在 XPath 返回多值时
- 原因:使用 ,但 XPath 返回值数量与预期不符。
- 解决:检查 XPath 语法,或者使用 将两个列表匹配。
-
- 原因: 未放在系统 PATH,或路径不正确。
- 解决:下载与 Chrome 版本一致的 ,并将其路径添加到环境变量,或者在代码中指定 。
-
- 原因:MySQL 用户名/密码、权限或 MySQL 服务未启动。
- 解决:检查用户名、密码是否正确,MySQL 服务是否运行,数据库名称是否存在。
- 或
- 原因:网络慢或被目标站点限制。
- 解决:加大 参数,降低并发数,适当设置代理。
- UnicodeEncodeError/UnicodeDecodeError
- 原因:处理的文本编码与 Python 默认编码不一致。
- 解决:明确指定 ,或者在读写文件时加 。
cursor 教程
14.2 常用 HTTP 状态码速查
14.3 学习资源与进阶指南
- 官方文档
- Requests:https://docs.python-requests.org/
- BeautifulSoup:http://beautifulsoup.readthedocs.io/
- Scrapy:https://docs.scrapy.org/
- Selenium:https://www.selenium.dev/documentation/
- Playwright:https://playwright.dev/python/
- aiohttp:https://docs.aiohttp.org/
- httpx:https://www.python-httpx.org/
- 推荐书籍
- 《Python网络数据采集(第二版)》—— Ryan Mitchell
- 《深入Python爬虫框架 Scrapy》—— 黄今
- 《Python3网络爬虫开发实战》—— 石刚
- 课程与视频
- B 站、YouTube 上均有优质 Python 爬虫视频教程(可搜索“Python 爬虫 零基础”、“Scrapy 教程”等)。
- Coursera/慕课网上的 Python 爬虫进阶课程。
- 社区资源
- Stack Overflow:https://stackoverflow.com/(遇到报错可搜索)
- SegmentFault:https://segmentfault.com/(国内开发者社区)
- GitHub Trending:搜索开源爬虫项目,学习最佳实践。
本教程从最基础的 ,到 Scrapy 框架、浏览器自动化、异步爬虫、分布式爬虫,系统梳理了 Python 爬虫的常见技术与实践要点,并盘点了截至 2024 年底的主流库与工具。对于初学者而言,掌握以下几个关键点即可快速上手:
- 理解 HTTP 基础:会构造 GET/POST 请求、分析响应;
- 掌握 HTML 解析:熟悉 BeautifulSoup、lxml(XPath/CSS Selector);
- 尝试 Scrapy:学会搭建 Scrapy 项目、编写 Spider、Pipeline、Settings,并用 Scrapy Shell 调试;
- 应对动态页面:熟练使用 Selenium 或 Playwright 抓取 JS 渲染内容,并结合常规解析方法提取数据;
- 探索异步爬虫:理解协程原理,用 aiohttp、httpx 提升并发性能;
- 数据存储与去重:掌握 CSV/JSON/SQLite/MySQL/MongoDB 的使用,并做好 URL 去重(集合、Redis、Bloom Filter);
- 反爬与反制:设置 User-Agent、Referer、下载延时、代理 IP 池等,了解验证码处理思路;
- 分布式爬虫:学习 Scrapy-Redis,将任务分配到多台机器,提高抓取效率。
最后,爬虫技术更新迅速,截止到本教程编写时(2024 年底)的主流库可能会随着技术迭代、站点反爬升级而发生变化。建议你在入门后,积极关注各大 Python 社区、GitHub Trending 以及官方文档,及时跟进新特性、新库、新思路,不断优化自己的爬虫方案。祝你能在数据抓取的道路上越走越远,愉快地玩转 Python 爬虫世界!
创作时间:2025 年 6 月 1 日
发布者:Ai探索者,转载请注明出处:https://javaforall.net/285915.html原文链接:https://javaforall.net
