我在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。
答案 0 :(得分:2)
30X响应永远不会到达您的回调(解析方法),因为在此之前,它们是由重定向中间件处理的。
但是,正如您所指出的那样,所有响应状态都已存储在可疑统计信息中,这意味着您可以随时轻松地将它们拉入爬网程序:
在您的回调中:
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
对象的任何地方!