Чтобы сравнить текущие извлеченные элементы с предыдущим прогоном, сначала нужно где-то сохранить статистику предыдущего прогона.
Взять пример проекта Spidermon на Github, особенно monitors.py
файл.У него есть два определенных монитора, ItemCountMonitor
и ItemValidationMonitor
, первый проверяет, не уничтожил ли паук менее 1000 предметов, если это так, он отправит сообщение на 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"
)