1.架构
首先从整体上看一下scrapy框架的架构图(来自scrapy官网)
从上图我们可以看出scrapy框架主要是由5个组件构成:
- Engine(引擎):最核心的部位,用来处理整个系统的数据流和事件,是整个框架的核心,负责数据的流转和逻辑的处理,相当于整个系统的CPU
- Scheduler(调度器):用来接收引擎发过来的request请求并将其加入到队列中,也可以将request发送回Engine(引擎)供Downloader使用,主要负责维护requests的调取逻辑,比如先进先出、先进后出、优先级进出等
- Spiders(蜘蛛): 包含多个spider,每个spider里面定义了要爬取站点的爬取逻辑和页面的解析逻辑,主要负责解析响应并生成Item和新的请求,然后发送给Engine处理
- Downloader(下载器):向互联网服务器发送请求,得到响应的过程,得到的响应会发送给Engine进行处理
- Item Pipelines(管道):负责处理Spider从页面中抽取的Item,做一些数据清洗、验证和存储的工作,例如存储数据到数据库当中,对Item的一些字段进行规整等操作。
除了上面的5大部件之外,Scrapy还包括以下几个小部件
- Item: 是一个抽象的数据结构,定义了爬取结果的数据结构,爬取的数据会被赋值成为item对象。每一个Item对象就是一个类,类当中定义了爬取结果的数据字段,可以理解为它用来规定爬取数据的存储格式。
- Downloader Middlewares(下载中间件):位于Engine和Downloader之间的小方块,包含多个Downloader Middleware,每一个Downloader Middleware负责实现Downloader和Engine之间额请求和响应的处理过程
- Spider Middlewares(爬虫中间件): 位于Engine和Spiders之间的方块部分,负责实现Spiders和Engine之间的Item、请求和响应的处理过程
数据流向
根据上面的架构图我们可以得出Scrapy框架的运行数据流向过程:
- 启动爬虫项目时,Engine根据要爬取的站点找到处理该站点的Spider,Spider生成最初需要爬取的页面对应的一个或者多个Request,然后发送给Engine
- Engine从Spider中获取这些Request,然后把他们交给Scheduler等待被调度
- Engine向Scheduler发送处理下一个request请求的申请,Scheduler从任务队列中抽取一个request请求任务交给Engine
- Engine将Scheduler发送过来的request请求交给Downloader进行下载执行,将Requests发送给Downloader的过程中会经过许多定义好的Downloader Middlewares的处理
- Downloader 将Request发送给目标服务器,得到对应的Response,然后返回给Engine,将Response返回Engine的过程中同样会经过很多定义好的Downloader Middlewares的处理
- Engine从Downloader处接收到的Response里面包含了爬取目标站点的内容,Engine会将此Response发送给对应的spider进行处理,将Response发送给spider的过程中会经过定义好的Spider Middlewares的处理
- spider解析Response响应中的内容,这时spider会产生一个或者多个爬取结果Item或者后续要爬取的目标页面对应的一个或者多个Request,然后将这些Item或者Request发送给Engine进行处理,将Item或者Request发送给Engine的过程中也会经由定义好的Spider Middlewares进行处理
- Engine将spider发回的一个或者多个Item转发给定义好的Item Pipeline进行数据的处理或者存储,将spider发回的一个或者多个Request转发给Scheduler等待下一次的调度
重复2步到第8步的过程,直达票Scheduler中没有更多的Request,这时Engine会关闭Spider,整个爬取过程结束。