9.4-Scrapy框架爬虫【进阶】-Downloader Middleware用法

下载器中间件(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元数据来开启代理。

转载于:https://my.oschina.net/pansy0425/blog/3093084

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值