Scrapy处理异常状态码

一、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里写入一个

def process_response(self, request, response, spider):
    if response.status == 异常状态码:
        return request
    else:
        return response

        系统会自动调用你定义的这个函数(要保证settings调用这个middleware类),判断状态码是否是异常状态码,如果是会重新发送请求。

你可能感兴趣的:(爬虫,Scrapy)