爬虫工作量由小到大的思维转变---<第五十章 Scrapy 深入理解Scrapy爬虫引擎(1)--核心功能>

本文主要是介绍爬虫工作量由小到大的思维转变---<第五十章 Scrapy 深入理解Scrapy爬虫引擎(1)--核心功能>,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

        Scrapy的引擎是该框架的中心角色,负责协调整个爬虫流程的执行。引擎充当了整个框架的核心,并提供了一套强大灵活的机制来管理请求的调度、页面的下载、数据的提取和处理等关键任务。以下是关于Scrapy引擎的详细论述。

  1.         首先,Scrapy引擎负责调度和管理请求。它从待处理的请求队列中获取请求,并根据其优先级和调度策略来决定下一个要处理的请求。引擎允许用户根据需要自定义调度策略,比如根据网站的限制或页面的特定标记进行请求的处理顺序调整。
  2.         其次,引擎负责请求的发送和页面的下载。它将请求交给下载器,并接收下载器返回的响应。引擎也负责处理下载过程中可能发生的错误或异常情况,并采取相应的动作,如重新发送请求或中止爬取。
  3.         此外,引擎还负责将页面的响应传递给爬虫中指定的解析函数。解析函数根据页面的结构和规则,提取所需的数据,并将数据传递给管道进行进一步的处理。引擎协调解析函数的调用和数据的传递过程,确保数据能够正确流经各个组件。
  4.         引擎还支持扩展和中间件机制,使得开发者能够根据自己的需求来定制请求和响应的处理流程。不同类型的中间件可以用于预处理请求、处理响应、进行身份验证等,以增强爬虫的灵活性与功能。
  5.         最后,引擎提供了事件和信号机制,允许用户自定义触发和处理特定事件的逻辑。这些事件可以在不同的爬虫流程阶段中触发,如开始爬取、发送请求、处理响应等。通过这样的机制,用户可以监控和控制爬虫的行为,并根据需要进行相关操作。

综上所述,Scrapy引擎作为中心角色,承担了整个爬虫框架的协调和管理任务。它通过请求调度、页面下载、数据提取和处理等功能,实现了高效、可定制的爬虫流程。引擎的灵活性和可扩展性使得开发者能够构建强大的网络爬虫应用,满足各种需求。

正文:

Scrapy引擎的核心功能

        首先,让我们考虑一个比喻:将Scrapy引擎看作是一个交通指挥中心。就像交通指挥中心负责协调车辆的行驶和交通流量一样,Scrapy引擎负责协调请求和响应的流动,确保整个爬取过程的顺利进行。

        在这个比喻中,我们可以把Spiders(爬虫)看作是道路系统的起点。Spiders定义了要爬取的网址、如何提取数据以及如何跟进新链接。Spiders就像是从交通指挥中心出发的车辆,它们提供了爬取的初始点。

        当Spiders生成请求时,它们将这些请求交给引擎。这就像是车辆通过交通指挥中心发送请求来获得进一步指示和行驶许可。Scrapy引擎接收到请求后,会将它们添加到调度器中,等待进一步处理。

        调度器可以被视为交通指挥中心的交通调度系统它负责管理所有的请求,决定下一个要处理的请求是什么。调度器根据请求的优先级和调度策略,决定将哪个请求发送给下载器进行处理。可以将调度器看作是交通指挥中心的交通灯和交通规则,确保请求的有序和合理流动。

        一旦请求被调度器发送给下载器,引擎就像是将请求交给车辆的司机一样,将请求转交给下载器。下载器负责下载请求对应的页面,并将下载完成的响应返回给引擎。这就好像是司机按照指示行驶到目的地并返回交通指挥中心的情景。

        在Scrapy中,下载器中使用了下载中间件机制,这可以类比为司机行驶途中遇到的检查站和道路设施。下载中间件可以用于在请求发送或响应返回过程中执行额外的处理。比如,可以在下载中间件中进行身份验证、设置代理或进行URL过滤等操作,以增强请求和响应的处理能力

        当引擎接收到下载器返回的响应后,会将响应交给Spiders进行处理。涉及到的响应处理函数也被称为解析函数。解析函数的作用是从响应中提取出需要的数据或者进一步生成新的请求。这就相当于车辆到达目的地后需要进行装卸和新的行驶指示。

        Spiders将从响应中提取的数据保存在Item中,并将Item交给Pipeline(管道)进行进一步的处理。比如,可以在管道中对数据进行清洗、验证和持久化操作。可以将Pipeline视为车辆抵达目的地后所进行的仓储和分配工作

总结起来,

  • Scrapy引擎的核心功能是协调整个爬取流程,确保各组件能够顺利工作。它负责处理请求和响应的流动,类似于交通指挥中心的角色。
  • 引擎接收请求并将其交给调度器,调度器决定请求的处理顺序并将其发送给下载器。
  • 下载器将下载完成的响应返回给引擎,引擎再将响应交给Spiders进行解析和数据提取。
  • Spiders将提取的数据保存在Item中,并交给Pipeline进行后续处理。

通过这样的流程,Scrapy引擎实现了整个爬虫框架的高效运转。

此外,Scrapy引擎还支持并发处理多个请求和响应。就像交通指挥中心需要同时处理多辆车辆的行驶一样,引擎可以调度并发处理多个请求,并在下载器和Spiders之间进行有效的调度和协调。这样可以提高爬取的效率和速度。

 借助事件和信号机制

Scrapy引擎还提供了灵活的扩展性。开发者可以根据需要,自定义和注册事件和信号,并编写相应的处理函数。这就好比交通指挥中心可以根据特定事件和信号触发相应的操作和指引,以适应不同的情况和需求。

总而言之,Scrapy引擎作为Scrapy框架的核心,承担着整个爬虫流程的调度和协调任务。它类似于交通指挥中心,负责管理请求和响应的流动,确保各组件能够有序地工作。通过调度、请求处理、数据提取和处理等功能,引擎实现了高效、可定制的爬虫流程。借助比喻,我们可以更好地理解Scrapy引擎的工作原理和核心功能。

引擎和调度器的交互:

Scrapy引擎和调度器之间的交互是实现整个爬虫流程的关键步骤。引擎负责将请求交给调度器,并获取调度器返回的下一个要处理的请求。这个交互过程可以通过以下步骤来解释:

  1. 引擎将初始请求传递给调度器:当Spiders生成初始请求时,它们将这些请求交给引擎。引擎接收到这些请求后,将它们添加到调度器中。

  2. 调度器接收和管理请求:调度器负责管理所有的请求,根据其优先级和调度策略决定下一个要处理的请求是什么。它维护一个请求队列,并提供了一套灵活的机制来管理请求的调度。

  3. 引擎获取下一个要处理的请求:引擎从调度器中获取下一个要处理的请求。这个请求可以是通过调度策略决定的优先级最高的请求。

  4. 引擎将请求发送给下载器:引擎将获取到的请求发送给下载器,下载器负责下载请求对应的页面。这一步骤实际上是引擎将请求转交给下载器执行相应的下载任务。

  5. 下载器将响应返回给引擎:下载器在完成页面下载后,将下载完成的响应返回给引擎。响应包含了页面的数据和一些附加信息。

  6. 引擎处理返回的响应:引擎接收下载器返回的响应后,可能会触发一系列的事件和信号。这些事件和信号可以被注册的处理函数捕获和处理。引擎还负责将响应传递给相应的解析函数进行数据提取和处理。

  7. 解析函数生成新的请求:解析函数从响应中提取出数据,并可能生成新的请求。引擎将这些新的请求交给调度器进行处理。

  8. 调度器重新处理新的请求:调度器接收到引擎发送的新的请求后,会重新根据调度策略和优先级进行处理。这个过程循环进行,直到没有新的请求要处理。

案例解释:
import scrapyclass MySpider(scrapy.Spider):name = "myspider"def start_requests(self):# 生成初始请求并通过引擎传递给调度器yield scrapy.Request(url="http://example.com", callback=self.parse)def parse(self, response):# 处理响应数据# 生成新的请求并通过引擎再次传递给调度器yield scrapy.Request(url="http://example.com/next", callback=self.parse_next)# 创建一个CrawlerProcess对象并启动爬虫
from scrapy.crawler import CrawlerProcessprocess = CrawlerProcess()
process.crawl(MySpider)
process.start()

引擎和下载器的交互:

引擎和下载器之间的交互是爬取过程中的另一个重要环节。引擎负责将请求发送给下载器,下载器负责下载页面并返回响应。以下是引擎和下载器的交互步骤:

  1. 引擎将请求发送给下载器:引擎从调度器获取待处理的请求后,将其发送给下载器执行页面下载任务。

  2. 下载器下载页面并返回响应:下载器接收到引擎发送的请求后,执行下载任务,从网络上获取对应页面的数据。下载器将下载完成的响应返回给引擎。

  3. 引擎处理返回的响应:引擎接收到下载器返回的响应后,可能会触发一系列的事件和信号。这些事件和信号可以被注册的处理函数捕获和处理。引擎还负责将响应传递给相应的解析函数进行数据提取和处理。

  4. 解析函数生成新的请求:解析函数从响应中提取出数据,并可能生成新的请求。引擎将这些新的请求再次发送给下载器进行处理,形成一个循环。

案例解释:
import scrapyclass MySpider(scrapy.Spider):name = "myspider"def start_requests(self):# 生成初始请求并通过引擎传递给下载器yield scrapy.Request(url="http://example.com", callback=self.parse)def parse(self, response):# 处理响应数据# 创建一个CrawlerProcess对象
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settingsprocess = CrawlerProcess(settings=get_project_settings())# 启动引擎和下载器来处理请求和响应
with process:process.crawl(MySpider)process.start()

处理异常和重试机制:

在爬取过程中,可能会遇到各种异常情况,比如网络问题、页面不存在或服务器错误等。Scrapy引擎提供了异常处理和重试机制,确保爬取任务的顺利进行。以下是处理异常和重试的机制解释:

  1. 请求异常处理:如果在请求过程中发生异常(如网络错误),引擎会捕获异常并根据配置的策略来处理。可以配置引擎在发生异常时重新发送请求,或根据具体情况决定如何处理。

  2. 响应异常处理:如果在下载过程中发生异常(如服务器返回错误状态码),引擎会捕获异常并触发相应的事件和信号。可以注册处理函数来处理异常响应,比如重新发送请求或进行其他处理。

  3. 重试机制:当发生异常或其他情况导致请求或下载失败时,引擎可以根据配置的重试策略尝试重新发送请求或下载页面。可以设置重试次数和重试时间间隔来控制重试的行为。

  4. 引擎事件和信号:引擎提供了一系列的事件和信号,可以被注册的处理函数捕获和处理。可以根据具体的异常情况来注册相应的处理函数,以实现自定义的异常处理和重试逻辑。

案例解释:
import scrapyclass MySpider(scrapy.Spider):name = "myspider"def start_requests(self):# 生成初始请求并通过引擎传递给下载器yield scrapy.Request(url="http://example.com", callback=self.parse, errback=self.handle_error)def parse(self, response):# 处理响应数据def handle_error(self, failure):# 处理请求或下载异常# 判断是否继续重试if failure.request.meta.get('retry_times', 0) < self.max_retries:# 重新发送请求并通过引擎再次传递给下载器yield failure.request.replace(meta={'retry_times': failure.request.meta.get('retry_times', 0) + 1})else:# 达到重试次数上限,进行其他处理# 创建一个CrawlerProcess对象
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settingsprocess = CrawlerProcess(settings=get_project_settings())# 启动引擎和下载器来处理请求和响应
with process:process.crawl(MySpider)process.start()

通过上述异常处理和重试机制,Scrapy引擎能够灵活处理各种异常情况,并根据需要进行相应的操作,确保爬取任务的成功完成。

总结:

        Scrapy引擎是Scrapy框架的核心,承担了整个爬虫流程的协调和管理任务。它的核心功能包括请求调度和管理、页面下载、数据提取和处理等。

        引擎通过调度器将请求发送给下载器,接收下载器返回的响应,并将响应传递给爬虫中的解析函数进行数据提取。同时,引擎支持扩展和中间件机制,允许开发者自定义请求和响应的处理流程。引擎还提供了事件和信号机制,使用户能够自定义触发和处理特定事件的逻辑。

总体而言,Scrapy引擎作为中心角色,通过协调各组件的工作,实现了高效、可定制的爬虫流程。同时,引擎支持并发处理多个请求和响应,并提供异常处理和重试机制,保证了爬取任务的正常进行。

这篇关于爬虫工作量由小到大的思维转变---<第五十章 Scrapy 深入理解Scrapy爬虫引擎(1)--核心功能>的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/842046

相关文章

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

最好用的WPF加载动画功能

《最好用的WPF加载动画功能》当开发应用程序时,提供良好的用户体验(UX)是至关重要的,加载动画作为一种有效的沟通工具,它不仅能告知用户系统正在工作,还能够通过视觉上的吸引力来增强整体用户体验,本文给... 目录前言需求分析高级用法综合案例总结最后前言当开发应用程序时,提供良好的用户体验(UX)是至关重要

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur