下载器中间件
激活下载器中间件
要激活下载器中间件组件,请将其添加到 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() 应该返回 None、Response 对象、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() 应该返回:None、Response 对象或 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 设置。