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

​​​​​​​前言:

        在当今信息时代的互联网环境中,网络爬虫正日益成为了获取和分析大量数据的关键工具。网络爬虫的用途广泛,包括搜索引擎的建立、商业情报的收集、舆情分析等。然而,随着互联网规模和复杂性的不断增加,监控和统计爬虫的行为变得越来越重要。

        在这样的背景下,网络爬虫中进行统计收集就变得尤为重要和有价值了。通过对爬虫活动的统计收集,我们可以获得关于爬取过程的详细信息,如请求和响应的数量、处理时间、错误率等等。这些统计数据不仅可以帮助我们优化爬虫的性能和效率,还能提供有关网络环境和目标网站的洞察,以便更好地制定爬取策略。

统计收集对于爬虫的监控、调试和改进非常重要。它不仅使我们能够检测和解决潜在问题,如访问频率过快、请求被拒绝等,还可以帮助我们识别爬虫的瓶颈和性能瓶颈。此外,通过对统计数据的分析,我们可以更好地了解爬虫的运行情况,为后续的数据处理和分析提供基础。

因此,本论文旨在深入研究Scrapy框架中的统计收集器类,并探讨它们的应用和效果。通过对StatsCollector、MemoryStatsCollector和DummyStatsCollector等类的分析,我们可以更好地理解它们的作用和使用方式,并为优化爬虫的性能和扩展性提供有力的工具和思路。


正文:

1. Scrapy统计收集器类概述

        Scrapy统计收集器类是Scrapy框架中用于收集和记录爬虫运行统计信息的关键组件。它们的主要目的是帮助开发人员了解爬虫的性能、错误情况和运行状态,以便进行监控、调试和优化。

1.1 StatsCollector类

        StatsCollector类是Scrapy中最基础和通用的统计收集器类。它负责收集和记录爬虫的统计数据,并提供了一系列方法来获取、设置和增加统计值。StatsCollector类的构造函数接受一个crawler参数,用于关联该统计收集器与特定的爬虫实例

源码解析:

class StatsCollector:def __init__(self, crawler: "Crawler"):"""统计收集器的初始化方法Args:crawler (Crawler): Crawler对象,用于获取配置信息"""self._dump: bool = crawler.settings.getbool("STATS_DUMP")self._stats: StatsT = {}def get_value(self, key: str, default: Any = None, spider: Optional[Spider] = None) -> Any:"""获取指定键的统计数据值Args:key (str): 统计数据的键default (Any, optional): 默认值,如果键不存在则返回默认值spider (Optional[Spider], optional): Spider对象Returns:Any: 统计数据的值"""return self._stats.get(key, default)def get_stats(self, spider: Optional[Spider] = None) -> StatsT:"""获取所有统计数据Args:spider (Optional[Spider], optional): Spider对象Returns:StatsT: 所有统计数据的字典"""return self._statsdef set_value(self, key: str, value: Any, spider: Optional[Spider] = None) -> None:"""设置指定键的统计数据值Args:key (str): 统计数据的键value (Any): 统计数据的值spider (Optional[Spider], optional): Spider对象"""self._stats[key] = valuedef set_stats(self, stats: StatsT, spider: Optional[Spider] = None) -> None:"""设置所有统计数据Args:stats (StatsT): 所有统计数据的字典spider (Optional[Spider], optional): Spider对象"""self._stats = statsdef inc_value(self, key: str, count: int = 1, start: int = 0, spider: Optional[Spider] = None) -> None:"""增加指定键的统计数据值Args:key (str): 统计数据的键count (int, optional): 增加的数量,默认为1start (int, optional): 初始值,默认为0spider (Optional[Spider], optional): Spider对象"""d = self._statsd[key] = d.setdefault(key, start) + countdef max_value(self, key: str, value: Any, spider: Optional[Spider] = None) -> None:"""更新指定键的统计数据为较大的值Args:key (str): 统计数据的键value (Any): 待比较的值spider (Optional[Spider], optional): Spider对象"""self._stats[key] = max(self._stats.setdefault(key, value), value)def min_value(self, key: str, value: Any, spider: Optional[Spider] = None) -> None:"""更新指定键的统计数据为较小的值Args:key (str): 统计数据的键value (Any): 待比较的值spider (Optional[Spider], optional): Spider对象"""self._stats[key] = min(self._stats.setdefault(key, value), value)def clear_stats(self, spider: Optional[Spider] = None) -> None:"""清除所有统计数据Args:spider (Optional[Spider], optional): Spider对象"""self._stats.clear()def open_spider(self, spider: Spider) -> None:"""开启Spider时的操作,此处为空Args:spider (Spider): Spider对象"""passdef close_spider(self, spider: Spider, reason: str) -> None:"""关闭Spider时的操作Args:spider (Spider): Spider对象reason (str): 关闭Spider的原因"""if self._dump:logger.info("Dumping Scrapy stats:\n" + pprint.pformat(self._stats),extra={"spider": spider},)self._persist_stats(self._stats, spider)def _persist_stats(self, stats: StatsT, spider: Spider) -> None:"""持久化统计数据的操作,此处为空Args:stats (StatsT): 所有统计数据的字典spider (Spider): Spider对象"""pass

1.1.2 StatsCollector类的主要功能包括:
  1. 统计请求的数量、响应的数量、处理时间等常用指标。
  2. 提供方法来设置和获取自定义的统计值,例如自定义的错误计数。
  3. 根据请求的URL和HTTP状态码等进行统计分类。
  4. 支持统计数据的持久化存储,可以将统计结果保存到大多数常见的输出格式中,如JSON、CSV等。

StatsCollector类在Scrapy框架的网络爬虫中被广泛使用。通过分析和解释所收集的统计信息,开发人员可以快速了解爬虫的行为和性能,并采取适当的调整措施以提高爬虫的效率和可靠性。

1.1.3 案例演示
from scrapy.statscollectors import StatsCollector# 创建统计收集器对象
statscollector = StatsCollector()# 设置自定义统计值
statscollector.set_value('custom_value', 100)# 增加统计值
statscollector.inc_value('requests_count')# 获取统计值
requests_count = statscollector.get_value('requests_count')# 输出统计结果
statscollector.print_stats()

1.2 MemoryStatsCollector类

        MemoryStatsCollector类是StatsCollector类的子类,提供了更强大和高级的统计功能。除了继承StatsCollector类的基本功能外,MemoryStatsCollector类还引入了一些新的属性和方法,以便于爬虫的性能监控和统计信息的可视化。

源码解析:

class MemoryStatsCollector(StatsCollector):def __init__(self, crawler: "Crawler"):super().__init__(crawler)self.spider_stats: Dict[str, StatsT] = {}def _persist_stats(self, stats: StatsT, spider: Spider) -> None:# 将Spider的统计数据存储到spider_stats字典中self.spider_stats[spider.name] = stats
1.2.1MemoryStatsCollector类的主要特点

包括:

  • 统计每个爬虫实例的信息,包括爬取的页面数量、处理的item数量、处理速度等。
  • 支持在内存中保留最近N个response和item的信息,方便后续进行分析和查找。
  • 支持统计数据的持久化存储,可以将统计结果保存到数据库或其他存储介质中。

MemoryStatsCollector类适用于需要更深入了解爬虫性能和行为的场景。例如,当需要分析爬虫的响应速度随时间变化的趋势,或者当需要对爬虫进行实时监控时,可以使用MemoryStatsCollector类来处理和展示统计数据。

1.2.2 案例演示
from scrapy.statscollectors import MemoryStatsCollector
from scrapy.http import Request, Response
from scrapy.spiders import Spider# 创建统计收集器对象
statscollector = MemoryStatsCollector()# 创建爬虫实例
spider = Spider('example')# 模拟爬虫处理Request和Response
request = Request('http://example.com')
response = Response('http://example.com', body='Example HTML')# 收集并记录Request和Response的统计信息
statscollector.spider_opened(spider)
statscollector.request_received(request, spider)
statscollector.response_received(response, request, spider)# 设置自定义统计值
statscollector.set_value('custom_value', 100)# 增加统计值
statscollector.inc_value('items_scraped_count')# 获取统计值
items_scraped_count = statscollector.get_value('items_scraped_count')# 输出统计结果
statscollector.print_stats()

1.3 DummyStatsCollector类

DummyStatsCollector类是一个用于临时替代StatsCollector类的伪造(dummy)类。它的功能和特性与StatsCollector类非常相似,主要用于测试和调试目的。DummyStatsCollector类实现了StatsCollector类的所有方法和属性,但不进行实际的统计数据收集和记录。

1.3.1 DummyStatsCollector类的主要用途

 包括:
        在爬虫的单元测试中,用于替代StatsCollector类,以避免测试过程中产生不必要的统计数据。
        在开发调试阶段,可以暂时使用DummyStatsCollector类来验证爬虫的逻辑,而无需实际收集和分析统计信息。


1.3.2 案例演示:
from scrapy.statscollectors import DummyStatsCollector# 创建伪造的统计收集器对象
statscollector = DummyStatsCollector()# 设置自定义统计值
statscollector.set_value('custom_value', 100)# 增加统计值
statscollector.inc_value('requests_count')# 获取统计值
requests_count = statscollector.get_value('requests_count')# 输出统计结果
statscollector.print_stats()

总结: 

  1. StatsCollector是Scrapy统计收集器的基础类,提供了一般的统计功能。
  2. MemoryStatsCollector是StatsCollector类的子类,具有额外的高级统计功能和信息保留能力。
  3. DummyStatsCollector是一个伪造的统计收集器类,用于测试和调试目的。
  4. 这三个类之间的主要区别在于功能和用途的不同,StatsCollector是基础,MemoryStatsCollector是增强版,DummyStatsCollector是伪造占位。

​​​​​​​

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

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

相关文章

Django创建多app应用

目录 1. 引言 2. 多app创建的两种方式 2.1 多个app结构 2.2 单个apps多个app 3. 最后 1. 引言 在平常业务开发中,我们遇到的功能可能会有很多,单个app的应用可能无法满足我们 这个时候,我们就需要多app应用,例如&#xff1a…

linux 组建raid5详细操作

raid5最多运行损坏一个盘,最少3个盘,容量为少一块硬盘的容量之和。 如果硬盘数量较多,比如8块以上,建议用raid6,raid6最多允许两块硬盘损坏。 如果需要 一、安装raid软件 deb包 apt-get install mdadm或dnf包 dnf …

LeetCode-49. 字母异位词分组【数组 哈希表 字符串 排序】

LeetCode-49. 字母异位词分组【数组 哈希表 字符串 排序】 题目描述:解题思路一:哈希表和排序,这里最关键的点是,乱序单词的排序结果必然是一样的(从而构成哈希表的key)。解题思路二:解题思路三…

ElasticSearch学习篇11_ANNS之基于图的NSW、HNSW算法

前言 往期博客ElasticSearch学习篇9_文本相似度计算方法现状以及基于改进的 Jaccard 算法代码实现与效果测评_elasticsearch 文字相似度实现方法-CSDN博客 根据论文对文本相似搜索现状做了一个简要总结,然后对论文提到的改进杰卡德算法做了实现,并结合业…

异步实现的一些方式

异步实现的一些方式 事件循环实现回调函数实现 其实主要就是用到std::future和std::async这些&#xff0c;记录一下异步耗时操作是否结束 事件循环实现 其实主要就是这一行代码 std::future<int> fut std::async(std::launch::async, async_operation);#include<i…

探讨Spring Boot的自动配置原理

Spring Boot以其简化Spring应用开发和部署的能力而广受欢迎。其中最引人注目的特性之一就是自动配置&#xff0c;它极大地减少了开发者需要手动编写的配置量。在本篇博客中&#xff0c;我们将深入探讨Spring Boot自动配置的工作原理&#xff0c;以及它是如何使得Spring应用的配…

蓝桥备赛——堆队列

AC code import os import sys import heapq a [] b [] n,k map(int,input().split())for _ in range(n):x,y map(int,input().split())a.append(x)b.append(y) q []# 第一种情况&#xff1a;不打第n个怪兽# 将前n-1个第一次所需能量加入堆 for i in range(n-1):heapq.h…

用xshell或ftp连接本地虚拟机linux系统,centos7修改动态ip地址

如果不知道怎么下载vm本地虚拟机软件或者不知道怎么安装可以参考我上一篇博客 vmWare虚拟机下载安装详细教程,手把手一步一步教学-CSDN博客 安装好虚拟机软件我们想要通过xshell和ftp工具来管理,小黑框不太舒服哈哈哈 一.准备工作 输入命令来查看当前的ip地址 ip addr 可以…

HarmonyOS 应用开发之PageAbility的启动模式

启动模式对应PageAbility被启动时的行为&#xff0c;支持单实例模式、多实例模式两种启动模式。 表1 PageAbility的启动模式 应用开发者可在config.json配置文件中通过“launchType”配置启动模式。示例如下&#xff1a; {"module": {..."abilities": [{…

上位机图像处理和嵌入式模块部署(qmacvisual透视变换)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 说到透视变换&#xff0c;以前我也不明白为什么有这样一个需求。后来在tier1做车道线检测的时候&#xff0c;才知道如果把camera拍摄到的图像做一次…

Delphi模式编程

文章目录 Delphi模式编程涉及以下几个关键方面&#xff1a;**设计模式的应用****Delphi特性的利用****实际开发中的实践** Delphi模式编程的实例 Delphi模式编程是指在使用Delphi这一集成开发环境&#xff08;IDE&#xff09;和Object Pascal语言进行软件开发时&#xff0c;采用…

PHP运行的注意事项和基本语法规范

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

JavaSE day15 笔记

第十五天课堂笔记 数组 可变长参数★★★ 方法 : 返回值类型 方法名(参数类型 参数名 , 参数类型 … 可变长参数名){}方法体 : 变长参数 相当于一个数组一个数组最多只能有一个可变长参数, 并放到列表的最后parameter : 方法参数 数组相关算法★★ 冒泡排序 由小到大: 从前…

Linux网络配置(超详细)

Linux网络配置大全 Linux网络配置一.网络地址配置网络地址查看–ifconfig使用网络配置命令设置网络接口参数-ifconfig禁用(临时)或者重新激活网卡设置虚拟网络接口 修改网络配置文件网络接口配置文件 IP命令详解OPTIONS选项OBJECT对象 ip link 二、获取和修改主机名hostname查看…

java电话号码的字母组合(力扣Leetcode17)

电话号码的字母组合 力扣原题链接 问题描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 示例 1&#xff1a;…

Java 数据结构篇-深入了解排序算法

概述 排序算法是计算机科学中的基本问题&#xff0c;也是数据结构学习的重要部分。在Java中&#xff0c;我们可以使用各种排序算法来排列数组或列表中的元素。以下是几个常见的排序算法及其基本思想的介绍&#xff1a; 排序算法介绍 1. 冒泡排序&#xff08;Bubble Sort&…

Java查找算法知识点(含面试大厂题和源码)

查找算法是计算机科学中的基础概念&#xff0c;它们在解决实际问题时扮演着关键角色。了解和掌握不同的查找算法&#xff0c;能够帮助我们更高效地处理数据检索任务。以下是一些关于查找算法的关键知识点&#xff1a; 算法分类&#xff1a; 线性查找算法&#xff1a;按照顺序逐…

谷粒商城实战(007 压力测试)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第141p-第p150的内容 简介 安装jmeter 安装jmeter 使用中文 这样写就是200个线程循环100次 一共是2万个请求 介绍线程组 添加请求 可以是htt…

计算机视觉的应用26-关于Fast-R-CNN模型的应用场景,Fast-R-CNN模型结构介绍

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用26-关于Fast-R-CNN模型的应用场景&#xff0c;Fast-R-CNN模型结构介绍。Fast R-CNN是一种深度学习模型&#xff0c;主要用于目标检测任务&#xff0c;尤其适用于图像中物体的识别与定位。该模型在基…

【JVM】JVM类加载过程

文章目录 &#x1f334;类加载过程&#x1f338;加载&#x1f338;加载&#x1f338;验证&#x1f338;准备&#x1f338;解析&#x1f338;初始化 &#x1f332;双亲委派模型&#x1f338;什么是双亲委派模型&#xff1f;&#x1f338;双亲委派模型的优点 ⭕总结 &#x1f334…