如何使用Scrapy检测HTTP错误状态码并导出至CSV?
解决Scrapy捕获非200状态码并导出CSV的问题
Scrapy默认仅会将状态码在200-300区间内的响应传递给parse方法,所以你只能获取到200状态码。要捕获404、502这类非成功状态码,需要做以下调整:
1. 允许爬虫接收指定非200状态码
在你的爬虫类中添加handle_httpstatus_list属性,列出你需要捕获的状态码;或者设置handle_httpstatus_all = True来接收所有状态码的响应:
import scrapy class YourSpider(scrapy.Spider): name = 'your_spider' start_urls = ['http://example.com', 'http://example.com/nonexistent'] # 捕获指定状态码 handle_httpstatus_list = [404, 502, 403] # 或者捕获所有状态码 # handle_httpstatus_all = True def parse(self, response): yield { 'URL': response.url, 'Status': response.status }
这样所有符合handle_httpstatus_list的响应都会进入parse方法,你就能正常获取对应的状态码并导出到CSV了。
2. 处理请求失败(无响应的情况)
如果遇到DNS解析失败、连接超时这类没有返回响应的错误,需要通过errback函数来捕获:
import scrapy from twisted.python.failure import Failure class YourSpider(scrapy.Spider): name = 'your_spider' start_urls = ['http://invalid-domain.example', 'http://example.com'] handle_httpstatus_list = [404, 502] def start_requests(self): for url in self.start_urls: yield scrapy.Request( url, callback=self.parse, errback=self.handle_error ) def parse(self, response): yield { 'URL': response.url, 'Status': response.status } def handle_error(self, failure): # 获取请求的URL url = failure.request.url # 提取错误信息,比如超时、DNS失败等 error_msg = str(failure.value) # 自定义状态标识 yield { 'URL': url, 'Status': f'ERROR: {error_msg}' }
运行爬虫时,执行scrapy crawl your_spider -o status_results.csv就能将所有URL的状态信息导出到CSV文件。
内容的提问来源于stack exchange,提问作者Raisul Islam
相关产品推荐
相关产品推荐

