Scrapy 中 SPIDER_MIDDLEWARES 和 DOWNLOADER_MIDDLEWARES 的区别

本文详细解释了Scrapy框架中的下载中间件和蜘蛛中间件的作用、区别,以及它们在处理请求和响应时的职责。重点介绍了如何在实际项目中运用和自定义这些中间件来定制爬虫行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 下载中间件的方法

  • process_request(request,spider): 所有请求都会调用此方法
  • process_response(request, response, spider): 这里的参数比上面的多了response,肯定是用来处理response的
  • process_exception(request, exception, spider):处理异常
  • from_crawler(cls, crawler):从settings.py获取配置

2. 蜘蛛中间件的方法

  • process_spider_input(response, spider):所有请求都会调用这个方法
  • process_spider_output(response, result, spider):spider解析完response之后调用该方法,result就是解析的结果(是一个可迭代对象),其中可能是items也可能是request对象
  • process_spider_exception(response, exception, spider):处理异常
  • process_start_requests(start_requests, spider):同process_spider_output,不过只处理spider中start_requests方法返回的结果
  • from_crawler(cls, crawler):从settings.py获取配置

3. 区别

  • 下载中间件是连通引擎和下载器的,所以如果修改请求只会影响下载器返回的结果,如果修改响应会影响 spider 处理;
  • 而 spider 中间件是连通引擎和 spider 的,如果修改请求则会影响整个 scrapy 的请求,因为scrapy的所有请求都来自于 spider,当然包括调度器和下载器,如果修改响应,则只会影响蜘蛛的解析,因为响应是由引擎传递给蜘蛛的。

4. 使用

  • spider 中间件:        

        -- 一般用于操作 spider 返回的request,比如记录深度、丢弃非200状态码响应、丢弃非指定域名请求等;

        -- 蜘蛛中间件一般不需要自己编写,使用内置的几个也足够了;

  • 下载中间件:

        -- 下载中间件用于操作向互联网发起请求的request和返回的response,比如修改请求头、修改响应、管理cookies、丢弃非200状态码响应、丢弃非指定域名请求等;

<think>嗯,用户想了解Scrapy框架中的HttpErrorMiddleware的用法错误处理。首先,我需要回忆一下Scrapy中间件的基本结构,特别是下载器中间件。HttpErrorMiddleware属于下载器中间件的一种,主要负责处理HTTP错误状态码。 用户可能遇到了HTTP请求返回了非200状态码的情况,比如404或500错误,而Scrapy默认可能忽略这些错误,导致用户需要自己处理。这时候HttpErrorMiddleware的作用就显现出来了,它允许用户配置哪些状态码需要被视为错误,从而触发相应的处理机制。 接下来,我需要确认HttpErrorMiddleware的工作流程。根据Scrapy的文档,这个中间件会在收到响应时检查状态码。如果状态码在配置的允许范围内,就继续处理响应;否则,会抛出一个HttpError异常。用户可能需要在爬虫中捕获这个异常,或者通过其他中间件来处理。 然后,用户可能需要知道如何配置这个中间件,比如如何设置HTTPERROR_ALLOWED_CODES参数,允许某些状态码不被视为错误。例如,有些API可能返回201或301状态码,但用户仍然希望处理这些响应。这时候需要修改设置,将这些状态码添加到允许列表中。 另外,用户可能想了解如何处理被HttpErrorMiddleware抛出的异常。通常,可以在爬虫中编写异常处理逻辑,或者在中间件中实现process_spider_exception方法来捕获处理这些错误。例如,记录日志、重试请求或收集统计信息。 还需要注意引用中的内容,比如引用[3]提到process_spider_input是正序,而其他如process_spider_output是倒序。这可能影响到中间件的执行顺序,但HttpErrorMiddleware属于下载器中间件,可能执行顺序不同,需要确认。 最后,用户可能需要具体的代码示例,如何配置中间件,如何捕获异常,以及如何调整允许的状态码。此外,相关问题部分应该涵盖配置方法、异常处理机制、中间件的执行顺序,以及如何忽略特定错误码等。</think>### Scrapy框架中HttpErrorMiddleware的用法与错误处理 #### 1. 核心功能解析 HttpErrorMiddleware是Scrapy内置的下载器中间件,主要用于处理HTTP响应状态码过滤。当服务器返回的HTTP状态码在$400-599$范围内时,该中间件会触发错误处理流程,默认行为是抛出$HttpError$异常[^3]。 #### 2. 配置参数说明 ```python # settings.py HTTPERROR_ALLOWED_CODES = [404] # 允许的HTTP错误码 HTTPERROR_ALLOW_ALL = False # 是否允许所有状态码 ``` #### 3. 异常处理机制 当中间件检测到非法状态码时,会触发如下处理流程: ``` Request -> Downloader -> HttpErrorMiddleware -> Spider Middleware -> Spider ↑ Error ↓ Error Handling Pipeline ``` #### 4. 自定义错误处理示例 ```python from scrapy.spidermiddlewares.httperror import HttpError from twisted.python.failure import Failure class MySpider(scrapy.Spider): def parse(self, response): if response.status == 404: self.logger.warning("特殊处理404页面") def errback(self, failure: Failure): if failure.check(HttpError): response = failure.value.response if response.status == 503: yield Request(response.url, callback=self.parse, dont_filter=True) ``` #### 5. 中间件执行顺序 HttpErrorMiddleware的优先级为$50$(数值越小优先级越高),其处理顺序受中间件加载顺序影响。可以通过调整设置中的$DOWNLOADER_MIDDLEWARES$字典顺序来改变执行优先级[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值