• scrapy框架-Middleware(爬虫中间件)


    scrapy框架-Middleware(爬虫中间件)

    Spider Middleware是Scrapy的Spider处理机制的一个挂钩框架,您可以在其中插入自定义功能,以处理发送到Spider进行处理的响应以及处理从Spider生成的请求和项目。

    1.编写自己的爬虫中间件

    主要入口是from_crawler类方法,该方法接收一个 Crawler实例。该Crawler 对象使您可以访问例如settings

    定义:

    class:

    • scrapy.spidermiddlewares.SpiderMiddleware

    方法:

    • process_spider_input(response, spider)

      def process_spider_input(self, response, spider):
          #调用通过爬虫的每个响应
      	#中间件和爬虫。
      	#应该返回None或引发异常
          return None
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • **介绍:**对于通过爬虫中间件进入爬虫请求的每个响应都将调用此方法进行处理。

      • **如果返回None:**则Scrapy将继续处理此响应,并执行所有其他中间件,直到最终将响应交给蜘蛛进行处理。

      • **如果引发异常:**Scrapy不会费心调用任何其他Spider中间件,process_spider_input()并且会在存在错误时调用请求errback,否则它将启动process_spider_exception()链。errback的输出在另一个方向上被链回以process_spider_output()进行处理,或者 process_spider_exception()如果它引发了异常。

      • 参量

        • response([Response对象)正在处理的响应

        • spiderSpider对象)此响应预期用于的爬虫

    • process_spider_output(response, result, spider)

      def process_spider_output(self, response, result, spider):
      	# 之后调用并返回爬虫返回的结果
      	# 它已经处理了响应。
      	#必须返回可迭代的Request、dict或Item对象。
      	for i in result:
      	yield i
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • **介绍:**处理完响应后,将使用Spider从返回的结果中调用此方法。
      • process_spider_output()必须返回Request对象和项目对象的可迭代 对象。
      • 参数:
        • **response:**从蜘蛛生成此输出的响应
        • result:(Request对象和 项目对象的可迭代)–爬虫返回的结果
        • **spider:**正在处理的爬虫
    • process_start_requests(start_requests, spider)

      def process_start_requests(self, start_requests, spider):
      	# 与process_spider_output()方法类似,除了它没有关联的响应。
      # 必须只返回请求(而不是条目)。
      	for r in start_requests:
      yield r
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • **介绍:**该方法与Spider的启动请求一起调用,并且与该process_spider_output()方法类似,但它没有关联的响应,并且必须仅返回请求(不返回项目)。

      • 参数:

        • **start_requests:**启动请求
      • spider:开始请求所属的蜘蛛

      激活爬虫中间件

      要激活Spider中间件组件,请将其添加到 SPIDER_MIDDLEWARES设置中,这是一个dict,其键为中间件类路径,其值为中间件顺序。

      这是一个例子:

      SPIDER_MIDDLEWARES = {
          'myproject.middlewares.CustomSpiderMiddleware': 543,
      }
      
      • 1
      • 2
      • 3

      2 .自定义下载器中间件

    • process_request(self, request, spider)

      def process_request(self, request, spider):
              # Called for each request that goes through the downloader
              # middleware.
              # 每个交给下载器的request对象都会经过该方法,并期望返回response
      
              # Must either:
              # 如果该方法返回的是None,则继续执行其他下载中间件的process_request方法送往下载器,直到合适的下载器函数被调用,该request被执行,返回response
              # - return None: continue processing this request
              # 如果该方法返回的是response,则终止当前流程,也终止继续调用其他process_request方法,将该response通过引擎返回给爬虫
              # - or return a Response object
              # 如果该方法返回的是request,则终止当前流程,也终止继续调用其他process_request方法,将request返回给调度器,大多数情况是更换新的request请求
              # - or return a Request object
              # 抛出IgnoreRequest异常, 该异常就会交个process_exception方法进行处理; 如果没有任何一个方法处理该异常
              # 那么该请求就直接被忽略了, 也不会记录错误日志.
              # - or raise IgnoreRequest: process_exception() methods of
              #   installed downloader middleware will be called
              return None
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
    • process_response(self, request, response, spider)

      def process_response(self, request, response, spider):
              # Called with the response returned from the downloader.
              # 当下载器完成http请求,返回响应给引擎的时候调用
      
              # Must either;
              # 如果返回response,则继续执行,其他下载中间件也会处理该response,直至交给引擎再交给爬虫
              # - return a Response object
              # 如果返回request,则中间件终止,该request返回引擎再给调度器
              # - return a Request object
              # 抛出 IgnoreRequest 异常; 该请求就被忽略了且不做记录
              # - or raise IgnoreRequest
              return response
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12

      当请求发出去返回时这个方法会被调用,它会返回 1.Response对象 2.Request对象 3.抛出IgnoreRequest对象

      • 若返回Response对象,它会被下个中间件中的process_response()处理

      • 若返回Request对象,中间链停止,然后返回的Request会被重新调度下载

      • 抛出IgnoreRequest,回调函数 Request.errback将会被调用处理,若没处理,将会忽略。

    使用下载器中间件时必须激活这个中间件,方法是在settings.py文件中设置DOWNLOADER_MIDDLEWARES这个字典,格式类似如下:

    DOWNLOADERMIDDLEWARES = {
        'myproject.middlewares.Custom_A_DownloaderMiddleware': 543,
        'myproject.middlewares.Custom_B_DownloaderMiddleware': 643,
        'myproject.middlewares.Custom_B_DownloaderMiddleware': None,
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    数字越小,越靠近引擎,数字越大越靠近下载器,所以数字越小的,processrequest()优先处理;数字越大的,process_response()优先处理;若需要关闭某个中间件直接设为None即可.

    例如:设置随机请求头

    user-agent中间件

    from faker import Faker
    class UserAgent_Middleware():
        def process_request(self, request, spider):
            f = Faker()
            agent = f.firefox()
            request.headers['User-Agent'] = agent
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    DOWNLOADER_MIDDLEWARES = {
        'myproject.middlewares.UserAgent_Middleware':200 ,
    }
    
    • 1
    • 2
    • 3
  • 相关阅读:
    交易积累-RSI
    anaconda pytorch cpu安装 顺着流程走 没有装不了的
    QT常用的控件总结
    嵌入式软件架构设计-模块化
    阿里云OSS服务使用操作流程
    windows上安装wsl(windows的linux子系统)
    发布Android库至MavenCentral详解
    离散数学20_第1章_等价符号⇔的定义
    全栈物联网云平台搭建:MQTT、Node.js、MongoDB、InfluxDB与React的应用示例
    企业财务数字化转型的机遇有哪些?_光点科技
  • 原文地址:https://blog.csdn.net/zhongjianboy/article/details/126751334