11.3 Scrapy 架构
11.3.1 Scrapy 架构概览
Scrapy 架构解析
前面已经讲解了 Scrapy 最重要的两个 Spider 类,现在讲解 Scrapy 架构及其组件之间的交互情况。图 11-2 所示为 Scrapy 文档中的架构概览图,这里仅为其添加了几个中文翻译。
图 11-2 Scrapy 架构概览图(转自官方文档)
这个图将 Scrapy 中数据的流动展示得非常清楚。下面介绍各个组件的作用。
1. Scrapy Engine
Scrapy 的核心引擎,负责控制数据在系统所有组件中的流动,并在相应动作发生时触发事件,可以被看作整个框架的总指挥。
2. 调度器
调度器(Scheduler)可以被看作一个优先级队列。它从核心引擎接受 request 并将它们入队,以便之后引擎请求它们时按照优先级提供给引擎。
3. 下载器
下载器(Downloader)负责与网络交互,主要作用是获取页面数据并提供给引擎,而后提供给 spider 做解析,下载器在整个 Scrapy 架构中应该是负担最重的组件,由于其需要与网络交互,直接影响 Scrapy 的爬取效率。
4. Spiders
Spiders 是 Scrapy 用户编写用于分析 response 并提取 item(即获取到的 item)或额外跟进 URL 的类。对用户编写爬虫而言,它是最重要的组件。用户可以在同一个项目中编写多个 spider,每个 spider 负责处理一个特定(或一些)网站。
5. Item Pipeline
Item Pipeline 负责处理被 spider 提取出来的 Item。典型的处理有清理、验证及持久化(如存储到数据库中,详见第 14 章)。
6. 下载器中间件
下载器中间件(Downloader Middlewares)是在核心引擎及下载器之间的特定钩子,负责处理引擎传递给下载器的 request 和下载器传递给引擎的 response。其提供了一个简便的机制,通过插入自定义代码来扩展 Scrapy 功能。第 12 章将通过编写下载器中间件,实现 request 随机变换用户代理和 IP 代理。
7. 爬虫中间件
爬虫中间件(Spider Middlewares)是在核心引擎及 spiders 之间的特定钩子,处理 spider 的输入(response)和输出(items 及 requests)。其提供了一个简便的机制,通过插入自定义代码来扩展 Scrapy 功能。
11.3.2 Scrapy 中的数据流
下面介绍 Scrapy 中数据是如何在各个组件之间流动的。当启动 Scrapy 爬虫时,Scrapy 会产生以下几个动作。
(1)引擎将 start_urls 列表中的 URL 加进调度器(Scheduler)调度。如果重写了 start_request 方法,就将此方法中的 URL 加进调度器。
(2)引擎向调度器请求下一个要爬取的 URL。
(3)调度器给引擎返回下一个要爬取的 URL,引擎将 URL 通过下载中间件[请求(request)方向]转发给下载器(Downloader)。
(4)一旦页面下载完毕,下载器生成一个该页面的 response,并将其通过下载中间件[返回(response)方向]发送给引擎。
(5)引擎从下载器中接收到 response 并通过爬虫中间件(输入方向)发送给 spider 处理。
(6)spider 根据编写的提取逻辑,处理 response 并给引擎返回爬取到的 Item 及(跟进的)新的 request。
(7)引擎将(spider 返回的)爬取到的 Item 给 Item Pipeline,将(spider 返回的)request 给调度器。
(8)从第二步重复直到调度器中没有更多的 request,引擎关闭该网站爬虫。
通过认识 Scrapy 中数据流动的特点,读者能够更深入地理解 Scrapy 框架,以及何时要配置某个组件。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论