您的“关注”和“点赞”,是信任,是认可,是支持,是动力。
如意见相佐,可留言。
本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。
本文首发在IT羊资源网。
《IT羊资源网》,网址:https://www.ityangzy.com
IT羊资源网是IT世界的羊群!
一个致力于科技、信息技术和计算机领域的综合在线平台。
我们的使命是为读者提供最新、全面的科技资讯、技术教程和资源下载,帮助大家在不断变化的IT领域中保持领先。
欢迎每一位志同道合的人士加入羊群!
1 Scrapy 框架概述
Scrapy 是一个适用于 Python 的一个快速、高层次的、开放源代码的屏幕抓取和 web 抓取的应用程序框架,用于抓取 web 站点并从页面中提取结构化的数据,可用于各种有用的应用程序。
Scrapy 常应用在包括数据挖掘、监测、信息处理、存储历史数据(历史档案)或自动化测试等一系列的程序中。通常我们可以很简单的通过 Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。
Scrapy 最初是为屏幕抓取而设计的,但它也可以用来访问 API 或用作通用 Web 搜寻器来提取数据。
Scrapy 吸引人的地方在于它是一个框架,任何人都可以根据需求便捷的进行修改。它也提供了多种类型爬虫的基类,如 BaseSpider、sitemap 爬虫等。
2 Scrapy 框架的特点
2.1 快速而强大
编写规则以提取数据,然后让 Scrapy 完成其余工作。
它管理请求,解析 HTML 网页,收集数据并将其保存为所需的格式,不需要为每个其他步骤使用单独的库。
2.2 容易扩展
通过设计可扩展,无需接触核心即可轻松插入新功能。
可以在 Scrapy 中使用中间件。中间件是一种“插件”,可为 Scrapy 添加其他功能。我们可以将很多开源中间件附加到 Scrapy 以获得额外的功能。
2.3 可移植(跨平台)
用 Python 编写,可以在 Linux,Windows,Mac 和 BSD 上运行。
3 Scrapy 框架的架构概述
概述 Scrapy 体系结构(架构图)及其组件,及其系统内部发生的数据流(由红色箭头显示),还包括对这些组件的简要说明。
Scrapy 体系结构(架构图)
如下图所示(来自官方文档):
对组件说明
- Engine(引擎):Scrapy 引擎负责控制系统所有组件之间的数据流,并在发生某些操作时触发事件。
- Scheduler(调度器):Scrapy 调度器调度程序接收来自引擎的 request(请求),并对它去重,放入到请求队列中;并在引擎请求它们时使它们排队,并根据队列的取出规则,把请求按顺序返回给引擎。
- Downloader(下载器):下载器负责获取网页数据并将其返回给引擎,引擎又将其传给 Spiders(爬虫)。
- Spiders(爬虫):爬虫(Spiders)用来解析 response,提取出 Items 和新的Requests。
- Item Pipeline(项目管道):一旦爬虫将这些项目提取(或刮取),则项目管道负责处理这些项目。典型的任务包括清理,验证和持久性(例如将项目存储在数据库中)。
- Downloader middlewares(下载器中间件):Downloader 中间件是位于引擎和Downloader 之间的特定挂钩,数据流在从引擎传递到 Downloader 时处理请求,以及从 Downloader 传递到 Engine 的响应处理。
如果需要执行以下操作之一,请使用 Downloader 中间件:
(1)在将请求发送到下载程序之前处理请求(即,在 Scrapy 将请求发送到网站之前);
(2)在传递给 Spiders 之前更改收到的响应;
(3)发送新的请求,而不是将收到的响应传递给 Spiders;
(4)将响应传递给 Spiders,而无需获取网页;
(5)默默地丢弃一些请求。 - Spider middlewares(爬虫中间件):爬虫中间件是位于引擎和爬虫之间的特定挂钩,并且能够处理爬虫的输入(响应)和输出(项目和请求)。
如果需要以下操作之一,请使用 Spider 中间件:
(1)Spiders 回调的后处理输出-更改/添加/删除请求或项目;
(2)后处理 start_requests;
(3)处理爬虫异常;
(4)根据响应内容,对某些请求调用 errback 而不是回调。
对数据流说明
首先,Scrapy 会实例化一个 Crawler 对象,在该对象中创建 Spider 对象、Engine 对象,通过 Engine 对象打开 Spider,并生成第一个 request(请求)。
- ①Scrapy Engine(Scrapy 引擎) 从 Spiders(爬虫)获取初始请求。
- ②Scrapy Engine(Scrapy 引擎)把请求给调度器,并询问下一次请求。
- ③Scrapy Scheduler(Scrapy 调度器)对 url 去重,放到队列中等待,并把下一个 request 返回给 Engine。
- ④Scrapy Engine(Scrapy 引擎)把从调度器返回的 reqest 经过下载中间件交给下载器。
- ⑤页面下载完成后, Downloader 会生成一个 Response(响应),并通过 Downloader Middlewares(下载器中间件)将其发送到 Engine。
- ⑥引擎接收来自下载器的响应,并通过爬虫中间件,将其发送到爬虫进行处理。
- ⑦爬虫接收到响应,解析处理响应,解析出 Items 和 新的 Request ,再通过爬虫中间件提交给 Engine。
- ⑧引擎把接收到的 Items 提交给 Item Pipeline,把接收到的 Request 提交给调度器。
- ⑨重复该过程(从步骤1开始),直到不再有 Scheduler 的请求为止 。