scrapy中间件源码分析及常用中间件大全

本文介绍了Scrapy中间件的工作原理,分为下载中间件和spider中间件,主要负责Request、Response的处理和过滤。下载中间件用于设置反爬策略,如添加代理、UA和cookie。spider中间件则主要用于请求和响应的过滤。文中还提供了自定义中间件的实例,如user-agent、代理IP、cookie中间件,并指导如何在settings.py中配置中间件。

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

中间件位于引擎与下载器、引擎与spider之间,是处理scrapy中两个重要对象Request、Response及数据数据对象Item的重要的扩展。

image

那么中间件分类两类就不难理解了,其中一类在引擎与下载器之间我们可以称之为下载中间件、另一个在引擎与spider之间我们可以称之为爬虫中间件;下载中间件和spider中间件都对Request、Response请求处理,根据位置不同,他们主要负责的职能也不同。

spider中间件(主职过滤)对Request、Response的主要作用在过滤,可以对特定路径的URL请求丢弃、对特定页面响应过滤、同时对一些不含有指定信息的item过滤,当然pipeline也能实现item的过滤。

下载中间件(主职加工)主要作用是加工,如给Request添加代理、添加UA、添加cookie,对Response返回数据编码解码、压缩解压缩、格式化等预处理。

下面我们将从这两个中间件出发来详细讲解其中奥妙。


spider中间件

在创建scrapy项目后会自动在middlewares.py文件下生成一个spider中间件和下载中间件模板,查看代码:

class ProxyExampleSpiderMiddleware(object):
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the spider middleware does not modify the
    # passed objects.

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_spider_input(self, response, spider):
        # Called for each response that goes through the spider
        # middleware and into the spider.

        # Should return None or raise an exception.
        return None

    def process_spider_output(self, response, result, spider):
        # Called with the results returned from the Spider, after
        # it has processed the response.

        # Must return an iterable of Request, dict or Item objects.
        for i in result:
            yield i

    def process_spider_exception(self, response, exception, spider):
        # Called when a spider or process_spider_input() method
        # (from other spider middleware) raises an exception.

        # Should return either None or an iterable of Response, dict
        # or Item objects.
        pass

    def process_start_requests(self, start_requests, spider):
        # Called with the start requests of the spider, and works
        # similarly to the process_spider_output() method, except
        # that it doesn’t have a response associated.

        # Must return only requests (not items).
        for r in start_requests:
            yield r

    def spider_opened(self, spider):
        spider.logger.info('Spider opened: %s' % spider.name)

  • process_spider_input(response, spider)
    当Response传递给spider的解析函数之前,该函数执行,返回结果为None或异常
  • process_spider_output(response, result, spider)
    当解析函数完成对Response处理后,该函数执行,接受被解析的Response响应及其对应解析出来的迭代对象result(result可以使yield Request或者yield Item)
  • process_spider_exception(response, exception, spider)
    当spider中间件抛出异常及spider解析函数出现异常,这个方法被调用,返回None或可迭代对象的Request、dict、Item,如果返回None将继续被其他spider中间件的异常处理
  • from_crawler(cls, crawler)
  • 读取配置文件中的参数进行中间件配置

看一个scrapy内置的spider中间件源码

scrapy.spidermiddlewares.httperror.HttpErrorMiddleware

过滤出所有失败(错误)的HTTP res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值