【小白学爬虫连载(9)】--scrapy构架设计分析
欢迎大家关注公众号【哈希大数据】
前面已经分享了利用scrapy框架抓取百度新闻数据。不过相信大家应该还不清楚scrapy究竟是如何运行的,它是如何实现数据的下载、如何简洁的实现爬取下一页,带着这些疑问咱们来看看scrapy的架构是如何设计的。
1.Scrapy架构图
image从图中可以看出scrapy主要由5个模块、2个中间件组成。下面详细介绍各模块和中间件的主要作用。
-
引擎(Scrapy Engine): 用来处理整个系统的数据流处理, 当某个时间发生时触发事务(框架核心)
-
调度器(Scheduler): 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
-
下载器(Downloader): 用于下载网页内容, 并将网页内容返回给Spider(Scrapy下载器是建立在twisted这个高效的异步模型上的)
-
爬虫(Spiders): 爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
-
项目管道(Pipeline): 负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。典型的用途:清洗、验证、持久化。
-
下载器中间件(Downloader Middlewares): 位于Scrapy引擎和下载器之间的框架,处理传送到下载器的requests和传送到引擎的response(若需要在Requests到达Downloader之前或者是responses到达spiders之前做一些预处理,可以使用该中间件来完成)。
-
爬虫中间件(Spider Middlewares): 介于Scrapy引擎和爬虫之间的框架,主要工作是处理抓取器的响应输入和请求输出 (在spiders产生的Items到达Item Pipeline之前做一些预处理或response到达spider之前做一些处理)。
以上模块中需要我们修改的主要有三个,分别是Spiders解析网页,Pipeline对爬取数据进行预处理,Downloader Middlewares进行User-Agent和cookies等的设置。
2.Scrapy中的运行流程
-
引擎打开一个网站(open a domain),找到处理该网站的spider,并向该spider请求第一个要爬取的url(s);
-
引擎从spider中获取到第一个要爬取的url并在调度器(scheduler)以requests调度;
-
引擎向调度器请求下一个要爬取的url;
-
调度器返回下一个要爬取的url给引擎,引擎将url通过下载器中间件(请求requests方向)转发给下载器(Downloader);
-
一旦页面下载完毕,下载器生成一个该页面的responses,并将其通过下载器中间件(返回responses方向)发送给引擎;
-
引擎从下载器中接收到responses并通过spider中间件(输入方向)发送给spider处理;
-
spider处理responses并返回爬取到的Item及(跟进的)新的resquests给引擎;
-
引擎将(spider返回的)爬取到的Item给Item Pipeline,将(spider返回的)requests给调度器;
-
(从第二部)重复直到(调度器中没有更多的request)引擎关闭该网站;
3.Scrapy中的数据流分析
图中绿线是数据流向,主要为请求request、响应response、解析完成的数据items。首先从初始 URL 开始,Scheduler 会将其交给 Downloader 进行下载,下载之后会交给 Spider 进行分析,Spider 分析出来的数据有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回 Scheduler ;另一种是需要保存的数据,它们则被送到 Item Pipeline 那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。
小结
本次主要分享scrapy的架构设计,了解其设计核心有助于设计基于scrapy框架的、符合自身需求的爬虫,scrapy主要有五个模块、两个中间件需要我们修改的主要只有三个,分别是Spiders解析网页,Pipeline对爬取数据进行预处理,Downloader Middlewares进行User-Agent和cookies等的设置。使用框架可以较为容易的解决cookie、retry、频率限制、多线程等问题。