举个例子:

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

这个 DOWNLOADER_MIDDLEWARES 设置与合并 DOWNLOADER_MIDDLEWARES_BASE 在scrappy中定义的设置(不打算被覆盖),然后按顺序排序,以获得已启用中间件的最终排序列表:第一个中间件更接近引擎,最后一个更接近下载程序。也就是说, process_request() 每个中间件的方法将以增加的中间件顺序(100、200、300…)调用,并且 process_response() 每个中间件的方法将按降序调用。

要决定分配给中间件的顺序,请参见 DOWNLOADER_MIDDLEWARES_BASE 根据要插入中间件的位置设置和选择一个值。顺序很重要,因为每个中间件执行不同的操作,并且您的中间件可能依赖于之前(或之后)应用的一些中间件。

如果要禁用内置中间件(定义于 DOWNLOADER_MIDDLEWARES_BASE 并在默认情况下启用)您必须在项目的 DOWNLOADER_MIDDLEWARES 设置和分配 None 作为其价值。例如,如果要禁用用户代理中间件:

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

最后,请记住,某些中间商可能需要通过特定设置启用。有关更多信息,请参阅每个中间件文档。

编写自己的下载中间件

每个下载器中间件都是一个python类,它定义了下面定义的一个或多个方法。

主要入口点是 from_crawler 类方法,它接收 Crawler 实例。这个 Crawler 例如,对象允许您访问 settings .

classscrapy.downloadermiddlewares.DownloaderMiddleware

注解

任何下载器中间件方法也可能返回延迟。

process_request(requestspider)

对于通过下载中间件的每个请求调用此方法。

process_request() 应该选择哪一个:返回 None ,则返回一个 Response 对象,则返回一个 Request 对象,或引发 IgnoreRequest 

如果它回来 None ,scrapy将继续处理此请求,执行所有其他中间软件,直到最后调用适当的下载器处理程序执行请求(及其下载的响应)。

如果它返回 Response 对象,Scrapy不用打电话了 any 其他 process_request() 或 process_exception() 方法或适当的下载函数;它将返回该响应。这个 process_response() 每次响应都会调用已安装中间件的方法。

如果它返回一个 Request 对象时,Scrapy将停止调用process_request方法,并重新调度返回的请求。一旦执行了新返回的请求,将对下载的响应调用适当的中间件链。

如果它引发了 IgnoreRequest 例外情况 process_exception() 将调用已安装的下载器中间件的方法。如果它们都不处理异常,则请求的errback函数 (Request.errback )。如果没有代码处理引发的异常,则忽略该异常,不记录该异常(与其他异常不同)。

参数
  • request (Request object) -- 正在处理的请求

  • spider (Spider object) -- 此请求所针对的蜘蛛

process_response(requestresponsespider)

process_response() 应该是:返回一个 Response 对象,则返回一个 Request 对象或引发 IgnoreRequest 例外情况。

如果它返回 Response (可能是相同的给定响应,也可能是全新的响应),该响应将继续使用 process_response() 链中的下一个中间件。

如果它返回一个 Request 对象时,中间件链将暂停,返回的请求将重新计划为将来下载。这与从返回请求的行为相同 process_request() 

如果它引发了 IgnoreRequest 异常,请求的errback函数 (Request.errback )。如果没有代码处理引发的异常,则忽略该异常,不记录该异常(与其他异常不同)。

参数
  • request (is a Request object) -- 发起响应的请求

  • response (Response object) -- 正在处理的响应

  • spider (Spider object) -- 此响应所针对的蜘蛛

process_exception(requestexceptionspider)

Scrapy电话 process_exception() 当下载处理程序或 process_request() (从下载器中间件)引发异常(包括 IgnoreRequest 例外)

process_exception() 应返回:任一 None ,a Response 对象,或一个 Request 对象。

如果它回来 None ,Scrapy将继续处理此异常,执行任何其他 process_exception() 安装的中间件的方法,直到没有中间件,默认的异常处理开始。

如果它返回 Response 对象 process_response() 已安装中间件的方法链已启动,Scrapy不需要调用任何其他方法。 process_exception() 中间件的方法。

如果它返回一个 Request 对象,则返回的请求将被重新安排为将来下载。这会停止执行 process_exception() 中间件的方法与返回响应相同。

参数
  • request (is a Request object) -- 生成异常的请求

  • exception (an Exception object) -- 引发的异常

  • spider (Spider object) -- 此请求所针对的蜘蛛

from_crawler(clscrawler)

如果存在,则调用该类方法从 Crawler . 它必须返回中间件的新实例。爬虫对象提供对所有零碎核心组件(如设置和信号)的访问;它是中间件访问它们并将其功能连接到零碎的一种方式。

参数

crawler (Crawler object) -- 使用此中间件的爬虫程序