Scrapy 架构概览

scrapy的架构和它各组件之间是如何互动的?

组件

Scrapy Engine
引擎负责控制数据流、当特定动作发生时激活协程。
Scheduler
Scheduler从引擎接受请求(requests),然后把请求入队列(enqueue)。
Downloader
Downloader负责抓取网页,并把它们喂给引擎。
Spiders
Spiders是由scrapy使用者编写的定制的类。负责解析responses并从中提取items以及更多urls
Item Pipeline
负责处理被提取出来的items。常见的处理包括清洗,检测有效性以及存储。
Downloader middlewares
这个中间件是处在engine和downloader中间的特定的钩子,负责处理从engine传出去的请求,以及从downloader传进来的响应。
当有以下需求时使用下载中间件: Spider middlewares
spider middlewares是在Engine和Spiders中间的特定的钩子,可以处理spider输入(response)和输出(items 和 requests)
当有以下需求时使用爬虫中间件:

数据流

Scrapy的数据流是由engine控制的,运行方式如下:
  1. engine从spider得到第一批urls,并把他们传给scheduler,scheduler将其作为requests入栈
  2. 引擎跟Scheduler要下一个要爬去的urls
  3. scheduler把下一个要爬的urls返回给engine,engine把他们发送给Downloader,途经Doader Middlerware
  4. 一旦页面下载结束,Downloader生成一个Response(带着这个页面)并且把它发送给engine,途经downloader middlewares
  5. engine接受从downloader发过来的response并且把它发送给spider,途经spider middleware
  6. spider处理response并且把提取出来的items和新的requests发送给engine,途经spider middlewares
  7. engine把items发送给item pipelines,把新的requests发送给scheduler
  8. 返回第一步,继续这个过程,直到没有更多的requests

协程驱动网络

scrapy是用Twisted框架写的。也就是说,它是使用异步非阻塞代码来实现并发的。