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

问题描述 投票:1回答:1

所以Scrapinghub正在发布Scrapy质量保险的新功能。它说它具有历史比较功能,它可以检测当前的刮擦量是否仅低于之前刮痕的50%,这是可疑的。但是,我该如何应用呢?

python web-scraping scrapy qa spidermon
1个回答
1
投票

要将当前已删除的项目与之前的运行进行比较,首先需要在某处存储上一次运行的统计信息。

在Github上使用Spidermon example project,特别是monitors.py文件。它有两个监视器定义,ItemCountMonitorItemValidationMonitor,前者检查蜘蛛是否报废少于1000项,如果是这样,它将send a message on Slack。后者检查是否正确验证了项目架构,如果没有,它也会在Slack上发送消息。

所以现在问你的问题。

如果你想检测当前刮除的物品是否比前一次刮掉的物品多50%,你应该将scape统计数据保存在某个地方,甚至存储被刮掉的物品,假设你把刮下的物品存放在目录/home/user/scraped_items/%(date)s.json上,其中%(日期) )s是蜘蛛跑的日期(例如:2019-01-01)。为了简化,假设您每天都运行蜘蛛,每天只有一个文件。

然后你可以像这样写一个监视器:

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"
        )

0
投票

Spidermon 1.10版引入了一个新的统计数据收集器,它在你的.scrapy目录中保存了你上一次执行作业的统计数据(https://spidermon.readthedocs.io/en/latest/stats-collection.html)。因此,每次执行蜘蛛时,您的Spider实例中都会有一个stats_history属性,其中包含之前执行过的所有以前作业统计信息的列表。你不需要像Luiz在他的回答中建议的那样手动处理你的统计数据的存储(但原理基本相同)。

拥有该信息后,您可以创建自己的监视器来处理这些统计信息并计算所刮取项目的平均值,并将其与最新执行进行比较(或者您可以根据需要使用统计数据)。您可以在之前提到的文档中看到类似监视器的示例。

© www.soinside.com 2019 - 2024. All rights reserved.