1.当爬取页面状态码是异常状态码,但response页面是正常的时候
2.有些网站第一次请求时会出现异常状态码,再发请求返回的响应就是正常的状态码
一、Scrapy框架跳过异常状态码
当爬取页面状态码是异常状态码,但response页面是正常的时候,正常情况Scrapy框架会判断状态码,如果不是正常状态码会停止后续操作
.../lib/python3.5/site-packages/scrapy/spidermiddlewares/httperror.py
def process_spider_input(self, response, spider):
if 200 <= response.status < 300: # common case
return
meta = response.meta
if 'handle_httpstatus_all' in meta:
return
if 'handle_httpstatus_list' in meta:
allowed_statuses = meta['handle_httpstatus_list']
elif self.handle_httpstatus_all:
return
else:
allowed_statuses = getattr(spider, 'handle_httpstatus_list', self.handle_httpstatus_list)
if response.status in allowed_statuses:
return
raise HttpError(response, 'Ignoring non-200 response'
通过上面代码,可以看出,如果在请求一些页面状态码异常,但response是正常的时候可以在请求的时候(Request)加一个参数就可以让异常状态码进行后续的操作。
Request(url=url, callback=函数名, meta={"handle_httpstatus_all": True}
当然也可以采用判断特定状态码进行后续操作,定义一个名handle_httpstatus_list的列表里面存入要跳过的异常状态码; 也可以在settings.py文件中加,这样所有爬虫就都支持了,具体看自我需求。
二、Scrapy框架异常状态码重新发送请求
有些网站第一次请求时会出现异常状态码,再发请求返回的响应就是正常的状态码,遇到这种情况可以在自己的下载中间件系统默认middleware.py里写入一个
# 系统会自动调用你定义的这个函数(要保证settings调用这个middleware类),判断状态码是否是异常状态码,如果是会重新发送请求。
def process_response(self, request, response, spider):
if response.status == 异常状态码:
return request
else:
return response
网友评论