摘要:关于scrapy架构的简单介绍。

1 整体架构

下面的这张图是我对官方文档中 Scrapy 框架的描述的翻译加转述,基本能让大家明白Scrapy整一个流程是怎样的。图中的粉色圆形序号表示流程顺序,粉色箭头表示数据流向,灰色带序号文字表示对对应的粉色序号的解释。详细参看下图:

Architecture overview-Scrapy框架概览1.png

2 部件解释

Scrapy Engine(爬虫引擎)

爬虫引擎负责所有组件之间的数据交换和事件触发。

Scheduler(任务规划器)

接收从引擎发送的请求(requests)并将请求添加至队列(enqueues),当引擎发起请求时反馈(feed)请求。

Downloader(下载器)

下载器负责抓取网页并将其反馈给引擎,引擎反过来将其提供给爬虫。

Spiders(爬虫)

爬虫是有用户编写的用于解析响应和提取结构化数据,并进一步发出请求。

Item Pipeline(数据管道)

用于进一步处理由爬虫解析的数据,一般任务有:清理数据、验证数据、数据持久化。

Downloader middlewares(下载中件)

下在中件位于爬虫引擎和下载器之间,在下面情况下你需要使用下载中件:

  • 需要处理请求,在引擎将请求发送给下载器前( Scrapy 将请求发送给目标网站前);
  • 需要处理响应,在响应发送给引擎前;
  • 需要将一个新的请求发送给引擎,而不是发送下载器接收的响应;
  • 不用请求网络数据,直接将数据发给引擎;
  • 静默丢弃一些请求。

Spider middlewares(爬虫中件)

爬虫中间位于爬虫和引擎之间,用于处理爬虫的输入 (response) 和输出 (items、 requests),在下面情况下你需要使用爬虫中件:

  • 改变、添加、移除 requests 或 items 时;
  • 发起初始请求(start_requests);
  • 处理爬虫异常;
  • 根据响应内容发起 errback (错误反馈) 而不是 callback (回调处理)。

3 其他内容

  • Scrapy 是使用 Twisted 编写的,Twisted 是Python中一个事件驱动型网络框架,因此它是使用非阻塞式(异步)的代码实现并发。
  • Scrapy 使用了 LIFO (后进先出)的队列方法存储请求,因此用 Scrapy 写的爬虫是深度优先的(DFO order),如果需要广度优先(BFO)可以按如下设置:

    DEPTH_PRIORITY = 1
    SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
    SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'

关于深度优先和广度优先可以参看下图理解:
1、深度优先

Architecture overview-Scrapy框架概览2.png

2、广度优先

Architecture overview-Scrapy框架概览3.png

本节参考文档:
Architecture overview
Frequently Asked Questions

参考

摘抄自:Architecture overview - Scrapy 框架概览 - 知乎,感谢作者。

文章目录