zoukankan      html  css  js  c++  java
  • 爬虫(十四):scrapy下载中间件

    下载器中间件是介于Scrapy的request/response处理的钩子框架,是用于全局修改Scrapy request和response的一个轻量、底层的系统。

    激活Downloader Middleware

    要激活下载器中间件组件,将其加入到 DOWNLOADER_MIDDLEWARES 设置中。 该设置是一个字典(dict),键为中间件类的路径,值为其中间件的顺序(order)。像下面这样

    DOWNLOADER_MIDDLEWARES = {
        'myproject.middlewares.CustomDownloaderMiddleware': 543,
    }

    DOWNLOADER_MIDDLEWARES 设置会与Scrapy定义的 DOWNLOADER_MIDDLEWARES_BASE 设置合并(但不是覆盖), 而后根据顺序(order)进行排序,最后得到启用中间件的有序列表: 第一个中间件是最靠近引擎的,最后一个中间件是最靠近下载器的。

    关于如何分配中间件的顺序settings里面的Scrapy默认BASE设置 ,而后根据你想要放置中间件的位置选择一个值。 由于每个中间件执行不同的动作,你的中间件可能会依赖于之前(或者之后)执行的中间件,因此顺序是很重要的。

    如果你想禁止内置的(在 DOWNLOADER_MIDDLEWARES_BASE 中设置并默认启用的)中间件, 你必须在项目的 DOWNLOADER_MIDDLEWARES 设置中定义该中间件,并将其值赋为 None 。 例如,如果您想要关闭user-agent中间件:

    DOWNLOADER_MIDDLEWARES = {
        'myproject.middlewares.CustomDownloaderMiddleware': 543,
        'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    }

    自定义Downloader Middleware

    如果你想自定义一个属于你的下载器中间件,只需要编写一个下载器中间件类,继承自scrapy.downloadermiddlewares.DownloaderMiddleware,而后在里面重写以下的几个方法。

    • process_request(request, spider)

      当每个request通过下载中间件时,该方法被调用。

      process_request() 必须返回其中之一: 返回 None 、返回一个 Response 对象、返回一个 Request 对象或raise IgnoreRequest 。

      • 如果其返回 None ,Scrapy将继续处理该request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用, 该request被执行(其response被下载)。

      • 如果其返回 Response 对象,Scrapy将不会调用 任何 其他的 process_request() 或 process_exception() 方法,或相应地下载函数; 其将返回该response。 已安装的中间件的 process_response() 方法则会在每个response返回时被调用。

      • 如果其返回 Request 对象,Scrapy则停止调用 process_request方法并重新调度返回的request。当新返回的request被执行后, 相应地中间件链将会根据下载的response被调用。

      • 如果其raise一个 IgnoreRequest 异常,则安装的下载中间件的 process_exception() 方法会被调用。如果没有任何一个方法处理该异常, 则request的errback(Request.errback)方法会被调用。如果没有代码处理抛出的异常, 则该异常被忽略且不记录(不同于其他异常那样)。

      参数:
      request(Request 对象)–处理的request
      spider(Spider 对象)–该request对应的spider

    • process_response(request, response, spider)

      process_request() 必须返回以下之一: 返回一个 Response 对象、 返回一个 Request 对象或raise一个 IgnoreRequest 异常。

      • 如果其返回一个 Response (可以与传入的response相同,也可以是全新的对象), 该response会被在链中的其他中间件的 process_response() 方法处理。
      • 如果其返回一个 Request 对象,则中间件链停止, 返回的request会被重新调度下载。处理类似于 process_request() 返回request所做的那样。
      • 如果其抛出一个 IgnoreRequest 异常,则调用request的errback(Request.errback)。 如果没有代码处理抛出的异常,则该异常被忽略且不记录(不同于其他异常那样)。

      参数:
      request (Request 对象) – response所对应的request
      response (Response 对象) – 被处理的response
      spider (Spider 对象) – response所对应的spider

    • process_exception(request, exception, spider)

      当下载处理器(download handler)或 process_request() (下载中间件)抛出异常(包括IgnoreRequest异常)时,Scrapy调用 process_exception() 。

      process_exception() 应该返回以下之一: 返回 None 、 一个 Response 对象、或者一个 Request 对象。

      • 如果其返回 None ,Scrapy将会继续处理该异常,接着调用已安装的其他中间件的 process_exception() 方法,直到所有中间件都被调用完毕,则调用默认的异常处理。
      • 如果其返回一个 Response 对象,则已安装的中间件链的 process_response() 方法被调用。Scrapy将不会调用任何其他中间件的 process_exception() 方法。
      • 如果其返回一个 Request 对象, 则返回的request将会被重新调用下载。这将停止中间件的 process_exception() 方法执行,就如返回一个response的那样。

      参数:
      request (是 Request 对象) – 产生异常的request
      exception (Exception 对象) – 抛出的异常
      spider (Spider 对象) – request对应的spider

    内置Downloader Middleware介绍

      • CookiesMiddleware

        该中间件使得爬取需要cookie(例如使用session)的网站成为了可能。 其追踪了web server发送的cookie,并在之后的request中发送回去, 就如浏览器所做的那样。

        以下设置可以用来配置cookie中间件:
        COOKIES_ENABLED默认为True
        COOKIES_DEBUG默认为False

        Scrapy通过使用 cookiejar Request meta key来支持单spider追踪多cookie session。 默认情况下其使用一个cookie jar(session),不过我们可以传递一个标示符来使用多个。
        比如:

        for i, url in enumerate(urls):
            yield scrapy.Request("http://www.example.com", meta={'cookiejar': i},
                callback=self.parse_page)

        需要注意的是 cookiejar meta key不是”黏性的(sticky)”。 我们需要在之后的request请求中接着传递。
        比如:

        def parse_page(self, response):
            # do some processing
            return scrapy.Request("http://www.example.com/otherpage",
                meta={'cookiejar': response.meta['cookiejar']},
                callback=self.parse_other_page)
      • DefaultHeadersMiddleware

        该中间件设置 DEFAULT_REQUEST_HEADERS 指定的默认request header。

      • DownloadTimeoutMiddleware

        该中间件设置 DOWNLOAD_TIMEOUT 指定的request下载超时时间.

      • HttpAuthMiddleware

        该中间件完成某些使用 Basic access authentication (或者叫HTTP认证)的spider生成的请求的认证过程。

      • HttpCacheMiddleware

        该中间件为所有HTTP request及response提供了底层(low-level)缓存支持。 其由cache存储后端及cache策略组成。

      • HttpCompressionMiddleware

        该中间件提供了对压缩(gzip, deflate)数据的支持

      • ChunkedTransferMiddleware

        该中间件添加了对 chunked transfer encoding 的支持。

      • HttpProxyMiddleware

        该中间件提供了对request设置HTTP代理的支持。您可以通过在 Request 对象中设置 proxy 元数据来开启代理。

      • RedirectMiddleware

        该中间件根据response的状态处理重定向的request。通过该中间件的(被重定向的)request的url可以通过 Request.meta 的 redirect_urls 键找到。

      • MetaRefreshMiddleware

        该中间件根据meta-refresh html标签处理request重定向。

      • RetryMiddleware

        该中间件将重试可能由于临时的问题,例如连接超时或者HTTP 500错误导致失败的页面。
        爬取进程会收集失败的页面并在最后,spider爬取完所有正常(不失败)的页面后重新调度。 一旦没有更多需要重试的失败页面,该中间件将会发送一个信号(retry_complete), 其他插件可以监听该信号。

      • RobotsTxtMiddleware

        该中间件过滤所有robots.txt eclusion standard中禁止的request。
        确认该中间件及 ROBOTSTXT_OBEY 设置被启用以确保Scrapy尊重robots.txt。

      • UserAgentMiddleware

        用于覆盖spider的默认user agent的中间件。
        要使得spider能覆盖默认的user agent,其 user_agent 属性必须被设置。

      • AjaxCrawlMiddleware

        根据meta-fragment html标签查找 ‘AJAX可爬取’ 页面的中间件。

  • 相关阅读:
    使用CustomValidate自定义验证控件
    C#中金额的大小写转换
    Andriod出错之Unable to build: the file dx.jar was not loaded from the SDK folder!
    VC 编写的打字练习
    机房工作笔记Ping只有单向通
    web服务协同学习笔记(1)
    Dll 学习3 将MDI子窗口封装在DLL中
    机房工作学习文件共享
    Andriod出错之Failed to find an AVD compatible with target 'Android 2.2'
    Andriod出错之wrapper was not properly loaded first
  • 原文地址:https://www.cnblogs.com/felixwang2/p/8798638.html
Copyright © 2011-2022 走看看