zoukankan      html  css  js  c++  java
  • 二十二、Scrapy中的Spider中间件

    Spider中间件可以用来处理发送给Spider的Response及Spider产生的Item和Request。

    1、Scrapy内置的SPIDER_MIDDLEWARES_BASE

      (1)'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware':50

      (2)'scrapy.spidermiddlewares.offsite.OffsiteMiddleware':500

      (3)'scrapy.spidermiddlewares.referer.RefererMiddlewares':700

      (4)'scrapy.spdiermiddlewares.urllength.UrlLengthMiddleware':800

      (5)'scrapy.spidermiddlewares.depth.DepthMiddleware':900

    2、编写Spider中间件

      每个中间件组件是定义了以下一个或多个方法的Python类

      (1)process_spider_input(response,spider)

      (2)process_spider_output(response,result,spider)

      (3)process_spider_exception(response,exception,spider)

      (4)process_start_requests(start_requests,spider)

      1、process_spider_input(response,spider)

        作用:当response通过spider中间件时,该方法被调用,处理该response

        返回值:应该返回None或者抛出一个异常

        (1)如果返回None,scrapy将会继续处理该response,调用所有其他的中间件直到spider处理该response

        (2)如果产生一个异常,Scrapy将不会调用任何其他中间件的process_spider_input()方法,并调用request的errback。errback的输出将会以另一个方向被重新输入到中间件链中,使用process_spider_output()方法来处理,当其抛出异常时,则调用process_spider_exception()

        参数:

        (1)response(Resposne对象):被处理的response

        (2)spider(Spider对象):其response对应的spider

      2、process_spider_output(response,result,spider)

        作用:当spider处理Response返回Result时,该方法被调用

        返回值:必须返回包含Request、dict和Item对象的可迭代对象(iterable)

        参数:

        (1)response(Resposne对象):生成该输出的Response

        (2)result:spider返回的Result,是包含Request、Dict或Item的可迭代对象

        (3)spider(Spider对象):其结果被处理的Spider

      3、process_spider_exception(response,exception,spider)

        作用:当Spider或(其他Spider中间件)process_spider_input()抛出异常时,该方法被调用

        返回值:必须返回None或者包含Response、Dict或Item对象的可迭代对象

        (1)如果其返回None,Scrapy将继续处理该异常,调用中间件链中的其他中间件的process_spider_exception()方法,直到所有中间件都被调用,该异常到达引擎时被记录,最后被忽略。

        (2)如果返回一个可迭代对象,则中间件链的process_spider_output()方法被调用,其他的process_spider_exception()将不会被调用

        参数:

        (1)response(Resposne对象):异常被抛出时被处理的Response

        (2)exception(Exception对象):被抛出的异常

        (3)spider(Spider对象):抛出该异常的Spider

      4、process_start_requests(start_requests,spider)

        作用:

         此方法以spider启动的request为参数,执行的过程类似于process_spider_output(),其接受一个可迭代的对象(start_requests参数)且必须返回另一个包含Request对象的可迭代对象

        参数:

        (1)start_requests(包含Request的可迭代对象):起始Requests

        (2)spider(Spider对象):起始Requests所属的Spider

      5、示例

        ```

        from scrapy.http import Request

        from scrapy.utils.url import canonicalize_url

        class UrlCanonicalizerMiddleware(object):

          def process_spider_output(self,response,result,spider):

            for r in result:

              if isinstance(r,Request):

                curl = canonicalize_url(r.url)

                if curl != r.curl:

                r = r.replace(url=curl)

              yiled r

        ```

        

  • 相关阅读:
    微服务之间的通讯安全(四)-JWT优化之日志、错误处理、限流及JWT改造后执行流程梳理
    微服务之间的通讯安全(三)-JWT优化之权限控制
    微服务之间的通讯安全(二)-使用JWT优化认证机制
    微服务之间的通讯安全(一)-针对认证和SSO现有架构的问题
    认证和SSO(五)-基于token的SSO
    认证和SSO(四)-基于session的SSO存在的问题之token问题及基于session的SSO优缺点
    认证和SSO(三)-基于session的SSO存在的问题之session问题
    认证和SSO(二)-OAuth2四种授权模式及项目改造为授权码模式实现单点登陆SSO
    认证和SSO(一)-基于OAuth2单点登陆基本架构
    网关安全(五)-引入网关,在网关上实现流控,认证,审计,授权
  • 原文地址:https://www.cnblogs.com/nuochengze/p/13152604.html
Copyright © 2011-2022 走看看