Redirect Scrapy重定向始终为200

Redirect Scrapy重定向始终为200,redirect,web-scraping,scrapy,scrapy-spider,Redirect,Web Scraping,Scrapy,Scrapy Spider,我在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 downlo

我在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文件只有
2004044034065020404040404050410510503
。我在
settings.py
中设置了
HTTPERROR\u ALLOW\u ALL=True
。我可以强制Scrapy提供有关重定向的信息吗?没错,我是从
response.meta['redirect\u times']
response.meta['redirect\u url']
中获取的,但是状态代码仍然是200,而不是3xx。

30X响应永远不会到达回调(解析方法),因为在此之前它们是由重定向中间件处理的

但是,正如您自己指出的,所有响应状态都已存储在scrapy stats中,这意味着您可以在任何时候轻松地将它们拉入爬虫:

  • 在您的回拨中:

    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}
    
  • 在管道中(有关如何使用管道的信息,请参见):


  • 任何你可以访问
    爬虫
    对象的地方

    谢谢@Granitosaurus!这就是我需要的。
    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))