爬虫工作量由小到大的思维转变---<第二十四章 Scrapy的`统计数据`收集stats collection>

本文主要是介绍爬虫工作量由小到大的思维转变---<第二十四章 Scrapy的`统计数据`收集stats collection>,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

前两篇是讲的数据诊断分析,还有一篇深挖`解决内存泄漏`的文章,目前我还没整理汇编出来;但是,想到分析问题的时候,忽然觉得`爬虫的数据统计`好像也挺重要;于是,心血来潮准备来插一篇这个------让大家对日常scrapy爬的数据,做到心里有数!不必自己去搅破脑汁捣腾日志,敲计算器了;

正文:

在 Scrapy 中,可以使用 Stats Collection(统计信息收集)来收集和获取有关爬虫运行过程中的统计信息。Stats Collection 提供了各种默认的统计指标,例如请求数量、下载时间和爬取成功数等。

当然,也可以使用其他的,例如:

MemoryStatsCollector:默认的统计收集器,将统计数据存储在内存中。
CsvStatsCollector:将统计数据保存为 CSV 格式的文件。
JsonLinesStatsCollector:将统计数据保存为 JSON Lines 格式的文件。
XmlStatsCollector:将统计数据保存为 XML 格式的文件。
DbStatsCollector:将统计数据保存到数据库中。
LogStatsCollector:通过日志输出统计数据。
-----这些其实都大同小异,我们就拿第一个来开刀!!

使用 Stats Collection 的步骤:

1. 在 Scrapy 项目的配置文件 `settings.py` 中启用 Stats Collection:

   STATS_CLASS = 'scrapy.statscollectors.MemoryStatsCollector'

通过配置 `STATS_CLASS` 参数,可以选择不同的 Stats Collector。在示例中,我们使用了 `MemoryStatsCollector`,该 Collector 将统计信息存储在内存中。

2. 在 Scrapy 的爬虫代码中导入 `scrapy.stats`:

   from scrapy import stats

3. 在爬虫代码中,可以使用 `stats` 对象来访问和处理统计信息。以下是一些常用的方法:
  •    - `stats.get_value(key, default=None)`:获取指定键名的统计值。如果指定的键名不存在,则返回提供的 `default` 值(默认为 `None`)。
  •    - `stats.inc_value(key, count=1)`:增加指定键名的统计值。`count` 参数可以指定增加的数量,默认为 1。
  •    - `stats.set_value(key, value)`:设置指定键名的统计值为给定的 `value`。
  •    - `stats.get_stats()`:返回当前所有统计信息的字典形式。

使用 Stats Collection:

   from scrapy import Spiderfrom scrapy import statsclass MySpider(Spider):name = 'my_spider'start_urls = ['http://example.com']def parse(self, response):# 增加请求数量统计值self.stats.inc_value('request_count')# 获取当前请求数量的统计值request_count = self.stats.get_value('request_count', default=0)self.logger.info(f"Request Count: {request_count}")# 设置自定义统计值self.stats.set_value('custom_stat', 10)# 获取所有统计信息all_stats = self.stats.get_stats()self.logger.info(f"All Stats: {all_stats}")# ...其他处理代码...```

     在上述示例中,在解析函数中使用 `stats` 对象进行统计值的增加、获取和设置操作,以及获取所有统计信息。可以根据需要进行自定义的统计值操作,从而监控和分析爬虫的运行情况。

ps:Stats Collection 默认收集的统计信息可能会消耗一定的内存,如果需要更复杂的统计需求,可以考虑使用第三方库或自定义 Stats Collector 进行更高级的统计处理。


深入:

当需要进行更高级的统计处理时,可以自定义 Stats Collector 来满足特定的需求。自定义 Stats Collector 可以用于收集、处理和保存统计数据,以便后续分析和可视化。

以下是自定义 Stats Collector 的步骤:

1. 创建一个自定义的 Stats Collector 类,继承自 `scrapy.statscollectors.StatsCollector` 类,并重写需要的方法。

通常情况下,需要实现 `__init__()`、`open_spider()`、`close_spider()` 和 `get_value()` 方法。

 from scrapy.statscollectors import StatsCollectorclass CustomStatsCollector(StatsCollector):def __init__(self, crawler):super().__init__(crawler)# 初始化自定义的统计数据self.custom_stats = {}def open_spider(self, spider):super().open_spider(spider)# 初始化每个爬虫的自定义统计数据self.custom_stats[spider.name] = {}def close_spider(self, spider, reason):super().close_spider(spider, reason)# 在爬虫结束时处理自定义统计数据custom_stats_data = self.custom_stats[spider.name]# 进行进一步的处理或保存操作def get_value(self, key, default=None, spider=None):# 获取自定义统计数据的值if spider:return self.custom_stats[spider.name].get(key, default)return default


  

2. 在 Scrapy 项目的配置文件 `settings.py` 中配置自定义的 Stats Collector 类:

   STATS_CLASS = 'your_project_name.custom_stats.CustomStatsCollector'

  ps:`your_project_name` 需要替换为 Scrapy 项目的名称,以及其他必要的导入路径。

3. 使用自定义的 Stats Collector

   在 Spider 类中,通过 `self.crawler.stats` 访问自定义的 Stats Collector 对象,并使用相应的方法进行统计值的获取、增加和设置。

   from scrapy import Spiderclass MySpider(Spider):name = 'my_spider'start_urls = ['http://example.com']def parse(self, response):# 增加自定义统计值self.crawler.stats.inc_value('custom_stat', spider=self)# 获取自定义统计值custom_stat_value = self.crawler.stats.get_value('custom_stat', default=0, spider=self)self.logger.info(f"Custom Stat Value: {custom_stat_value}")# 设置自定义统计值self.crawler.stats.set_value('custom_stat', 10, spider=self)# ...其他处理代码...


   创建一个自定义的 Stats Collector 类 `CustomStatsCollector`,并在 `open_spider()` 和 `close_spider()` 方法中进行自定义统计数据的初始化和处理。在 Spider 类中,使用 `self.crawler.stats` 访问自定义的 Stats Collector 对象,并用相应的方法进行自定义统计值的增加、获取和设置。

也可以根据具体需求在自定义 Stats Collector 类中添加其他统计方法和处理逻辑,并使用自定义统计数据进行进一步的分析和处理。

另一个案例:

统计每个爬虫访问 URL 的数量,并在爬虫结束时将统计数据保存到文件中。

import json
from scrapy.statscollectors import StatsCollectorclass CustomStatsCollector(StatsCollector):def __init__(self, crawler):super().__init__(crawler)# 初始化自定义统计数据self.custom_stats = {}def open_spider(self, spider):super().open_spider(spider)# 初始化每个爬虫的自定义统计数据self.custom_stats[spider.name] = {'url_count': 0}def close_spider(self, spider, reason):super().close_spider(spider, reason)# 在爬虫结束时处理自定义统计数据custom_stats_data = self.custom_stats[spider.name]# 保存自定义统计数据到文件with open(f'{spider.name}_stats.json', 'w') as file:json.dump(custom_stats_data, file)def inc_url_count(self, spider):# 增加 URL 数量统计值self.custom_stats[spider.name]['url_count'] += 1def get_url_count(self, spider):# 获取 URL 数量统计值return self.custom_stats[spider.name]['url_count']

在 Spider 类中,我们可以调用自定义 Stats Collector 的 `inc_url_count()` 方法来增加 URL 数量的统计值,并使用 `get_url_count()` 方法获取统计值。

from scrapy import Spiderclass MySpider(Spider):name = 'my_spider'start_urls = ['http://example.com']def parse(self, response):# 增加 URL 数量统计值self.crawler.stats.inc_url_count(self)# 获取 URL 数量统计值url_count = self.crawler.stats.get_url_count(self)self.logger.info(f"URL Count: {url_count}")# ...其他处理代码...


在这个案例中,我们定义了 `CustomStatsCollector` 类,用于统计每个爬虫访问的 URL 数量。使用 `inc_url_count()` 方法增加统计值,并使用 `get_url_count()` 方法获取统计结果。在爬虫结束时,自定义统计数据将被保存到以爬虫名为前缀的 JSON 文件中。

(可自行在此框架上修改,自己需要的业务逻辑)


这篇关于爬虫工作量由小到大的思维转变---<第二十四章 Scrapy的`统计数据`收集stats collection>的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/532228

相关文章

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

理解java虚拟机内存收集

学习《深入理解Java虚拟机》时个人的理解笔记 1、为什么要去了解垃圾收集和内存回收技术? 当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节。 2、“哲学三问”内存收集 what?when?how? 那些内存需要回收?什么时候回收?如何回收? 这是一个整体的问题,确定了什么状态的内存可以

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

浅谈PHP5中垃圾回收算法(Garbage Collection)的演化

前言 PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection)。现在如果去PHP官方网站(php.net)可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.3版本对5.2并不是完

Golang 网络爬虫框架gocolly/colly(五)

gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种: 一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高; 二,利用正则表达式,要提取的数据往往有明显的特征,所以正则表达式写起来比较简单,不必非常严谨; 三,使

Golang网络爬虫框架gocolly/colly(四)

爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟。回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫,那时由于项目需要,要访问各大国际社交网站,Facebook,myspace,filcker,youtube等等,国际上叫得上名字的社交网站都爬过,大部分网站提供restful api,有些功能没有api,就只能用http抓包工具分析协议,自己爬;国内的优酷、

Golang网络爬虫框架gocolly/colly(三)

熟悉了《Golang 网络爬虫框架gocolly/colly 一》和《Golang 网络爬虫框架gocolly/colly 二》之后就可以在网络上爬取大部分数据了。本文接下来将爬取中证指数有限公司提供的行业市盈率。(http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio) 定义数据结构体: type Zhj