Как сделать Scrapy историческое сравнение результатов с помощью Spidermon - PullRequest
1 голос
/ 18 марта 2019

Итак, Scrapinghub выпускает новую функцию страхования качества Scrapy. Он говорит, что у него есть исторические особенности сравнения, где он может обнаружить, если текущее количество отходов меньше 50% от предыдущего, что является подозрительным. Но как я могу это применить?

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Чтобы сравнить текущие извлеченные элементы с предыдущим прогоном, сначала нужно где-то сохранить статистику предыдущего прогона.

Взять пример проекта 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"
        )
0 голосов
/ 09 июля 2019

В Spidermon версии 1.10 появился новый сборщик статистики, который хранит в вашем каталоге .scrapy статистику ваших последних выполнений заданий (https://spidermon.readthedocs.io/en/latest/stats-collection.html). Так что каждый раз, когда вы запускаете своего паука, у вас будет в наличии stats_historyСвойство в вашем экземпляре Spider, содержащее список всех предыдущих статистик ваших заданий, которые были выполнены ранее. Вам не нужно обрабатывать хранение вашей статистики вручную, как Луис предложил в своем ответе больше (но принцип в основном тот же).

Имея эту информацию, вы можете создать свои собственные мониторы, которые будут обрабатывать статистику этих тезисов и вычислять среднее значение отобранных элементов и сравнивать их, например, с вашим последним выполнением (или вы можете использовать статистику по своему усмотрению).посмотрите пример такого монитора в упомянутых ранее документах.

...