Scrapy抑制处理错误

时间:2016-04-17 21:44:06

标签: python error-handling scrapy twisted

相关代码

def start_requests( self ):
    requests = [ Request( url['url'], meta=url['meta'], callback=self.parse, errback=self.handle_error ) for url in self.start_urls if valid_url( url['url'] )]
    return requests

def handle_error( self, err ):
    # Errors being saved in DB
    # So I don't want them displayed in the logs

我有自己的代码用于在DB中保存错误代码。我不希望它们显示在日志输出中。如何抑制这些错误?

请注意,我并不想要压制所有错误 - 只是在这里处理错误。

3 个答案:

答案 0 :(得分:2)

尝试在self.skipped.add方法中使用self.failed.addisinstance handle_error条件。

Here is an example

def on_error(self, failure):
    if isinstance(failure.value, HttpError):
        response = failure.value.response
        if response.status in self.bypass_status_codes:
            self.skipped.add(response.url[-3:])
            return self.parse(response)

    # it assumes there is a response attached to failure
    self.failed.add(failure.value.response.url[-3:])
    return failure

答案 1 :(得分:1)

@Daniil回答Mashkin似乎是最全面的解决方案。

对于简单的情况,您可以在Spider.handle_httpstatus_list中添加http错误代码HTTPERROR_ALLOWED_CODESSettings.py

这将为您的回调函数发送一些错误的答案,因此也会跳过日志记录

答案 2 :(得分:-1)

在函数中使用简单的try-except。只要您自己处理异常(向数据库添加行,只是“传递”,...),twisted就无法识别错误。 e.g。

def handle_error( self, err ):
    try:
        #do something that raises an exception
        #twisted won't log this as long as you handle it yourself
        myvar = 14 / 0
    except:
        pass