下载器中间件(Downloader Middleware)
- 其介于Scrapy的request/response处理的钩子框架。
- 是用于全局修改Scrapy request和response的一个轻量、底层的系统。
1、激活下载器中间件
要激活下载器中间件组件,将其加入到DOWNLOADER_MIDDLEWARES设置中,在settings.py中进行测试。
比如:在settings.py中:
DOWNLOADER_MIDDLEWARES = {'myproject.middlewares.CustomDownloaderMiddleware': 543,} #后面的值为优先级,值越小,优先级越高。
如果想禁止内置的(在DOWNLOADER_MIDDLEWARES中设置并默认开启的)中间件,必须在项目的DOWNLOADER_MIDDLEWARES设置中定义该中间件,并将其赋值为None。
比如,想要关闭User-Agent中间件:
DOWMLOADER_MIDDLEWARES={
'myproject.middlewares.CustomDownloaderMiddleware': 543,
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,
}
2、编写自己的下载中间件
每个中间件组件是一个定义了以下一个或多个方法的Python类:
classscrapy.downloadermiddlewares.DownloaderMiddleware的方法如下:
(2-1)process_request(request,spider) 当每个request通过下载中间件时,该方法被调用
其必须返回其中之一:None,Request对象,Response对象,raise IgnoreRequest
①若返回None,Scrapy将继续处理该request,执行其他的中间件的相应方法,知道合适的下载器函数(downloader handler)被调用,该response被执行(其余response被下载)
②若返回Response对象,Scrapy将不会调用任何其他的process_request()或process_expection()方法或相应的下载函数;其将返回该response,已安装的中间件的process_response()方法则会在每个response返回时被调用
③若返回Request对象,Scrapy则停止调用process_request方法并重新调度返回的request。当新返回的request被执行后,相应的中间件链将会根据下载的response被调用
④若返回raise IgnoreRequest异常,则安装的下载中间件的process_exception()方法会被调用
- 如果没有任何一个方法处理该异常,则request的errback(Request.errback)方法将会被调用
- 如果没有代码处理抛出的异常,则该异常被忽略且不记录(不同于其他异常)
参数:
- request (Request对象)----->处理的request
- spider (Spider对象)------>该request对于的spider
(2-2)process_response(request,response,spider)
其必须返回其中之一:Request对象,Response对象,raise IgnoreRequest
①若返回Request对象,则中间件链停止,返回的request会被重新调度下载。处理类似于process_request()返回request所做的那样。
②若返回Response对象(可以与传入的Response相同,也可是全新的对象),该response会被在链中的其他中间件的process_item()处理。
③若返回raise IgnoreRequest异常,则安装的下载中间件的process_exception()方法会被调用
参数:
- request (Request对象)----->response对应的request
- response (Response对象)------>被处理的response
- spider (Spider对象)----->response所对应的spider
(2-3)process_exception(request,exception,spider) 一般用于:抛出异常时
其必须返回其中之一:None,Response对象,Request对象
①若返回None,Scrapy将会继续处理该异常,接着调用已安置的其他中间件的process_exception()方法,知道所有中间件都被调用完毕,则调用默认的异常处理。
②若返回Response对象,则已安装的中间件链为process_response()方法被调用。Scrapy将不会调用其他中间件的process_exception。
③若返回Request对象,则返回的Request将会被重新调用下载,这将停止中间件的process_exception()方法执行。
参数:
- request (Request对象)----->产生异常的request
- exception (Exception对象)------>抛出的异常
- spider (Spider对象)----->request对应的spider
3、Scrapy中内置下载中间件
(3-1)CookiesMiddleware
class scrapy.downloadermiddlewares.cookies.CookiesMiddleware
其追踪了Web Server发送的cookie,并在之后的request中发送出去。
在settings.py中设置如下用来配置cookie中间件:
- COOKIES_ENABLED
- COOKIES_DEBUG
(3-2)DefaultHeadersMiddleware
class scrapy.downloadermiddlewares.defaultheaders.DafaultHeadersMiddleware
该中间件设置DEFAULT_REQUEST_HEADERS指定的默认request header
(3-3)DownloadTimeoutMiddleware
class scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware
该中间件设置DOWNLOAD_TIMEOUT指定的request下载超时时间
(3-4)HttpAuthMiddleware
class scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware
该中间件完成某些使用Basic access authentication(或者HTTP认证)的spider生成的请求的认证过程。
在spider中启用HTTP认证,请设置spider的http_user(即http_pass属性)
例子:
from scrapy.spiders import CrawlSpider class SomeIntranetSiteSpider(CrawlSpider): http_user='someuser' http_pass='somepass' name='intranet.example.com' #spider代码的其余部分被省略
(3-5)HttpCompressionMiddleware
class scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware
该中间件提供了对压缩(gzip,deflate)数据的支持。
(3-6)ChunkedTransferMiddleware
class scrapy.downloadermiddlewares.chunked.ChunkedTransferMiddleware
该中间件添加对chunked transfer encoding的支持。
(3-6)HttpProxyMiddleware
class scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware
该中间件提供了对request设置HTTP代理的支持。可以通过在Request对象中设置proxy元数据来开启代理。