人生苦短,我用 Python
前文传送门:
小白学 Python 爬虫(2):前置准备(一)基本类库的安装
小白学 Python 爬虫(3):前置准备(二)Linux基础入门
小白学 Python 爬虫(4):前置准备(三)Docker基础入门
小白学 Python 爬虫(5):前置准备(四)数据库基础
小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装
小白学 Python 爬虫(7):HTTP 基础
小白学 Python 爬虫(8):网页基础
小白学 Python 爬虫(9):爬虫基础
小白学 Python 爬虫(10):Session 和 Cookies
小白学 Python 爬虫(11):urllib 基础使用(一)
小白学 Python 爬虫(12):urllib 基础使用(二)
小白学 Python 爬虫(13):urllib 基础使用(三)
小白学 Python 爬虫(14):urllib 基础使用(四)
小白学 Python 爬虫(15):urllib 基础使用(五)
小白学 Python 爬虫(16):urllib 实战之爬取妹子图
小白学 Python 爬虫(17):Requests 基础使用
小白学 Python 爬虫(18):Requests 进阶操作
小白学 Python 爬虫(19):Xpath 基操
小白学 Python 爬虫(20):Xpath 进阶
小白学 Python 爬虫(21):解析库 Beautiful Soup(上)
小白学 Python 爬虫(22):解析库 Beautiful Soup(下)
小白学 Python 爬虫(23):解析库 pyquery 入门
小白学 Python 爬虫(24):2019 豆瓣电影排行
小白学 Python 爬虫(25):爬取股票信息
小白学 Python 爬虫(26):为啥买不起上海二手房你都买不起
小白学 Python 爬虫(27):自动化测试框架 Selenium 从入门到放弃(上)
小白学 Python 爬虫(28):自动化测试框架 Selenium 从入门到放弃(下)
小白学 Python 爬虫(29):Selenium 获取某大型电商网站商品信息
小白学 Python 爬虫(30):代理基础
小白学 Python 爬虫(31):自己构建一个简单的代理池
小白学 Python 爬虫(32):异步请求库 AIOHTTP 基础入门
小白学 Python 爬虫(33):爬虫框架 Scrapy 入门基础(一)
小白学 Python 爬虫(34):爬虫框架 Scrapy 入门基础(二)
小白学 Python 爬虫(35):爬虫框架 Scrapy 入门基础(三) Selector 选择器
引言Downloader Middleware 直译过来是下载器中间件,本文后续就叫它下载中间件了。
下载器中间件主要用于 Scrapy 的 Request 和 Response 处理。
Downloader Middleware 的功能非常的强大,可以修改 UA 头、处理重定向、设置代理、设置超时时间、失败重试、设置 Cookies 等功能。
内置下载器中间件Scrapy 已经为我们提供相当多的内置的下载器中间件,用于各种功能,列表如下:
{ 'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100, 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 300, 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350, 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': 400, 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 500, 'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550, 'scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware': 560, 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590, 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600, 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700, 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750, 'scrapy.downloadermiddlewares.stats.DownloaderStats': 850, 'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900, }这些列表定义在 DOWNLOADER_MIDDLEWARES_BASE 变量中。
这些列表的数据结构是一个字典格式,后面的值代表了优先级,数字越小代表了越靠近 Scrapy 引擎,数字越大越靠近下载器,数字小的会被优先调用。
自定义下载器中间件如果要在项目自定义一个下载器中间件,需要我们自己设置 DOWNLOADER_MIDDLEWARES 这个变量,这个变量位于 settings.py ,默认是注释状态,当我们需要的时候直接打开这个注释就可以了,这里不仅可以自定义我们所需要的下载器中间件,还可以禁用 DOWNLOADER_MIDDLEWARES_BASE 中定义的下载器中间件。
每个下载器中间件都是一个Python类,该类定义了以下定义的一个或多个方法。
核心方法共有 4 个,如下:
process_request(request, spider)
process_response(request, response, spider)
process_exception(request, exception, spider)
from_crawler(cls, crawler)
而我们至少只需要实现其中的一个方法就可以定义一个下载器中间件。
process_request(request, spider)参数:
request(Request对象)–正在处理的请求
spider(Spider对象)–此请求所针对的蜘蛛
对于通过下载中间件的每个请求,都会调用此方法。
process_request() 应该是:return None,返回一个 Response 对象,返回一个Request 对象或引发 IgnoreRequest 异常。
如果返回 None ,则 Scrapy 将继续处理此请求,执行所有其他中间件,直到最终将适当的下载程序处理程序称为执行的请求(并下载了其响应)。