爬虫框架Scrapy中DownloaderMiddleware的用法

DownloaderMiddleware:下载中间件。它是处于scrapy的Request和Response之间的处理模块。

  • 流程:
    Scheduler 从队列中拿出一个Request发送给Downloader执行下载,这个过程会经过DownloaderMiddleware的处理,另外,当Downloader将Response返回给Spider时会再次经过DownloadederMiddleware处理。

也就是说,DownloaderMiddleware在整个架构中起作用的位置是以下两个。

  1. 在Scheduler调度出队列的Request发送给下载器下载之前,我们可以在Request被执行下载之前对其进行修改。
  2. 在下载器下载完成发送给Spider之前,我们可以在Response被Spider解析之前对其进行修改。
    下载中间件的功能十分强大,修改User-Agent、处理重定向、设置代理、失败重试、设置Cookies等功能都需要借助它完成

使用说明

Scrapy已经提供了许多下载中间件,比如失败重试,自动重定向等。它们被DOWNLOADER_MIDDLEWARE_BASE变量所定义。
这是一个字典,键名为下载中间件的名称,键值代表了调用的优先级,数字越小代表越靠近Scrapy引擎,越大越靠近Downloader。
每个下载中间件都可以定义 process_request() 方法和 process_response() 方法来分别处理请求和响应。对于process_request()方法来说,优先级数字越小越先被调用,对于process_response() 方法来说,优先级数字越大越先被调用。
如果自己定义的下载中间件要添加到项目里,DOWNLOADER_MIDDLEWARE_BASE变量不能直接修改,Scrapy提供了另外一个设置变量DOWNLOADER_MIDDLEWARES,我们直接修改这个变量就可以添加自己定义的下载中间件,以及禁用DOWNLOADER_MIDDLEWARE_BASE里面定义的DOWNLOADER_MIDDLEWARE。

核心方法

核心方法有如下三个:

  • process_request(request, spider).
  • process_response(request,response,spider)
  • process_exception(request,exception,spider)
    我们只需要实现至少一个方法就可以定义一个下载中间件。

方法详解

process_request(request,spider)

在 Request被Scrapy引擎调度给下载器之前,我们可以使用此方法对Request进行处理。方法的返回值必须为 None、Response对象或者Request对象,或者抛出IgnoreRequest异常
参数:
1.request:Request对象,即被处理的Request。
2.spider: Spider对象,即此Request对应的Spider。

  • 当返回是None时,正常执行,这个过程就是修改Request的过程。
  • 当返回为Response对象时,更低优先级的下载中间件的process_request()方法和process_exception()方法就不i会被继续调用,每个下载中间件的process_response()方法被依次调用,调用完毕之后,直接将Response对象发送给Spider处理。
  • 当返回为Request对象时,更低优先级的下载中间件的process_request()方法会停止执行,这个Request会被重新方到调度队列里等待调用,如果被Scheduler调度了,那么所有的下载中间件的process_request()方法会被重新按照顺序执行。
  • 当抛出异常时,则所有的下载中间件的process_exception()方法会依次执行。如果没有一个方法处理这个异常,那么Request的erroback()方法就会回调,还没有处理该异常的方法,那么它就会被忽略。

process_response(request,response,spider)

在下载器执行下载之后,会得到Response,在引擎将Response发送给Spider解析之前,我们可以使用此方法对Response进行处理。方法的返回值必须为 Response对象或者Request对象,或者抛出IgnoreRequest异常
参数:
1.request:Request对象,即此Response对应的Request
2.response:Response对象,即此被处理的Response
3.spider:Spider对象,即此Response对应的Spider

  • 当返回为Request对象时,更低优先级的下载中间件的process_response()方法不会继续调用,该Request对象被重新放入调度队列等待调度。然后该Request会被process_request()方法顺次处理。
  • 当返回为Response对象时,更低优先级的下载中间件的process_response()方法会继续调用,继续对该Response进行处理。
  • 当返回异常时,同上。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容