爬虫工作量由小到大的思维转变---<第六十三章 Scrapy统计收集器类的分析与应用(2)>

news/2024/4/29 17:55:59/文章来源:https://blog.csdn.net/m0_56758840/article/details/137127853

前言:

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

本章继续深入:

  1. StatsCollector类是Scrapy中负责收集和处理爬虫统计数据的核心组件,可以用于监控爬虫、性能调优、错误处理和报告生成等场景。
  2. MemoryStatsCollector类相较于StatsCollector类具有更强的功能扩展性和细粒度的数据操作能力,适用于需要紧密监控和分析爬虫表现的情况。
  3. DummyStatsCollector类则是一个轻量级组件,主要用于测试或不关心统计数据的环境中,可以减少资源消耗、提高运行效率和简化调试。

正文:

1. StatsCollector类分析与应用

1.1 StatsCollector类解析

StatsCollector类是Scrapy中负责收集和处理爬虫统计数据的核心组件。一切关于爬虫的运行时间、请求数量、响应状态等关键数据,都可以通过这个类进行采集、储存和检索。

1.2 构造函数与参数

StatsCollector的构造函数初始化了一个用于收集统计数据的对象。在Scrapy框架中,每当Spider开始运行时,StatsCollector就会被实例化,用以追踪爬虫的活动和性能指标。

构造函数的参数通常包括:

  • crawler:这是对Crawler对象的引用,其中包含了Scrapy运行爬虫所需的所有设置和状态信息。

构造函数的例子如下:

from scrapy.statscollectors import StatsCollectorclass MySpider(scrapy.Spider):# Spider定义...crawler = get_crawler()
stats_collector = StatsCollector(crawler)

1.3 主要方法解析

1.3.1 get_value

get_value方法用于获取指定统计数据的值。参数包括一个键(key),代表想要查询的统计数据名,以及一个默认值(default),用于在没有相应统计数据时返回。

1.3.2 set_value

set_value方法直接设定统计数据的值。它接受两个参数:一个键(key),代表要设置的统计数据名,以及一个值(value),是要设置的具体数值。

1.3.3 inc_value

inc_value方法用于增加统计数据的值。如果数据不存在,则从默认值开始累加;否则,在现有的值上进行累加。键(key)、增量(count)和默认值(start)是这个方法的参数。

1.3.4 dec_value

inc_value相反,dec_value方法用于减少统计数据的值。

1.3.5 max_value

max_value用于更新统计数据的最大值。如果当前统计数据的值比提供的值小,就会更新它。

1.3.6 min_value

min_value则用于更新统计数据的最小值。如果当前统计数据的值比提供的值大,就会更新它。

1.3.7 clear_stats

clear_stats可以清除所有统计数据。

1.4 应用场景分析

Scrapy的StatsCollector类提供了很多方法和工具,这些工具在爬虫开发过程的不同阶段都有实际的应用价值。接下来,通过一系列的实际场景,我们详细介绍如何利用StatsCollector类。

1.4.1 场景一:监控爬虫

在爬虫运行期间,监控其性能指标至关重要。利用StatsCollectorget_value方法,可以实时获取最新的请求计数、错误数等关键统计信息,有效监控爬虫运行状态。

1.4.2 场景二:性能调优

通过记录和分析响应时间、请求失败比例等数据,我们能够识别那些影响爬虫性能的环节。例如,利用max_valuemin_value方法可以追踪响应时间的极值,辅助我们进行性能调优。

1.4.3 场景三:错误处理

在爬虫发生错误时,准确记录错误信息至关重要。使用inc_value方法,可以建立一个自定义的错误计数器,并在爬虫出错时进行更新。

1.4.4场景四:报告生成

爬虫结束之后,利用StatsCollector收集到的数据生成报告,为程序员和利益相关者提供信息支持。可以利用get_stats方法获取全部统计数据并导出。

1.5 使用示例

让我们通过几个具体的例子来更好地理解StatsCollector类的使用。

1.5.1 示例一:跟踪请求数量

在Spider代码中,我们如下使用inc_value方法来跟踪请求的总数量:

class MySpider(scrapy.Spider):name = 'myspider'def parse(self, response):# 伪代码解析页面self.crawler.stats.inc_value('request_count')yield 数据或请求

每当一个新的请求生成时,请求计数就会增加。

1.5.2 示例二:记录和比较响应时间

一个典型的爬虫通常需要掌握响应时间的信息,以判断网页响应是否过慢。示例代码如下:

import timeclass MySpider(scrapy.Spider):name = 'myspider'def parse(self, response):start_time = time.time()# 解析页面...end_time = time.time()response_time = end_time - start_timeself.crawler.stats.max_value('max_response_time', response_time)

在这里,我们记录了每个响应的处理时间,并使用max_value来跟踪最长的响应时间。

1.5.3 示例三:错误计数
class MySpider(scrapy.Spider):name = 'myspider'def parse(self, response):try:# 尝试解析页面可能会抛出异常except Exception as e:self.crawler.stats.inc_value('error_count')self.logger.error(f'解析错误: {e}')

当解析函数遇到异常时,错误计数器增加,并且日志中打印相应的错误信息。


2 MemoryStatsCollector类分析与应用

2.1 MemoryStatsCollector类分析与应用

在网络数据爬取的实践中,追踪爬虫的性能并实时获取操作反馈是至关重要的任务。Scrapy框架中的MemoryStatsCollector类,作为StatsCollector的子类,其设计目标是为开发人员提供对爬虫执行状态的更详尽的内存中统计信息。本章节我们将对MemoryStatsCollector类的构造、功能、以及应用场景进行详细探讨。

2.2 MemoryStatsCollector类概览

MemoryStatsCollector类继承自StatsCollector类,并在此基础上添加了新的特性和功能,以支持更丰富的性能监测和信息可视化需求。这个类的主要目的是在Scrapy爬虫的内存中维护详细的统计数据,使得开发人员能够对爬虫实例运行过程中的各类指标进行实时监控。

2.3 MemoryStatsCollector目的与特点

MemoryStatsCollector类的主要目的在于提供更精确的监控功能,允许开发者深入分析和理解爬虫的行为。它的重点特性包括但不限于:

  • 持久化统计: 爬虫结束时,所有收集的内存统计数据都可以被持久化,如保存到数据库中,为爬虫的长期性能分析和历史比较提供了可能。
  • 实时性能监控: 内存中保留统计数据使得开发者可以在爬虫运行过程中,实时把握爬虫的表现,快速识别和响应潜在问题。

2.4 MemoryStatsCollector属性与方法分析

2.4.1 新增属性
spider_stats

spider_stats属性是一个字典(dict类型),它记录了与单个爬虫实例相关的所有统计信息。该属性的目的是使得每个Spider实例都有一个单独的统计空间,帮助开发者区分和对比不同爬虫间的性能。

2.4.2 新增方法
_persist_stats

_persist_stats方法负责将内存中的统计信息保存到外部系统中。这意味着数据不仅仅在爬虫运行时可用,结束后也可以持久保留,这为进行长期的数据分析提供了基础。

2.5 MemoryStatsCollector的优势与应用场景

相比于基本的StatsCollector,MemoryStatsCollector类有一系列明显的优势,特别在需要紧密监控和分析爬虫表现的情况下更加突出。其优势不只体现在功能扩展性上,还体现在为工程师提供细粒度的数据操作能力上。

2.5.1 优势分析
  1. 更丰富的数据: MemoryStatsCollector的统计数据更为详尽,它能够追踪更多维度的性能指标和事件,从而为开发者提供用于决策的更多信息。

  2. 易于扩展: 它对开发者友好的接口和设计模式,使得其更容易被扩展和集成到其他系统中,提供了良好的灵活性。

  3. 强化数据持久化: MemoryStatsCollector能够将运行时数据持久化,这意味着爬虫的运行信息可以被长时间地存储和分析,为微观分析和宏观策略的制定提供了支持。

2.5.2 应用场景
  1. 大规模爬取任务: 对于需要处理大量请求和数据的爬虫,MemoryStatsCollector能够记录足够的运行数据,帮助分析和优化处理流程。

  2. 优化性能: 当爬虫性能达到瓶颈时,MemoryStatsCollector提供的详尽数据支持开发者进行深层次的性能瓶颈分析。

  3. 监控与预警系统: 通过实时监测爬虫的表现,MemoryStatsCollector可以与监控系统集成,为运维人员提供实时的预警。

  4. 长期数据分析: 爬虫有时需要进行长期运行并在过去的数据上进行比较分析,MemoryStatsCollector的持久化特性就非常有用。

2.6 使用示例

上述特性在日常使用中如何体现呢?以下是一些实际应用代码示例。

2.6.1 示例一:统计项持久化
# 假设我们的Spider结束运行时,需要存储统计信息到数据库中:
class MySpider(scrapy.Spider):name = 'myspider'def close(self, reason):# 将内存中的统计数据持久化self.crawler.stats._persist_stats(self.stats, self.crawler.settings)# 其余关闭逻辑...

在这里,我们在爬虫关闭时调用_persist_stats方法,它会把spider_stats中的数据持久化,从而在数据库中储存当前爬虫实例运行的所有统计信息。

2.6.2 示例二:实时性能监控
# 如果我们需要实时监控爬虫的表现并记录响应时间等数据:
class MySpider(scrapy.Spider):name = 'myspider'def parse(self, response):# 记录响应到达时间self.crawler.stats.inc_value('response_arrived_count')# 继续处理response...

在此场景中parse方法每被调用一次,相应的统计项response_arrived_count就会增加,这样我们就可以实时追踪并且分析响应时间了。


3 DummyStatsCollector类分析与应用

3.1 DummyStatsCollector类概览

DummyStatsCollector类是在Scrapy中用作收集统计数据的轻量级组件。它实现了与StatsCollector相同的接口,但并不执行任何实质性的操作。这意味着无论何时调用它的方法,DummyStatsCollector都只会简单地执行而不保留任何数据。

3.2 DummyStatsCollector的作用与用途

DummyStatsCollector的主要作用是在测试或者不关心统计数据的环境中使用。它能够

  • 减少资源消耗:DummyStatsCollector没有数据存储的需要,因而节省了存储资源。
  • 提高运行效率:不记录统计信息,可以避免I/O操作,从而网速执行。
  • 简化调试:在开发过程中,可以使用DummyStatsCollector来简化代码的流程,不必关心统计数据的准确性,使关注点保持在更核心的爬虫功能上。

3.3 DummyStatsCollector重写的方法分析

虽然DummyStatsCollector类提供了与StatsCollector一致的方法,但它们都被重写成了无状态的操作。以下是一些核心方法的重写示例:

3.3.1 get_value

get_value方法用于获取指定的统计数据,但在DummyStatsCollector中调用此方法总是返回默认值或None

3.3.2 set_value

set_value方法在DummyStatsCollector中同样只是一个空操作,设置任何值都不会有实际效果,因为它并不保留数据。

3.3.3 inc_value / dec_value

inc_valuedec_value方法在DummyStatsCollector中被重写为无操作状态。它们被调用时不会有任何统计数据的增减,无论传入何种参数。

3.4 DummyStatsCollector的应用场景及使用示例

DummyStatsCollector的应用场景通常局限于开发和测试阶段,或者在资源非常受限的环境中,当统计数据不是必需的。

3.4.1 场景一:自动化测试

在进行自动化测试时,通常更关心程序的逻辑正确性而非性能指标。在这种情况下,可以使用DummyStatsCollector来替换默认的统计收集器。

from scrapy.statscollectors import DummyStatsCollectorclass MySpider(scrapy.Spider):name = 'myspider'# 爬虫的其它定义...# 在爬虫设置中使用DummyStatsCollector
crawler = get_crawler()
crawler.stats = DummyStatsCollector(crawler)
3.4.2 场景二:开发阶段的性能测试

在开发阶段对爬虫进行性能优化时,可能暂时需要禁用统计功能,以便更精准地分析代码本身的性能特点。

from scrapy.statscollectors import DummyStatsCollectorclass MySpider(scrapy.Spider):name = 'myspider'def parse(self, response):# 此处逻辑不受统计模块影响,专注于性能调优# ...pass# 实例化DummyStatsCollector用于开发阶段
crawler.stats = DummyStatsCollector()

结语:

        本文介绍了Scrapy框架中的StatsCollector类及其子类MemoryStatsCollector和DummyStatsCollector的功能和用途。

  1. StatsCollector类是爬虫统计数据的核心组件,用于收集和处理关键统计信息;
  2. MemoryStatsCollector在需要紧密监控和分析爬虫性能时具有明显的优势;
  3. DummyStatsCollector则用于测试环境或不关心统计数据的场景;

通过对各类的方法解析和应用场景分析,我们可以更好地理解如何使用StatsCollector类及其子类来监控爬虫、进行性能调优和错误处理,并生成报告。这些类提供了强大的工具,为爬虫开发者提供了统计数据的收集和分析的能力,帮助优化爬虫的表现和效率。

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

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

相关文章

k8s1.28.8版本配置prometheus监控告警

文章目录 官方架构图组件的具体介绍kube-prometheus包含的组件简介:文件存储路径: 结构分析官网自带的一些规则自己总结流程 1-创建规则磁盘使用率报警规则 详解上面rule流程Alertmanagerg查看 2-报警接收器2.1-邮件报警修改Alertmanager配置查看现有的s…

实战|使用 Node.js 和 htmx 构建全栈应用程序

在本教程中,我将演示如何使用 Node 作为后端和 htmx 作为前端来构建功能齐全的 CRUD 应用程序。这将演示 htmx 如何集成到全栈应用程序中,使您能够评估其有效性并确定它是否是您未来项目的不错选择。 htmx 是一个现代 JavaScript 库,旨在通过…

Haproxy2.8.1+Lua5.1.4部署,haproxy.cfg配置文件详解和演示

目录 一.快速安装lua和haproxy 二.配置haproxy的配置文件 三.配置haproxy的全局日志 四.测试负载均衡、监控和日志效果 五.server常用可选项 1.check 2.weight 3.backup 4.disabled 5.redirect prefix和redir 6.maxconn 六.调度算法 1.静态 2.动态 一.快速安装lu…

【python】网络编程socket TCP UDP

文章目录 socket常用方法TCP客户端服务器UDP客户端服务器网络编程就是实现两台计算机的通信 互联网协议族 即通用标准协议,任何私有网络只要支持这个协议,就可以接入互联网。 socket socke模块的socket()函数 import socketsock = socket.socket(Address Family, type)参…

推动制药行业数字化转型:基于超融合架构的MES一体机解决方案

随着中国对信息化重视程度的不断加深,制药行业作为国民经济的重要支柱之一,也在积极寻求通过数字化手段提升产业效率与产品质量。自党的十六大提出“以信息化带动工业化”的战略以来,制药业的这一转型探索尤为迫切。 在现代制药生产中&#…

scala-idea环境搭建及使用

环境搭建 创建一个新项目,选择maven工程 点击next,写入项目名,然后finish 注意:默认下,maven不支持scala的开发,需要引入scala框架,右键项目点击-》add framework pport....,在下图…

基于java+SpringBoot+Vue的书籍学习平台设计与实现

基于javaSpringBootVue的书籍学习平台设计与实现 开发语言: Java 数据库: MySQL技术: SpringBoot MyBatis工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 后台展示 系统简介 整体功能包含: 书籍学习平台是一个基于Internet的在线学习资源平台&#xf…

Apache Hive的基本使用语法(二)

Hive SQL操作 7、修改表 表重命名 alter table score4 rename to score5;修改表属性值 # 修改内外表属性 ALTER TABLE table_name SET TBLPROPERTIES("EXTERNAL""TRUE"); # 修改表注释 ALTER TABLE table_name SET TBLPROPERTIES (comment new_commen…

音视频开发Day01

备注 ffmpeg 库相关函数记忆 FFmpeg 库简介 FFmpeg一共包含8个库: avcodec:编解码(最重要的库) avformat:封装格式处理。 avfilter:滤镜特效处理 avdevice:各种设备的输入输出。 avutil:工具库(大部分库都需要这个库的支持)。 postproc:后加工。 swresample:音频采样数据格式…

一分钟开服 《幻兽帕鲁》游戏专属服务器by京东云主机

使用京东云服务器搭建幻兽帕鲁Palworld游戏联机服务器教程,非常简单,京东云推出幻兽帕鲁镜像系统,镜像直接选择幻兽帕鲁镜像即可一键自动部署,不需要手动操作,真正的新手0基础部署幻兽帕鲁,阿腾云atengyun.…

OSCP靶场--pyLoader

OSCP靶场–pyLoader 考点(信息收集CVE-2023-0297) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -Pn -sC -sV 192.168.178.26 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-28 09:14 EDT Nmap scan report for 192.168.178.26 Host is up…

基于Python的电商特产数据可视化分析与推荐系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 利用网络爬虫技术从某东采集某城市的特产价格、销量、评论等数据,经过数据清洗后存入数据库,并实现特产销售、市场占有率、价格区间等多维度的可视化统计分析,并…

关于使用vscode搭建c/c++编程环境

目录 关于使用vscode搭建c/c编程环境一、前言二、安装 IDE 二、安装TDM-GCC安装三、安装C/C环境四、编写代码并进行编译 关于使用vscode搭建c/c编程环境 一、前言 一直觉得vscode是生产强有力的生产工具,基于此,做一篇学习笔记进行记录。 二、安装 ID…

Prometheus +Grafana +node_exporter可视化监控Linux虚机

1、介绍 待补充 2、架构图 待补充 Prometheus :主要是负责存储、抓取、聚合、查询方面。 node_exporter :主要是负责采集物理机、中间件的信息。 3、搭建过程 配置要求:1台主服务器 n台从服务器 (被监控的linux虚机&am…

WPF自定义Panel:让拖拽变得更简单

在 WPF 应用程序中,拖放操作是实现用户交互的重要组成部分。通过拖放操作,用户可以轻松地将数据从一个位置移动到另一个位置,或者将控件从一个容器移动到另一个容器。然而,WPF 中默认的拖放操作可能并不是那么好用。为了解决这个问…

uniApp使用XR-Frame创建3D场景(7)加入点击交互

上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用 这篇我们讲解如何与场景中的模型交互&#xff08;点击识别&#xff09; 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"><xr-node><xr-mesh id"…

【已修复】iPhone13 Pro 长焦相机水印(黑斑)修复 洗水印

iPhone13 Pro 长焦相机水印&#xff08;黑斑&#xff09;修复 洗水印 问题描述 iPhone13 Pro 后摄3倍相机有黑色斑点&#xff08;水印&#xff09;&#xff0c;如图所示&#xff0c; 后摄相机布局如图所示&#xff0c; 修复过程 拆机过程有风险&#xff0c;没有把握最好不要…

MySQL学习笔记------函数

目录 函数 字符串函数 数值函数 函数 指一段可以直接被另一段程序调用的程序或代码 字符串函数 MySQL中内置了很多字符串函数&#xff0c;常用如下&#xff1a;select 函数 concat(s1,s2,s3,...,sn) 字符串拼接&#xff0c;将s1,s2,...,sn拼接成一个字符串 #字符串拼…

C/C++语言学习路线: 嵌入式开发、底层软件、操作系统方向(持续更新)

初级&#xff1a;用好手上的锤子 1 【感性】认识 C 系编程语言开发调试过程 1.1 视频教程点到为止 1.2 炫技视频看看就行 1.3 编程游戏不玩也罢 有些游戏的主题任务就是编程&#xff0c;游戏和实际应用环境有一定差异&#xff08;工具、操作流程&#xff09;&#xff0c;在…

火车头通过关键词采集文章的原理

随着互联网信息的爆炸式增长&#xff0c;网站管理员和内容创作者需要不断更新和发布新的文章&#xff0c;以吸引更多的用户和提升网站的排名。而火车头作为一款智能文章采集工具&#xff0c;在这一过程中发挥着重要作用。本文将探讨火车头如何通过关键词采集文章&#xff0c;以…