0
点赞
收藏
分享

微信扫一扫

爬虫工作量由小到大的思维转变---<第五十一章 Scrapy 深入理解Scrapy爬虫引擎(2)--引擎的工作流程>

Xin_So 03-24 12:30 阅读 2
爬虫scrapy

前言:

继续上一篇:https://hsnd-91.blog.csdn.net/article/details/136943552

        本章主要介绍Scrapy引擎的启动流程、请求处理的生命周期、如何处理下载的内容以及触发Item Pipeline的过程。还讨论了数据处理在爬虫解析函数和Item Pipeline中的作用,并介绍了引擎关闭的流程及案例代码。

正文:

1、Scrapy引擎的启动流程:

1.1 加载配置:

        在启动Scrapy引擎之前,需要先加载并解析配置文件。配置文件中包含了爬虫的相关配置信息,如爬取目标、下载中间件、管道等。通过读取配置文件,引擎可以根据项目需求进行合理的配置。

1.2 组件初始化:

        在加载配置完成后,引擎会根据配置中指定的组件进行初始化。这些组件包括调度器、下载器、爬虫中间件和下载中间件等。通过初始化这些组件,引擎为后续的请求处理和数据处理做好准备。

1.3 调度器启动:

        调度器是Scrapy引擎的核心组件,负责管理待请求和待处理的URL队列。在引擎启动时,调度器会被启动,并从起始URL开始生成第一个请求。调度器根据设定的调度策略进行URL的调度和去重,确保爬取任务的顺利进行。

1.4 请求处理循环:

        在调度器启动后,引擎进入请求处理循环。循环的每一轮称为一个"请求处理周期"。在每个请求处理周期中,引擎会执行以下几个主要步骤:从调度器获取一个待处理的请求,将请求交给下载器处理,接收下载器返回的响应,将响应交给爬虫的解析函数进行数据提取和处理。这个循环会一直执行,直到所有的请求都被处理完成。

1.5 引擎关闭:

        当所有的请求处理完成后,引擎会触发关闭信号,通知爬虫任务即将结束此时,可以执行一些清理操作或保存数据的逻辑。引擎的关闭流程会在后续的章节中详细介绍。

2.  请求处理的生命周期:

请求处理的生命周期是指一个请求从创建到完成整个处理过程的一系列环节。以下是请求处理的生命周期中的关键步骤:

2.1请求生成:

        在请求处理的开始阶段,引擎会将起始URL转化为一个请求对象。请求对象包含了URL、请求方法、请求头等信息通过调用爬虫的起始请求生成函数,可以生成多个初始请求对象。

2.2下载器中间件的处理:

        在请求对象生成后,请求会依次经过下载器中间件的处理过程。下载器中间件可以对请求进行预处理重新构造请求或对请求进行过滤通过下载器中间件,可以实现更加灵活和定制化的请求处理逻辑。

2.3调度器的调度和去重:

        经过下载器中间件的处理后,请求对象会被交给调度器进行调度。调度器会根据设定的调度策略对请求进行优先级调度和去重判断。调度器将请求对象添加到待调度队列中,并进行去重判断,以确保不发送重复的请求。

2.4下载器的处理:

        当调度器选择一个请求对象进行处理时,引擎会将请求对象交给下载器组件执行实际的下载动作。下载器根据请求对象中的URL、请求头等信息,发送网络请求获取响应内容。

2.5下载器中间件的处理:

        下载器接收到响应后,响应会经过下载器中间件的处理。下载器中间件可以对响应进行预处理、重新构造响应或对响应进行过滤。通过下载器中间件,可以进行响应内容的加工和处理。

2.6爬虫的解析和数据处理:

        下载器中间件处理完响应后,引擎会将响应对象交给指定的爬虫解析函数进行数据提取和处理。爬虫解析函数通过使用XPath、CSS选择器等方式,从响应内容中提取所需数据,并生成爬取结果。

2.7Item Pipeline处理:

        在爬虫解析函数中生成的数据项(Item)会经过Item Pipeline的处理。Item Pipeline可以对数据进行清洗、验证、处理或保存操作。通过Item Pipeline,可以对数据进行多种处理并将其保存到不同的存储介质中。

2.8保存数据:

        在引擎关闭之前,可以通过Item Pipeline将最终的爬取结果保存到目标存储介质中。这可以包括将数据存储到数据库、文件或其他数据源中。

2.9执行清理操作:

        引擎关闭时,可以执行一些额外的清理操作。例如关闭数据库连接、释放文件句柄或清除缓存数据等。这些操作有助于释放系统资源并保持环境的整洁。

2.10发送关闭信号:

        当所有的清理操作完成后,引擎会发送关闭信号通知爬虫任务即将结束。这可以触发相关代码的执行,以处理关闭前的最后任务。

2.11引擎关闭:

        最后,引擎会正式关闭,释放所有的资源和关闭相应的组件。引擎的关闭标志着整个爬虫任务的结束。

3.处理下载的内容:

        在Scrapy框架中,下载器负责发送网络请求并获取响应内容。当下载器接收到响应后,它会将下载的内容返回给引擎,然后引擎将根据配置和规则决定如何处理下载的内容。

3.1 下载的内容格式:

        下载的内容通常是以字节流(bytes)的形式返回的,这是响应的原始数据。内容可以是HTML页面、JSON数据、图片文件或其他任意形式的数据。

3.2 解析下载的内容:

        引擎从下载器接收到内容后,会将其交给相应的爬虫解析函数进行解析。解析函数可以使用XPath、CSS选择器或正则表达式等方式从内容中提取出所需的数据。

3.3 构建Item对象:

        在解析过程中,通常会将提取到的数据封装成一个Item对象。Item是一个类似字典的数据容器,用于存储爬取到的数据。

3.4 决定请求的后续处理:

        在解析完下载的内容并构建好Item对象后,引擎会根据爬虫的规则和配置决定请求的后续处理方式。这可能包括返回下一页的请求、跟进链接或将数据提交到Item Pipeline进行处理。

4.如何触发Item Pipeline:

在Scrapy框架中,当每个Item被爬虫解析函数处理完毕后,会通过Item Pipeline进行进一步的处理。Item Pipeline是处理Item的组件,用于对爬取到的数据进行清洗、验证、处理或保存等操作。

触发Item Pipeline的过程如下:

4.1 爬虫解析函数返回Item:

        爬虫解析函数通过yield关键字返回解析得到的Item对象。

4.2 被引擎接收:

        引擎接收到爬虫解析函数返回的Item对象,并将其传递给Item Pipeline组件。

4.3 Item Pipeline处理:

        Item Pipeline按照一定的顺序执行一系列的Item Pipeline组件,对接收到的Item对象进行处理。每个Item Pipeline组件都可以对Item进行操作,如数据清洗、格式转换、验证或保存等。

4.4 数据的最终处理:

        在经过所有的Item Pipeline组件处理后,最终的结果可能是持久化存储数据、导出数据到文件、发送数据到数据库或其他特定的操作,取决于Item Pipeline组件的配置和实现。

5.如何处理数据:

        在Scrapy框架中,数据的处理主要发生在爬虫解析函数和Item Pipeline中。

5.1爬虫解析函数:

        在爬虫解析函数中,使用XPath、CSS选择器、正则表达式等方式从下载的内容中提取数据。然后,可以根据实际需求对数据进行处理、清洗和转换。

5.2Item Pipeline:

        Item Pipeline是对爬取到的数据进行进一步处理的组件。通过配置和定义Item Pipeline,可以对数据进行数据清洗、验证、格式转换、去重以及持久化存储等操作。

6.引擎的关闭流程:

        引擎的关闭流程涉及任务完成后的一系列操作,包括资源的释放、数据的保存和最后的清理工作。以下是引擎的关闭流程的主要步骤:

6.1 保存数据:

        在引擎关闭之前,可以通过Item Pipeline将最终的爬取结果保存到目标存储介质中。这可以包括将数据存储到数据库、文件或其他数据源中。

6.2 执行清理操作:

        引擎关闭时,可以执行一些额外的清理操作。例如关闭数据库连接、释放文件句柄或清除缓存数据等。这些操作有助于释放系统资源并保持环境的整洁。

案例:
import pymongo

class SpiderPipeline:
    def open_spider(self, spider):
        self.client = pymongo.MongoClient("mongodb://localhost:27017")
        self.db = self.client["mydatabase"]
        self.collection = self.db["mycollection"]

    def close_spider(self, spider):
        self.client.close()  # 在关闭引擎之前关闭数据库连接

    def process_item(self, item, spider):
        self.collection.insert_one(dict(item))
        return item

6.3 发送关闭信号:

        当所有的清理操作完成后,引擎会发送关闭信号通知爬虫任务即将结束。这可以触发相关代码的执行,以处理关闭前的最后任务。

案例:
import signal

def close_spider(signum, frame):
    # 执行最后的任务
    print("正在关闭引擎...")
    # 进行清理操作
    print("执行一些清理操作...")
    # 其他操作...
    # 关闭引擎
    reactor.stop()

# 注册信号处理器
signal.signal(signal.SIGINT, close_spider)
signal.signal(signal.SIGTERM, close_spider)

# 启动引擎
from scrapy import signals
from scrapy.crawler import CrawlerProcess

process = CrawlerProcess(settings)
process.crawl(MySpider)
process.start()

        

6.4 引擎关闭:

        最后,引擎会正式关闭,释放所有的资源和关闭相应的组件。引擎的关闭标志着整个爬虫任务的结束。

总结:

        Scrapy引擎的启动流程。

  •  从加载配置开始,引擎会进行组件初始化、调度器启动和请求处理循环等阶段,最终引擎关闭。
  • 请求处理的生命周期包括请求生成、下载器中间件处理、调度器调度和去重、下载器处理、爬虫解析和数据处理、Item Pipeline处理以及最后的数据保存和清理操作。
  • 如何触发Item Pipeline,通过爬虫解析函数返回Item对象,再经过Item Pipeline的处理。
  • 另外,强调了数据处理的重要性,包括从下载内容中解析数据,并在爬虫解析函数和Item Pipeline中进行进一步处理。
  • 最后,引擎的关闭流程包括保存数据、执行清理操作和发送关闭信号,最终关闭引擎。

-------深入了解Scrapy框架的工作原理,并在实际开发中灵活运用。

举报

相关推荐

0 条评论