Scrapy 重定向总是 200

Scrapy redirect is always 200

我在 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。我在settings.py中设置了HTTPERROR_ALLOW_ALL=True。我可以强制 Scrapy 提供有关重定向的信息吗?正确知道我是从 response.meta['redirect_times']response.meta['redirect_urls'] 获取的,但状态代码仍然是 200,而不是 3xx。

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. 在您的管道中(请参阅 docs 了解如何使用管道):

    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 对象的地方真的!