所以Scrapinghub发布了一个新的功能来保证Scrapy的质量。它说它有历史比较功能,可以检测到当前的刮伤数量是否只有上一次刮伤的50%以下,这是可疑的。但是,我该如何应用它呢?
gc0ot86w1#
Spidermon1.10版引入了一个新的统计信息收集器,它可以在.scrapy目录中保存上次作业执行的统计信息(https://spidermon.readthedocs.io/en/latest/stats-collection.html)。所以每次执行spider时,您将在Spider示例中提供一个stats_history属性,该属性包含之前执行的作业的所有统计信息列表。不要再像Luiz在他的回答中建议的那样手动处理你的统计数据的存储了(但是原理基本上是相同的)。有了这些信息,你就可以创建自己的监视器来处理这些统计数据,计算项目的平均值,并将它们与你最近的执行进行比较(或者你可以根据需要使用统计数据)。你可以在前面提到的文档中看到类似的监视器示例。
.scrapy
stats_history
vltsax252#
要比较当前刮出的物品与以前的运行,你首先需要存储的统计数据,以前的运行某处。以Github上的Spidermon example project文件为例,特别是monitors.py文件,它定义了两个监视器,ItemCountMonitor和ItemValidationMonitor,前者检查spider是否抓取了少于1000个项目,如果是,它将在Slack上发送一条消息;后者检查项目模式是否被正确验证,如果不是,它也将在Slack上发送一条消息。现在来回答你的问题。如果你想检测当前抓取是否比上一次抓取少提取了50%的项目,你应该在某个地方存储scape的统计信息,甚至存储抓取的项目,假设你将抓取的项目存储在目录/home/user/scraped_items/%(date)s.json中,其中%(date)s是蜘蛛运行的日期(例如:2019-01-01)。为了简化,假设您每天运行蜘蛛,每天有一个文件。然后,您可以编写如下的监视器:
monitors.py
ItemCountMonitor
ItemValidationMonitor
/home/user/scraped_items/%(date)s.json
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" )
2条答案
按热度按时间gc0ot86w1#
Spidermon1.10版引入了一个新的统计信息收集器,它可以在
.scrapy
目录中保存上次作业执行的统计信息(https://spidermon.readthedocs.io/en/latest/stats-collection.html)。所以每次执行spider时,您将在Spider示例中提供一个stats_history
属性,该属性包含之前执行的作业的所有统计信息列表。不要再像Luiz在他的回答中建议的那样手动处理你的统计数据的存储了(但是原理基本上是相同的)。有了这些信息,你就可以创建自己的监视器来处理这些统计数据,计算项目的平均值,并将它们与你最近的执行进行比较(或者你可以根据需要使用统计数据)。你可以在前面提到的文档中看到类似的监视器示例。
vltsax252#
要比较当前刮出的物品与以前的运行,你首先需要存储的统计数据,以前的运行某处。
以Github上的Spidermon example project文件为例,特别是
monitors.py
文件,它定义了两个监视器,ItemCountMonitor
和ItemValidationMonitor
,前者检查spider是否抓取了少于1000个项目,如果是,它将在Slack上发送一条消息;后者检查项目模式是否被正确验证,如果不是,它也将在Slack上发送一条消息。现在来回答你的问题。
如果你想检测当前抓取是否比上一次抓取少提取了50%的项目,你应该在某个地方存储scape的统计信息,甚至存储抓取的项目,假设你将抓取的项目存储在目录
/home/user/scraped_items/%(date)s.json
中,其中%(date)s是蜘蛛运行的日期(例如:2019-01-01)。为了简化,假设您每天运行蜘蛛,每天有一个文件。然后,您可以编写如下的监视器: