严格重定向始终为200

时间:2018-10-11 09:31:43

标签: 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
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 :(得分:2)

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

但是,正如您所指出的那样,所有响应状态都已存储在可疑统计信息中,这意味着您可以随时轻松地将它们拉入爬网程序:

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