Scrapy 是一个为了爬取网站数据、提取结构性数据而编写的应用框架,可以应用在包括数据挖掘、信息处理或存储历史数据等一系列的程序中。
1. Scrapy 架构
Scrapy 的整体架构由 Scrapy 引擎(ScrapyEngine)、调度器(Scheduler)、下载器(Downloader)、爬虫(Spiders)和数据项管道(itemPipeline)5 个组件组成。图 1 展示了各个组件的交互关系和系统中的数据流。
图 1 Scrapy 架构
Scrapy 的架构由以下 5 个组件和两个中间件构成。
组件/中间件 | 作用 |
---|---|
Scrapy 引擎(ScrapyEngine) | 是整个系统的核心,负责控制数据在整个组件中的流动,并在相应动作发生时触发事件。 |
调度器(Scheduler) | 管理 Request 请求的出入栈,去除重复的请求。调度器从 Scrapy 引擎接收请求,并将请求加入请求队列,以便在后期需要的时候提交给 Scrapy 引擎。 |
下载器(Downloader) | 负责获取页面数据,并通过 Scrapy 引擎提供给网络爬虫。 |
网络爬虫(Spiders) | 是 Scrapy 用户编写的用于分析结果并提取数据项或跟进的 URL 的类。每个爬虫负责处理一个(或者一组)特定网站。 |
数据项管道(ItemPipeline) | 负责处理被爬虫提取出来的数据项。典型的处理有清理、验证及持久化。 |
下载器中间件 | 是引擎和下载器之间的特定接口,处理下载器传递给引擎的结果。其通过插入自定义代码来扩展下载器的功能。 |
爬虫中间件 | 是引擎和爬虫之间的特定接口,用来处理爬虫的输入,并输出数据项。其通过插入自定义代码来扩展爬虫的功能。 |
Scrapy 中的数据流由 Scrapy 引擎控制,整体的流程如下。
1)Scrapy 引擎打开一个网站,找到处理该网站的爬虫,并询问爬虫第一次要爬取的 URL。
2)Scrapy 引擎从爬虫中获取第一次要爬取的 URL,并以 Request 方式发送给调度器。
3)Scrapy 引擎向调度器请求下一个要爬取的 URL。
4)调度器返回下一个要爬取的 URL 给 Scrapy 引擎,Scrapy 引擎将 URL 通过下载器中间件转发给下载器。