举个例子:
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 (
Requestobject) -- 正在处理的请求spider (
Spiderobject) -- 此请求所针对的蜘蛛
- process_response(request, response, spider)¶
process_response()应该是:返回一个Response对象,则返回一个Request对象或引发IgnoreRequest例外情况。如果它返回
Response(可能是相同的给定响应,也可能是全新的响应),该响应将继续使用process_response()链中的下一个中间件。如果它返回一个
Request对象时,中间件链将暂停,返回的请求将重新计划为将来下载。这与从返回请求的行为相同process_request()。如果它引发了
IgnoreRequest异常,请求的errback函数 (Request.errback)。如果没有代码处理引发的异常,则忽略该异常,不记录该异常(与其他异常不同)。- 参数
request (is a
Requestobject) -- 发起响应的请求response (
Responseobject) -- 正在处理的响应spider (
Spiderobject) -- 此响应所针对的蜘蛛
- 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
Requestobject) -- 生成异常的请求exception (an
Exceptionobject) -- 引发的异常spider (
Spiderobject) -- 此请求所针对的蜘蛛
- from_crawler(cls, crawler)¶
如果存在,则调用该类方法从
Crawler. 它必须返回中间件的新实例。爬虫对象提供对所有零碎核心组件(如设置和信号)的访问;它是中间件访问它们并将其功能连接到零碎的一种方式。- 参数
crawler (
Crawlerobject) -- 使用此中间件的爬虫程序
