爬虫工作量由小到大的思维转变---<第六十二章 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._stats

    def 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] = value

    def set_stats(self, stats: StatsT, spider: Optional[Spider] = None) -> None:
        """
        设置所有统计数据

        Args:
            stats (StatsT): 所有统计数据的字典
            spider (Optional[Spider], optional): Spider对象

        """
        self._stats = stats

    def inc_value(
        self, key: str, count: int = 1, start: int = 0, spider: Optional[Spider] = None
    ) -> None:
        """
        增加指定键的统计数据值

        Args:
            key (str): 统计数据的键
            count (int, optional): 增加的数量,默认为1
            start (int, optional): 初始值,默认为0
            spider (Optional[Spider], optional): Spider对象

        """
        d = self._stats
        d[key] = d.setdefault(key, start) + count

    def 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对象

        """
        pass

    def 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.mfbz.cn/a/498032.html

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

相关文章

Oracle存数字精度问题number、binary_double、binary_float类型

--表1 score是number(10,5)类型 create table TEST1 (score number(10,5) ); --表2 score是binary_double类型 create table TEST2 (score binary_double ); --表3 score是binary_float类型 create table TEST3 (score binary_float );实验一:分别往三张表插入 小数…

Redis开源协议变更!Garnet:微软开源代替方案?

Garnet:微软开源的高性能替代方案,秉承兼容 RESP 协议的同时,以卓越性能和无缝迁移能力重新定义分布式缓存存储! - 精选真开源,释放新价值。 概览 最近,Redis修改了开源协议,从BSD变成了 SSPLv…

青龙脚本 猫猫看看

话不多说开图 https://raw.githubusercontent.com/Huansheng1/my-qinglong-js/main/%E7%8C%AB%E7%8C%AB%E7%9C%8B%E7%9C%8B.py

探索Python人工智能在气象监测中的创新应用

Python是功能强大、免费、开源,实现面向对象的编程语言,在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能,这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…

Jupyter安装教程(Windows 版)

这几年AI人工智能这么火,陆陆续续诞生了很多新的产品,新的商业模式,随着Open-sora 1.0开源之后,让我更加地相信GPT5也即将要到来了,看来不学机器学习和深度学习,恐怕是要跟不上时代了。于是就想着今年开始接…

【管理咨询宝藏59】某大型汽车物流战略咨询报告

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏59】某大型汽车物流战略咨询报告 【格式】PDF 【关键词】HR调研、商业分析、管理咨询 【核心观点】 - 重新评估和调整商业模式,开拓…

智能设备配网保姆级教程

设备配网 简单来说,配网就是将物联网(IoT)设备连接并注册到云端,使其拥有与云端远程通信的能力。配网后,智能设备才能被手机应用或者项目管理后台控制,依托于智能场景创造价值。本文介绍了配网的相关知识&…

【分享】CMMI V3.0版本做了哪些改变?哪些企业适合申请CMMI3.0

​ CMM是由美国卡内基梅隆大学软件工程研究所1987年开发成功的,它基于过去所有软件工程过程改进的成果,吸取了以往软件工程的经验教训,提供了一个基于过程改进的框架;CMMI(Capability Maturity Model Integration能力成熟度模型集…

代码随想录算法训练营第三十六天|435. 无重叠区间,763. 划分字母区间

435. 无重叠区间 题目 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 示例 1: 输入: intervals [[1,2],[2,3],[3,4],[1,3]] 输出: 1 解释: 移除 [1,3] 后,剩下…

文献学习(自备)

收官大作,多组学融合的新套路发NC!! - 知乎 (zhihu.com) Hofbauer cell function in the term placenta associates with adult cardiovascular and depressive outcomes | Nature Communications 病理性胎盘炎症会增加几种成人疾病的风险&a…

Linux——信号的保存与处理

目录 前言 一、信号的常见概念 1.信号递达 2.信号未决 3.信号阻塞 二、Linux中的递达未决阻塞 三、信号集 四、信号集的处理 1.sig相关函数 2.sigprocmask()函数 3.sigpending()函数 五、信号的处理时机 六、信号处理函数 前言 在之前,我们学习了信号…

Codeforces Round 937 (Div. 4) A - F 题解

A. Stair, Peak, or Neither? 题解&#xff1a;直接比较输出即可。 代码&#xff1a; #include<bits/stdc.h> using namespace std ; typedef long long ll ; const int maxn 2e5 7 ; const int mod 1e9 7 ; inline ll read() {ll x 0, f 1 ;char c getchar()…

IntelliJ IDEA中遇到的“cannot access java.lang.String“错误及其解决方案(day8)

intelliJ 今天遇到使用intelliJ遇到了一个新错误&#xff0c;有问题就解决问题是一个程序员最基本的修养&#xff0c;如下&#xff1a; 在上面的代码中&#xff0c;我使用了this.这个关键字&#xff0c;发现出现了以上问题&#xff0c;找了一些资料&#xff0c;不是很明白&am…

Untiy 布局控制器Aspect Ratio Fitter

Aspect Ratio Fitter是Unity中的一种布局控制器组件&#xff0c;用于根据指定的宽高比来调整包含它的UI元素的大小。实际开发中&#xff0c;它可以确保UI元素保持特定的宽高比&#xff0c;无论UI元素的内容或父容器的大小如何变化。 如图为Aspect Ratio Fitter组件的基本属性&…

阿里云服务器价格表(2024年最新阿里云服务器租用优惠价格表)

2024年阿里云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网aliyunfuwuqi.com整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新…

为什么我的微信小程序 窗口背景色backgroundColor设置参数 无效的问题处理记录!

当我们在微信小程序 json 中设置 backgroundColor 时&#xff0c;实际在电脑的模拟器中根本看不到效果。 这是因为 backgroundColor 指的窗体背景颜色&#xff0c;而不是页面的背景颜色&#xff0c;即窗体下拉刷新或上拉加载时露出的背景。在电脑的模拟器中是看不到这个动作的…

目标检测的相关模型图:YOLO系列和RCNN系列

目标检测的相关模型图&#xff1a;YOLO系列和RCNN系列 前言YOLO系列的图展示YOLOpassthroughYOLO2YOLO3YOLO4YOLO5 RCNN系列的图展示有关目标检测发展的 前言 最近好像大家也都在写毕业论文&#xff0c;前段时间跟朋友聊天&#xff0c;突然想起自己之前写画了一些关于YOLO、Fa…

Windows系统搭建Oracle结合内网穿透实现公网访问本地数据库

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

八大技术趋势案例(云计算大数据)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

瑞_Java所有相关环境及软件的安装和卸载_图文超详细(持续更新)

文章目录 JDK1.8资源各种可能的坑Windows环境卸载安装 &#x1f64a; 前言&#xff1a;本文是博主所了解的Java知识所有相关的环境或软件的安装和卸载&#xff08;会持续更新&#xff09; 更新日志 2024-03-28➡️JDK1.8的安装、卸载&#xff08;Windows环境&#xff09; JDK1…