Scrapy源码分析(一)架构概览

Scrapy源码分析(一)架构概览,第1张

概述使用 Scrapy 开发一个爬虫非常简单,这里使用 Scrapy 官网上的例子来说明如何编写一个简单爬虫: 简单来讲,编写和运行一个爬虫只需以下几步: 使用 scrapy startproj

使用 Scrapy 开发一个爬虫非常简单,这里使用 Scrapy 官网上的例子来说明如何编写一个简单爬虫:

简单来讲,编写和运行一个爬虫只需以下几步:

使用 scrapy startproject 命令创建一个爬虫模板,或自己按模板编写爬虫代码定义一个爬虫类,并继承 scrapy.SpIDer,然后重写 parse 方法parse 方法里编写网页解析逻辑,以及抓取路径使用 scrapy runspIDer <spIDer_file.py> 运行这个爬虫

可见,使用 Scrapy 编写简单的几行代码,就能采集到一个网站页面的数据,非常方便。

但是在这背后到底发生了什么?Scrapy 到底是如何帮助我们工作的呢?

架构

要想知道 Scrapy 是如何工作的,首先我们来看一下 Scrapy 的架构图,从宏观角度来了解一下它是如何运行的:

核心模块

从架构图可以看到,Scrapy 主要包含以下五大模块:

Scrapy Engine:核心引擎,负责控制和调度各个组件,保证数据流转;Scheduler:负责管理任务、过滤任务、输出任务的调度器,存储、去重任务都在此控制;Downloader:下载器,负责在网络上下载数据,输入待下载的 URL,输出下载结果;SpIDers:我们自己编写的爬虫逻辑,定义抓取意图;Item Pipeline:负责输出结构化数据,可自定义格式和输出的位置;

如果你观察地比较仔细的话,可以看到还有两个模块:

Downloader mIDdlewares:介于引擎和下载器之间,可以在网页在下载前、后进行逻辑处理;SpIDer mIDdlewares:介于引擎和爬虫之间,在向爬虫输入下载结果前,和爬虫输出请求 / 数据后进行逻辑处理;

了解了这些核心模块,我们再来看使用 Scrapy 时,它内部的采集流程是如何流转的,也就是说各个模块是如何交互协作,来完成整个抓取任务的。

运行流程

按照上面架构图标识出的序号,我们可以看到,Scrapy 运行时的数据流转大概是这样的:

引擎从自定义爬虫中获取初始化请求(也叫种子 URL);引擎把该请求放入调度器中,同时调度器向引擎获取待下载的请求;调度器把待下载的请求发给引擎;引擎发送请求给下载器,中间会经过一系列下载器中间件;这个请求通过下载器下载完成后,生成一个响应对象,返回给引擎,这中间会再次经过一系列下载器中间件;引擎接收到下载器返回的响应后,发送给爬虫,中间会经过一系列爬虫中间件,最后执行爬虫自定义的解析逻辑;爬虫执行完自定义的解析逻辑后,生成结果对象或新的请求对象给引擎,再次经过一系列爬虫中间件;引擎把爬虫返回的结果对象交由结果处理器处理,把新的请求通过引擎再交给调度器;重复执行1-8,直到调度器中没有新的请求处理,任务结束;核心模块的协作

可见,Scrapy 的架构图还是比较清晰的,各个模块之间互相协作,完成抓取任务。

我在读完它的源码后,整理出了一个更详细的核心模块交互图,其中展示了更多模块的相关细节,你可以参考一下:

 

 

核心类图

另外,在读源码的过程中,我还整理了这些核心模块的类图,这对于你学习源码会有很大的帮助。

 

 

对于这个核心类图简单解释一下:

没有样式的黑色文字是类的核心属性;标有黄色样式的高亮文字是类的核心方法;

你在读源码的过程中,可以针对这些核心属性和方法重点关注。

结合官方架构图以及我总结的核心模块交互图、核心类图,我们可以看到,Scrapy 涉及到的组件主要包括以下这些。

五大核心类: Scrapy EngineSchedulerDownloaderSpIDers、Item Pipeline;四个中间件管理器类:DownloaderMIDdlewareManagerSpIDerMIDdlewareManagerItemPipelineMIDdlewareManagerExtensionManager;其他辅助类:RequestResponseSelector

我们先对 Scrapy 整个架构有一个初步认识,在接下来的文章里,我会针对上述的这些类和方法进行更加详细的源码讲解。

 

总结

以上是内存溢出为你收集整理的Scrapy源码分析(一)架构概览全部内容,希望文章能够帮你解决Scrapy源码分析(一)架构概览所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1189199.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存