Не удается получить статистику Scrapy от scrapy.CrawlerProcess - PullRequest
0 голосов
/ 09 ноября 2018

Я запускаю scrapy spiders из другого скрипта, и мне нужно получить и сохранить переменную статистику из Crawler. Я изучил документы и другие вопросы StackOverflow, но мне не удалось решить эту проблему.

Это мой скрипт, из которого я запускаю сканирование:

import scrapy
from scrapy.crawler import CrawlerProcess


process = CrawlerProcess({})
process.crawl(spiders.MySpider)
process.start()

stats = CrawlerProcess.stats.getstats() # I need something like this

Я бы хотел, чтобы статистика содержала этот фрагмент данных (scrapy.statscollectors):

     {'downloader/request_bytes': 44216,
     'downloader/request_count': 36,
     'downloader/request_method_count/GET': 36,
     'downloader/response_bytes': 1061929,
     'downloader/response_count': 36,
     'downloader/response_status_count/200': 36,
     'finish_reason': 'finished',
     'finish_time': datetime.datetime(2018, 11, 9, 16, 31, 2, 382546),
     'log_count/DEBUG': 37,
     'log_count/ERROR': 35,
     'log_count/INFO': 9,
     'memusage/max': 62623744,
     'memusage/startup': 62623744,
     'request_depth_max': 1,
     'response_received_count': 36,
     'scheduler/dequeued': 36,
     'scheduler/dequeued/memory': 36,
     'scheduler/enqueued': 36,
     'scheduler/enqueued/memory': 36,
     'start_time': datetime.datetime(2018, 11, 9, 16, 30, 38, 140469)}

Я проверил CrawlerProcess, который возвращает отложенный и удаляет сканеры из поля «сканеры» после завершения процесса очистки.

Есть ли способ решить эту проблему?

Best, Питер

1 Ответ

0 голосов
/ 10 ноября 2018

Согласно документации , CrawlerProcess.crawl принимает либо сканер, либо класс паука, и вы можете создать сканер из класса паука с помощью CrawlerProcess.create_crawler.

Таким образом, вы можете создать экземпляр сканера перед запуском процесса сканирования и получить ожидаемые атрибуты после этого.

Ниже приведен пример, отредактировавший несколько строк исходного кода:

import scrapy
from scrapy.crawler import CrawlerProcess


class TestSpider(scrapy.Spider):
    name = 'test'
    start_urls = ['http://httpbin.org/get']

    def parse(self, response):
        self.crawler.stats.inc_value('foo')


process = CrawlerProcess({})
crawler = process.create_crawler(TestSpider)
process.crawl(crawler)
process.start()


stats_obj = crawler.stats
stats_dict = crawler.stats.get_stats()
# perform the actions you want with the stats object or dict
...