【问题标题】:Scrapy suppress handled errorsScrapy 抑制处理的错误
【发布时间】:2016-04-17 21:44:06
【问题描述】:

相关代码

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

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

请注意,我不想隐藏所有错误 - 只是这里正在处理的错误。

【问题讨论】:

  • 你的意思是改变日志级别吗?
  • 不,我只是不想显示我在 handle_error 方法中收到的错误
  • 可能在调用错误处理程序之前就记录了这些错误。
  • 您能分享错误的日志示例吗?

标签: python error-handling scrapy twisted


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    这将向您的回调函数发送一些错误的答案,从而也跳过日志记录

    【讨论】:

      【解决方案3】:

      在你的函数中使用一个简单的 try-except。只要您自己处理异常(向数据库添加行,只需“通过”,...),twisted 就不会识别错误。 例如

      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
      

      【讨论】:

        猜你喜欢
        • 2022-11-19
        • 1970-01-01
        • 2019-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多