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 统计信息中,这意味着您可以随时轻松地将它们拉入爬虫:
在你的回调中:
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}
在您的管道中(请参阅 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
对象的地方真的!
我在 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 统计信息中,这意味着您可以随时轻松地将它们拉入爬虫:
在你的回调中:
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}
在您的管道中(请参阅 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
对象的地方真的!