【发布时间】:2019-03-18 12:25:47
【问题描述】:
所以 Scrapinghub 正在发布 Scrapy 质量保险的新功能。它说它具有历史比较功能,可以检测当前的刮擦量是否仅低于前一次刮擦的 50%,这是可疑的。但是,我该如何应用呢?
【问题讨论】:
标签: python web-scraping scrapy qa spidermon
所以 Scrapinghub 正在发布 Scrapy 质量保险的新功能。它说它具有历史比较功能,可以检测当前的刮擦量是否仅低于前一次刮擦的 50%,这是可疑的。但是,我该如何应用呢?
【问题讨论】:
标签: python web-scraping scrapy qa spidermon
Spidermon 1.10 版引入了一个新的统计信息收集器,它可以在您的 .scrapy 目录中保存您上次执行作业的统计信息 (https://spidermon.readthedocs.io/en/latest/stats-collection.html)。因此,每次执行蜘蛛时,您的 Spider 实例中都会有一个可用的 stats_history 属性,其中包含之前执行的作业的所有先前统计信息的列表。您不再需要像 Luiz 在他的回答中建议的那样手动处理统计数据的存储(但原理基本相同)。
有了这些信息,您可以创建自己的监视器来处理这些统计数据并计算抓取的项目的平均值,并将它们与您最近的执行情况进行比较(或者您可以根据需要使用统计数据)。您可以在前面提到的文档中看到类似监视器的示例。
要将当前抓取的项目与上一次运行进行比较,您首先需要将上一次运行的统计信息存储在某处。
获取 Github 上的 Spidermon example project,特别是 monitors.py 文件。
它定义了两个监视器,ItemCountMonitor 和 ItemValidationMonitor,前者检查蜘蛛抓取的项目是否少于 1000 个,如果是,它将检查 send a message on Slack。后者检查项目模式是否被正确验证,如果没有,它也会在 Slack 上发送消息。
现在回答你的问题。
如果您想检测当前抓取是否比前一次抓取少 50% 的项目,您应该将 scape 统计信息存储在某个位置,甚至存储抓取的项目,假设您将抓取的项目存储在目录 /home/user/scraped_items/%(date)s.json ,其中 %(date)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"
)
【讨论】: