目前我编写了非常简单的蜘蛛,如下所示
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
的建议。
答案 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实例作为第一个参数。