爬虫工作量由小到大的思维转变---<第七十章 > Scrapy.crawler模块中的异常

发布于:2024-04-03 ⋅ 阅读:(127) ⋅ 点赞:(0)

前言:

        在Scrapy框架中,扩展和中间件是非常重要的两个组件,它们提供了强大的功能来扩展和自定义Scrapy的功能。扩展主要用于全局性地扩展和操作Scrapy,而中间件更多的是基于组件的扩展。

        由于扩展和中间件将注入到Scrapy内核的不同部分,它们也会引入新的异常类型。这些异常如果不加以妥善处理,可能会导致爬虫意外中断。因此,了解并处理扩展和中间件中的异常类型,是开发稳定的Scrapy爬虫的重要一环。


正文:

1. 核心组件扩展的异常:

Scrapy有一些对整个框架非常重要的核心扩展,它们可能抛出的异常需要特别注意。

1.1 TelnetConsole扩展

TelnetConsole实现了Scrapy的远程监控功能。它可能抛出:

  • TelnetConsoleError:Telnet控制台启动时的错误基类

  • TelnetConsoleInitializationError:控制台初始化失败时抛出

该异常通常是因为端口占用或监听地址错误导致,可以检查端口配置或更换端口。

  • TelnetConsoleInteractIncompleteError:交互异常基类

  • TelnetConsoleInteractFailed:交互执行失败,如爬虫已关闭

这表示爬虫状态异常,需要检查爬虫生命周期。

1.2 CoreStats扩展

CoreStats收集爬虫运行统计数据,它可能抛出:

  • CoreStatsError:统计扩展的错误基类

  • CoreStatsInitializationError:初始化统计数据库失败

这可能是数据库连接配置错误,需要检查settings中的配置。

  • CoreStatsInteractFailed:获取统计数据失败

这通常表示爬虫已关闭,无法正常获取统计数据。

1.3 SpiderState扩展

SpiderState跟踪和持久化爬虫状态,它可能抛出:

  • SpiderStateError:爬虫状态扩展的错误基类

  • InvalidSpiderState:爬虫状态损坏或不合法

这表示状态数据库损坏或状态异常,需要检查数据库。

  • SpiderStateInitializationError:状态扩展初始化失败

这通常是状态数据库配置错误导致,需要检查数据库连接配置。

通过上述扩展的异常分析,我们可以看出扩展的异常通常与其功能强相关,了解扩展的用途可以帮助更好地处理这些异常。

2. Downloader中间件的异常:

Downloader中间件主要对请求(Request)进行处理,它们可能抛出的常见异常如下:

2.1 HttpProxyMiddleware

HttpProxyMiddleware实现代理配置,主要异常:

  • ProxyConnectError:代理连接失败

  • HttpProxyMiddlewareNotSupported:不支持的代理协议

这通常是代理协议设置错误,需要检查使用的代理协议。

2.2 HttpAuthMiddleware

HttpAuthMiddleware实现HTTP认证,主要异常:

  • HttpAuthMiddlewareNotSupported:不支持的认证方法

这通常是设置的认证方法不被Scrapy支持,需要检查使用的认证方式。

2.3 RetryMiddleware

RetryMiddleware实现请求重试,主要异常:

  • MaxRetryError:超过最大重试次数,请求失败

可以通过增加最大重试次数来避免该错误。

3. Spider中间件的异常:

Spider中间件主要扩展spider的功能,常见异常有:

3.1 DepthMiddleware

DepthMiddleware通过请求深度控制请求量,主要异常:

  • DepthLimitExceeded:超过最大深度,拒绝请求

可以通过增加最大深度来解决该问题。

3.2 HttpErrorMiddleware

HttpErrorMiddleware过滤HTTP错误响应,主要异常:

  • HttpError:HTTP错误的基类

这通常表示服务器返回了4xx、5xx错误,需要检查请求及服务器状态。

3.3 OffsiteMiddleware

OffsiteMiddleware过滤不符合规则的请求,主要异常:

  • OffsiteMiddlewareNotSupported:不支持的请求过滤规则

需要检查过滤规则配置是否正确。

案例:

class MySpider(scrapy.Spider):
  def start_requests(self):
    urls = [] 
    for url in urls:
      yield scrapy.Request(url=url, 
            errback=self.errback)
          
  def errback(self, failure):
    if failure.check(HttpError):
      # 处理HTTP错误
    elif failure.check(DepthLimitExceeded):
      # 处理超过最大深度
  

上述代码通过failure.check方法检查异常类型,从而进行针对性处理。

4. Item Pipeline的异常

Item Pipeline用来处理和持久化爬取的item,Scrapy内置了几个常用的Pipeline,它们可能抛出的异常包括:

4.1 ImagesPipeline

用于下载图片,主要异常:

  • DropItem:丢弃item的异常

  • NotConfigured:组件未配置异常

  • NotSupported:不支持的图片URL异常

  • CloseSpider:关闭爬虫异常

4.2 FilePipeline

用于保存文件,主要异常:

  • DropItem:丢弃item异常

  • NotConfigured:组件未配置异常

  • NotSupported:不支持的文件URL异常

  • CloseSpider:关闭爬虫异常

  • WriteFailed:文件写入失败异常

4.3 JsonItemExporterPipeline

导出JSON文件,主要异常:

  • NotConfigured:组件未配置异常

  • WriteFailed:文件写入失败异常

4.4 JsonLinesItemExporterPipeline

导出JSONL文件,主要异常同JsonItemExporterPipeline。

4.5 CsvItemExporterPipeline

导出CSV文件,主要异常同JsonItemExporterPipeline。

通过捕获和处理这些异常,可以让item持久化更加可靠稳定。

5. 其他扩展与中间件的异常

除了Pipeline,Scrapy其他组件也可能抛出异常,常见的有:

5.1 日志扩展Logging的异常

  • ScrapyLoggingError:日志扩展异常基类

  • ScrapyLoggingInitializationError:日志初始化失败异常

5.2 Telnet控制台扩展异常

  • TelnetConsoleError:控制台扩展异常基类

  • TelnetConsoleInitializationError:控制台初始化失败

5.3 邮件发送扩展MailSender异常

  • MailSenderError:发送邮件异常的基类

5.4 缓存系统HttpCacheMiddleware异常

  • HttpCacheMiddlewareError:缓存扩展异常基类

  • HttpCacheMiddlewareNotAvailable:缓存不可用异常

5.5 调度器中间件Scheduler异常

  • SchedulerDuplicateRequest:重复请求异常

通过捕获和处理扩展与中间件的异常,可以增强爬虫的健壮性,避免组件故障影响爬虫。

案例:

from scrapy.exceptions import DropItem

class MyPipeline(object):
  def process_item(self, item):
    try:
      # 处理item
    except DropItem:
      # 丢弃item
    except IOError:
      # 日志记录IOError
      self.logger.error('File IO Error')

上面代码通过捕获不同的异常,实现了不同情况的处理,使得item pipeline更加完善。

6. 异常处理策略

对于扩展和中间件抛出的各种异常,我们需要根据一定策略进行处理,以保证爬虫的稳定运行。主要的处理策略如下:

6.1 扩展与中间件异常的共性

扩展和中间件抛出的异常通常有以下共性:

  1. 大多数异常继承自Scrapy的组件特定的错误基类,如SpiderMiddlewareError等。

  2. 异常通常与组件功能强相关,反映了执行过程中的特定错误。

  3. 一般需要组件级别的try-except块来捕获这些异常。

  4. 常需要根据异常类型进行不同的处理,或将其传递给spider的errback。

  5. 必须记录下未处理的异常,便于后续补偿或分析根因。

6.2、异常处理的经验与建议

针对扩展和中间件异常,处理时的一些经验与建议:

  1. 根据异常类型区分处理。针对不同类型的已知异常做定制化处理。

  2. 将未知异常传递给spider的errback,由spider统一处理。

  3. 使用try-except块捕获异常,避免未处理的异常影响程序流程。

  4. 对致命异常可考虑用raise抛出,强制结束执行。

  5. 用logging模块记录所有的异常信息,包括traceback,便于追踪解决问题。

  6. 可在Spider关闭的信号处理中补偿记录未处理的异常。

  7. 也可以定义一个全局的异常处理函数,统一处理异常。

  8. 在Item Pipeline中,可针对DropItem等异常决定丢弃item的策略。

  9. 根据异常情况,考虑是否需要关闭爬虫。

  10. 通过配置启用和禁用相关扩展与中间件来隔离问题。

通过结合异常的共性与处理经验,我们可以更好地应对扩展和中间件中的异常,保证爬虫的健壮性。这需要对Scrapy的异常机制有整体的理解,以及编写程序时对异常的重视。

总结:

通过本文对Scrapy扩展和中间件异常的讲解,我们可以得出以下几点启示:

  1. 要明确不同扩展和中间件的功能,才能更好地处理其异常。比如TelnetConsole扩展负责远程监控,CoreStats扩展收集统计数据等。

  2. 扩展的异常通常与初始化和交互相关,中间件的异常与请求、响应处理相关。这点需要牢记。

  3. Pipeline的异常主要与数据持久化相关,其他扩展和中间件各有特定的异常类型。

  4. 在编码时要用try-except块捕获相关异常,避免影响执行流程。

  5. 根据异常类型区分处理,关键的未处理异常要记录日志,方便后续分析。

  6. 扩展和中间件异常有共性,多传递到spider的errback统一处理。

  7. 异常处理要考虑异常特点,结合编码经验,保证爬虫程序健壮性。

  8. 通过全面掌握Scrapy的异常机制,我们可以开发出智能、稳定的爬虫程序。

  9. 正确处理扩展和中间件的异常是Scrapy爬虫开发的重要一环,这需要我们对Scrapy的内部机制有深入的理解。


网站公告

今日签到

点亮在社区的每一天
去签到