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

前言:

继续上一篇: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 pymongoclass 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 signaldef 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 CrawlerProcessprocess = CrawlerProcess(settings)
process.crawl(MySpider)
process.start()

        

6.4 引擎关闭:

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

总结:

        Scrapy引擎的启动流程。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/766521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年 前端JavaScript Web APIs 第五天 笔记

5.1-BOM和延迟函数setTimeout 5.2-事件循环eventloop 1-》 3 -》2 1-》 3 -》2 5.3-location对象 案例&#xff1a;5秒钟之后自动跳转页面 <body><a href"http://www.itcast.cn">支付成功<span>5</span>秒钟之后跳转到首页</a><sc…

数据库测试案例20240322-binlog_format为row binlog日志分析,主备数据不一致会导致复制出问题

1 测试概述 master-1&#xff0c;master-2表数据test如下&#xff1a; 9:26: [mytest]> select *From test; ---------- | id | name | ---------- | 10 | 123 | ---------- 1 row in set (0.00 sec) 2 在主库将数据删除导致数据不一致 09:26: [mytest]> set sql_…

git的实际应用场景

本文章的场景主要来源于实际工作&#xff0c;用于记载回看&#xff1b;持续更新&#xff0c;最后更新日期&#xff1a;2024-03-23软件&#xff1a;Git BASH、GitK、Git GUI三者配合使用 1、git reset < file > 作用&#xff1a;把文件从暂存区状态重置为工作区状态&…

对象操作篇

文章目录 9.1 dir()9.2 hash()9.3 help()9.4 id()9.5 type() 9.1 dir() dir() 是 Python 中的一个内置函数&#xff0c;用于返回一个对象的所有属性和方法的列表。当dir()不带参数调用时&#xff0c;它会返回当前作用域中的变量、方法和定义的类型列表。如果dir()带有一个参数…

从零开始学HCIA之网络自动化02

1、Python 是一种解释型&#xff08;即不需要编译环节&#xff09;的、面向对象&#xff08;即支持面向对象的风格或代码&#xff09;的、动态数据类型的高级程序设计语言。对于所谓的高级程序设计语言&#xff0c;你可以理解为“同声传译”的过程。 2、Python标准库很庞大&am…

Shut down, sleep, or hibernate your PC 关闭、睡眠或休眠

最近一段时间没有整服务器了~自己开始捉摸18年买的笔记本-x280&#xff0c;除了发现usb type c和thunderbolt 3接口的不一样外&#xff0c;也开始研究这个待机的功能了~找了官方文档&#xff0c;做个简易的翻译&#xff0c;给大家一起看看学习把。 官方文档URL&#xff1a; S…

Docker搭建LNMP环境实战(02):Win10下安装VMware

实战开始&#xff0c;先安装 VMware 虚拟机。话不多说&#xff0c;上手就干&#xff01; 1、基本环境检查 1.1、本机Bios是否支持虚拟化 进入&#xff1a;任务管理器- 性能&#xff0c;查看“虚拟化”是否启用&#xff0c;如果已启用&#xff0c;则满足要求&#xff0c;如果未…

【Swagger】接口文档生成

文章目录 一、前后端分离开发流程二、YApi导入接口文档三、Swagger3.1 介绍3.2 使用步骤3.2.1 导入 knife4j 的maven依赖3.2.2 在配置类中加入 knife4j 相关配置3.2.3 配置类中设置静态资源映射3.2.4 访问测试 3.3 常用注解3.4 全局参数设置 四、YApi 与 Swagger 一、前后端分离…

Day18:LeedCode 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

513. 找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 思路:出该二叉树的 最底层 最左边 节点的值找出深度最大的第一个结点(左结点先遍历) 方法一…

一个单生产-多消费模式下无锁方案(ygluu/卢益贵)

一个单生产-多消费模式下无锁方案 ygluu/卢益贵 关键词&#xff1a;生产者-消费者模型、无锁队列、golang、RWMutex 本文介绍一个“单生产(低频)-多消费”模式下的无锁哈希类方案&#xff0c;这个方案的性能优于golang的RWMutex&#xff0c;因为它永远不会因为“写”而导致与…

i2c-tools基本用法

一. 前言 前面调试一个I2C设备&#xff0c;用到了i2c-tools&#xff0c;觉得是一个调试I2C不错的工具&#xff0c;本文对i2c-tools的基本用法做一些介绍。i2c-tools是一些控制2C接口工具的集合&#xff0c;其中包括i2cdetect&#xff0c;i2cdump&#xff0c;i2cget&#xff0c;…

亚稳态及其解决办法

异步电路 亚稳态 亚稳态亚稳态的产生原因什么是同步异步信号怎么消除亚稳态 亚稳态 在数字电路中&#xff0c;每一位数据不是1&#xff08;高电平&#xff09;就是0&#xff08;低电平&#xff09;。当然对于具体的电路来说&#xff0c;并非1&#xff08;高电平&#xff09;就是…

ECMAScript与JavaScript辨析:标准与实现之辨

ECMAScript与JavaScript辨析&#xff1a;标准与实现之辨 目录 ECMAScript与JavaScript辨析&#xff1a;标准与实现之辨 一、引言 二、ECMAScript&#xff1a;脚本编程语言的标准蓝图 三、JavaScript&#xff1a;基于ECMAScript的实现 四、ECMAScript与JavaScript的交互关系及…

Notepad++ 如何调整显示字面大小

在 Notepad 上&#xff0c;可以使用 ctrl 加上鼠标的左键来滚动来进行调整。 如何恢复默 可以使用 Ctrl 加数字键盘上的 / 键 来恢复默认设置。 当然也可以通过菜单栏上 view 菜单下的 Zoom 选项。 上面的界面中可以看到我们的在 Notepad 中使用的选项。 Notepad 如何调整显示…

redis 如何保证数据同步(数据变化时)

redis 如何保证数据同步&#xff08;数据变化时&#xff09; 思路 1.新增、删除和修改都先对数据库进行操作&#xff0c;这时数据库的数据将域缓存中数据不同。 2.数据库进行变动后&#xff0c;返回结果&#xff0c;根据返回的结果判断数据库操作是否成功。 3.如果数据库操…

C++和Python计算金融数学方程算法模型

要点 C代码蒙特卡罗模拟金融产品估值&#xff0c;开发C并行计算模拟库。 算法伴随微分计算图及C代码实现释义&#xff1a;C应用经典的复合模式构建有向无环图&#xff0c;遍历有向无环图节点C实现&#xff0c;C使用懒惰评估计算次序&#xff0c;遍历代码实现&#xff0c;C代码…

图论复习(最短路、最小生成树)

图论复习 拓扑排序 原题链接&#xff1a;AcWing 848. 有向图的拓扑序列 - AcWing 在建图时&#xff0c;记录每个节点的入度&#xff0c;首先把入度为0的点都存到队列里。 然后在搜索时&#xff0c;每搜到一个点&#xff0c;就把这个点的入度 -1 &#xff0c;当它的入度变为…

Flutter开发进阶之瞧瞧BuildOwner

Flutter开发进阶之瞧瞧BuildOwner 上回说到关于Element Tree的构建还缺最后一块拼图&#xff0c;build的重要过程中会调用_element!.markNeedsBuild();&#xff0c;而markNeedsBuild会调用owner!.scheduleBuildFor(this);。 在Flutter框架中&#xff0c;BuildOwner负责管理构建…

计算机视觉之三维重建(2)---摄像机标定

文章目录 一、回顾线代1.1 线性方程组的解1.2 齐次线性方程组的解 二、透镜摄像机的标定2.1 标定过程2.2 提取摄像机参数2.3 参数总结 三、径向畸变的摄像机标定3.1 建模3.2 求解 四、变换4.1 2D平面上的欧式变换4.2 2D平面上的相似变换和仿射变换4.3 2D平面上的透射变换4.4 3D…

使用 VMWare 安装 Android-x86 系统(小白版)

文章目录 VMWare 介绍Android 系统介绍概述最终效果前置步骤开始安装 VMWare 介绍 VMware Workstation是VMware公司开发的一款桌面虚拟化软件。它允许用户在一台物理计算机上同时运行多个操作系统&#xff0c;每个操作系统都在自己的虚拟机中运行。这使得用户可以在同一台计算…