Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用Spidermon进行Scrapy历史输出比较_Python_Web Scraping_Scrapy_Qa_Spidermon - Fatal编程技术网

Python 如何使用Spidermon进行Scrapy历史输出比较

Python 如何使用Spidermon进行Scrapy历史输出比较,python,web-scraping,scrapy,qa,spidermon,Python,Web Scraping,Scrapy,Qa,Spidermon,所以Scrapinghub发布了一个新的Scrapy质量保险功能。该公司表示,它具有历史比较功能,可以检测到当前的报废数量是否仅低于之前报废数量的50%,这是可疑的。但是,我如何应用它呢?要将当前刮取的项目与上一次跑步进行比较,首先需要将上一次跑步的统计信息存储在某个地方 以Github为例,特别是文件。 它定义了两个监视器,ItemCountMonitor和ItemValidationMonitor,前者检查爬行器报废的物品是否少于1000件,如果是,则检查。后者检查项目架构是否正确验证,如果

所以Scrapinghub发布了一个新的Scrapy质量保险功能。该公司表示,它具有历史比较功能,可以检测到当前的报废数量是否仅低于之前报废数量的50%,这是可疑的。但是,我如何应用它呢?

要将当前刮取的项目与上一次跑步进行比较,首先需要将上一次跑步的统计信息存储在某个地方

以Github为例,特别是文件。 它定义了两个监视器,
ItemCountMonitor
ItemValidationMonitor
,前者检查爬行器报废的物品是否少于1000件,如果是,则检查。后者检查项目架构是否正确验证,如果未正确验证,它还将在Slack上发送消息

现在来回答你的问题

如果您想检测当前的scrape提取的项目是否比以前的scrape少50%,那么您应该将scape统计信息存储在某个地方,甚至存储被刮的项目,假设您将被刮的项目存储在目录
/home/user/scraped_items/%(date)s.json
,其中%(date)s是爬行器运行的日期(例如:2019-01-01)。 为了简化,假设您每天运行spider,并且每天有一个文件

然后您可以编写这样的监视器:

import json
from datetime import datetime, timedelta

@monitors.name("Item count dropped")
class ItemCountDroppedMonitor(Monitor):
    @monitors.name("Item count dropped since previous run")
    def test_item_count_dropped(self):
        yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')
        last_day_item_path = f'/home/user/scraped_items/{yesterday}.json'
        minimum_threshold = 0.5  # 50%
        items_extracted_now = getattr(self.data.stats, "item_scraped_count", 0)
        items_extracted_last_run = json.loads(open(last_day_item_path).read())
        items_extracted_last_run = len(items_extracted_last_run)
        diff = items_extracted_last_run - items_extracted_now
        self.assertFalse(
            diff >= (items_extracted_last_run * minimum_threshold),
            msg="Extracted less items than expected"
        )

Spidermon 1.10版引入了一个新的统计数据收集器,它将上次作业执行的统计数据保存在
.scrapy
目录中()。因此,每次执行spider时,spider实例中都会有一个可用的
stats\u history
属性,其中包含以前执行过的作业的所有先前统计信息的列表。你不再需要像Luiz在回答中建议的那样手动处理统计数据的存储(但原理基本相同)


有了这些信息,您可以创建自己的监控器来处理这些统计数据,并计算刮取的项目的平均值,例如,将它们与您最近的执行情况进行比较(或者您可以根据需要使用这些统计数据)。您可以在前面提到的文档中看到这样的监视器示例。

这是可行的,但您需要自己处理stats文件。使用内置StatCollector是一个更好的解决方案。链接更新