举个例子:
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(request, spider)¶
对于通过下载中间件的每个请求调用此方法。
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(request, response, spider)¶
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(request, exception, spider)¶
Scrapy电话
process_exception()
当下载处理程序或process_request()
(从下载器中间件)引发异常(包括IgnoreRequest
例外)process_exception()
应返回:任一None
,aResponse
对象,或一个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(cls, crawler)¶
如果存在,则调用该类方法从
Crawler
. 它必须返回中间件的新实例。爬虫对象提供对所有零碎核心组件(如设置和信号)的访问;它是中间件访问它们并将其功能连接到零碎的一种方式。- 参数
crawler (
Crawler
object) -- 使用此中间件的爬虫程序