Перенаправление Scrapy всегда 200 - PullRequest
0 голосов
/ 11 октября 2018

Я испытываю странное поведение в Scrapy.Я собираю коды состояния, звоня по номеру response.status, но не все из них присутствуют (кажется, 3xx).Я вижу в журнале следующее:

downloader/response_status_count/200: 8150
downloader/response_status_count/301: 226
downloader/response_status_count/302: 67
downloader/response_status_count/303: 1
downloader/response_status_count/307: 48
downloader/response_status_count/400: 7
downloader/response_status_count/403: 44
downloader/response_status_count/404: 238
downloader/response_status_count/405: 8
downloader/response_status_count/406: 26
downloader/response_status_count/410: 7
downloader/response_status_count/500: 12
downloader/response_status_count/502: 6
downloader/response_status_count/503: 3

, тогда как мой CSV-файл имеет только 200, 404, 403, 406, 502, 400, 405, 410, 500, 503.Я установил HTTPERROR_ALLOW_ALL=True в settings.py.Могу ли я заставить Scrapy предоставить информацию о перенаправлениях?Точно знаю, что я беру его из response.meta['redirect_times'] и response.meta['redirect_urls'], но код состояния по-прежнему 200, а не 3xx.

1 Ответ

0 голосов
/ 11 октября 2018

30X ответы никогда не дойдут до вашего обратного вызова (метод синтаксического анализа), потому что до этого они обрабатывались промежуточным программным обеспечением перенаправления.

Однако все статусы ответов уже сохранены в статистике scrapy, как вы указали самиЭто означает, что вы можете легко вставить их в свой сканер в любой точке:

  1. При обратном вызове:

    def parse(self, response):
        stats = self.crawler.stats.get_stats()
        status_stats = {
            k: v for k, v in stats.items() 
            if 'status_count' in k
        }
        # {'downloader/response_status_count/200': 1}
    
  2. В вашем конвейере (см. Документы о том, как использовать конвейеры):

    class SaveStatsPipeline:
        """Save response status stats in a stats.json file"""
    
        def close_spider(self, spider):
            """When spider closes save all status stats in a stats.json file"""
            stats = spider.crawler.stats.get_stats()
            status_stats = {
                k: v for k, v in stats.items() 
                if 'status_count' in k
            }
            with open('stats.json', 'w') as f:
                f.write(json.dumps(status_stats))
    

Везде, где у вас есть доступ к crawler объекту на самом деле!

...