Lzh on GitHub

下载器中间件

下载器中间件是 Scrapy 请求/响应处理的钩子框架。它是一个轻量级、低级别的系统,用于全局改变 Scrapy 的请求和响应。

激活下载器中间件

要激活下载器中间件组件,请将其添加到 DOWNLOADER_MIDDLEWARES 设置中,这是一个字典,其键是中间件类路径,值是中间件顺序。

这是一个例子:

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

DOWNLOADER_MIDDLEWARES 设置会与 Scrapy 中定义的 DOWNLOADER_MIDDLEWARES_BASE 设置(不应被覆盖)合并,然后按顺序排序,以获得启用中间件的最终排序列表:第一个中间件更接近引擎,最后一个更接近下载器。换句话说,每个中间件的 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,
}

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

编写自己的下载器中间件

每个下载器中间件都是一个组件,它定义了一个或多个以下方法:

class scrapy.downloadermiddlewares.DownloaderMiddleware

注意: 任何下载器中间件方法也可以返回一个 deferred。

process_request(request, spider)

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

process_request() 应该返回 NoneResponse 对象、Request 对象或引发 IgnoreRequest

  • 如果它返回 None,Scrapy 将继续处理此请求,执行所有其他中间件,直到最终调用适当的下载器处理程序并执行请求(并下载其响应)。
  • 如果它返回一个 Response 对象,Scrapy 将不会调用任何其他 process_request()process_exception() 方法,也不会调用适当的下载函数;它将返回该响应。已安装中间件的 process_response() 方法始终在每个响应上调用。
  • 如果它返回一个 Request 对象,Scrapy 将停止调用 process_request() 方法并重新调度返回的请求。一旦新返回的请求执行,将在下载的响应上调用适当的中间件链。
  • 如果它引发 IgnoreRequest 异常,将调用已安装下载器中间件的 process_exception() 方法。如果它们都没有处理异常,则调用请求的 errback 函数 (Request.errback)。如果没有代码处理引发的异常,它将被忽略且不记录(与其他异常不同)。

参数:

  • request (Request 对象) – 正在处理的请求
  • spider (Spider 对象) – 此请求所属的 Spider

process_response(request, response, spider)

process_response() 应该返回 Response 对象、Request 对象或引发 IgnoreRequest 异常。

  • 如果它返回一个 Response(可以是给定的同一个响应,也可以是一个全新的响应),该响应将继续由链中下一个中间件的 process_response() 处理。
  • 如果它返回一个 Request 对象,中间件链将停止,返回的请求将被重新调度以供将来下载。这与从 process_request() 返回请求的行为相同。
  • 如果它引发 IgnoreRequest 异常,将调用请求的 errback 函数 (Request.errback)。如果没有代码处理引发的异常,它将被忽略且不记录(与其他异常不同)。

参数:

  • request (一个 Request 对象) – 产生响应的请求
  • response (Response 对象) – 正在处理的响应
  • spider (Spider 对象) – 此响应所属的 Spider

process_exception(request, exception, spider)

当下载处理程序或 process_request()(来自下载器中间件)引发异常(包括 IgnoreRequest 异常)时,Scrapy 会调用 process_exception()

process_exception() 应该返回:NoneResponse 对象或 Request 对象。

  • 如果它返回 None,Scrapy 将继续处理此异常,执行已安装中间件的任何其他 process_exception() 方法,直到没有中间件留下并且默认的异常处理开始。
  • 如果它返回一个 Response 对象,将启动已安装中间件的 process_response() 方法链,Scrapy 将不会调用任何其他中间件的 process_exception() 方法。
  • 如果它返回一个 Request 对象,返回的请求将被重新调度以供将来下载。这会停止中间件 process_exception() 方法的执行,就像返回响应一样。

参数:

  • request (一个 Request 对象) – 产生异常的请求
  • exception (一个 Exception 对象) – 引发的异常
  • spider (Spider 对象) – 此请求所属的 Spider

内置下载器中间件参考

本页描述了 Scrapy 附带的所有下载器中间件组件。有关如何使用它们以及如何编写自己的下载器中间件的信息,请参阅下载器中间件使用指南。

有关默认启用组件的列表(及其顺序),请参阅 DOWNLOADER_MIDDLEWARES_BASE 设置。

CookiesMiddleware

DefaultHeadersMiddleware

DownloadTimeoutMiddleware

HttpAuthMiddleware

HttpCacheMiddleware

HttpCompressionMiddleware

HttpProxyMiddleware

OffsiteMiddleware

RedirectMiddleware

MetaRefreshMiddleware

RetryMiddleware

RobotsTxtMiddleware

DownloaderStats

UserAgentMiddleware