scrapy start_urls请求返回503,如何捕获它?

时间:2017-06-22 15:58:13

标签: python-3.x scrapy scrapy-spider

目前我编写了非常简单的蜘蛛,如下所示

class QASpider(CrawlSpider):
    name = "my-spider";
    handle_httpstatus_list = [400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,426,428,429,431,451,500,501,502,503,504,505,506,507,508,510,511];
    allowed_domains = ["local-02"];
    start_urls = preview_starting_urls;
    rules = [Rule(LinkExtractor(), callback='parse_url', follow=True)]

    def parse_url(self, response):
        # Some operations

preview_starting_urls中,我打算开始抓取网址并且蜘蛛工作正常,只要我从起始网址获得响应代码200即可。但是当任何起始URL上有503时,不会调用parse_url方法。

我认为出现这种情况是因为如果对start_url(s)的请求失败,scrapy不会调用我自己的回调,所以我尝试定义默认的回调方法:

def parse(self, response)
    parse_url(response);

但是这导致我的蜘蛛爬行只有start_urls(以及发送一些其他的scrapy请求,比如robots.txt和类似的)并没有别的。

关键是当我没有定义默认的回调parse/2方法时,我不会处理任何start_urls,以防它们返回不同于200的请求代码。如果我定义parse/2方法如上所述,spider不会抓取所有网址,因为它会在未定义parse/2的情况下进行抓取。

即使对于返回不同于200的响应的start_urls,如何强制scrapy调用我的回调?

修改:此外,我愿意接受有关如何优雅地填充handle_httpstatus_list的建议。

1 个答案:

答案 0 :(得分:0)

在scrapy中捕获错误非常简单。只需创建一个需要在错误发生时调用的新函数,并将其作为默认函数传递,以便在执行Request时调用错误。如果您想为起始网址执行此操作,则必须手动调用start_request功能才能访问yield Request来电

#replace start_urls 
#error_function() called when error occurs
def start_requests(self):
    urls = preview_starting_urls
    for url in urls:
        yield scrapy.Request(url=url, callback=self.parse_url, errback=self.error_function)

def error_function(self,failure):
    self.logger.error(repr(failure))
    #write your error parse code
  

errback(可调用) - 在处理请求时引发任何异常时将调用的函数。这包括因404 HTTP错误而失败的页面等。它接收Twisted Failure实例作为第一个参数。