scrapy框架及中間件

scrapy框架官方圖如下


基本流程是
1.spider發(fā)出初始request需求阳掐,默認(rèn)是對(duì)start_urls發(fā)起get方法的request始衅,如果帶參數(shù)或者post就重寫start_requests(def start_requests(self):)
經(jīng)過(guò)spider middlewears的process_start_requests(self, start_requests, spider),準(zhǔn)備向服務(wù)器發(fā)起訪問(wèn)锚烦。

2.這時(shí)會(huì)經(jīng)過(guò)downloader middlewears的process_request(request, spider)觅闽,這里的中間件優(yōu)先級(jí)會(huì)比setting里的高,比如訪問(wèn)時(shí)要帶上特別的headers涮俄,user-agent蛉拙,proxy,cookies之類都在process_request中間件里定義彻亲。

3.得到response之后會(huì)經(jīng)過(guò)downloader middlewears的process_response(self, request, response, spider)孕锄,結(jié)果必須是其中之一
# - return a Response object
# - return a Request object
# - or raise IgnoreRequest

然后再經(jīng)過(guò)spider middlewears的process_spider_input(self, response, spider)這個(gè)中間件結(jié)果只能是none或者拋出異常。
經(jīng)過(guò)兩個(gè)中間件之后進(jìn)入spider進(jìn)行頁(yè)面解析苞尝,得到item或者一系列新的帶爬url畸肆,

4.item經(jīng)中間件process_spider_output(self, response, result, spider):此中間件必須返回an iterable of Request, dict or Item objects.
然后進(jìn)入pipeline進(jìn)行數(shù)據(jù)清洗下載。
spider返回的是url則經(jīng)中間件后又進(jìn)入scheduler排隊(duì)帶爬宙址。

我倒是覺(jué)得這個(gè)圖說(shuō)的更明白



當(dāng)然轴脐,我省去了scrapy engine,它是調(diào)度抡砂,所有request大咱,response及產(chǎn)生的數(shù)據(jù)都會(huì)經(jīng)他之手。


中間件

SpiderMiddleware主要處理解析Item的相關(guān)邏輯修正注益,比如數(shù)據(jù)不完整要添加默認(rèn)碴巾,增加其他額外信息等。
DownloaderMiddleware主要處理請(qǐng)求Request發(fā)出去和結(jié)果Response返回的一些回調(diào)丑搔,

上文其他未提及的中間件還有:SpiderMiddleware中的
process_spider_exception(self, response, exception, spider):
downloader middlewears中的
process_exception(self, request, exception, spider):可以處理超時(shí)
看名字就知道這是兩個(gè)異常中間件厦瓢。

downloader middlewears詳細(xì)說(shuō)明:

process_request(request,spider)

當(dāng)每個(gè)request通過(guò)下載中間件時(shí),該方法被調(diào)用啤月,這里有一個(gè)要求煮仇,該方法必須返回以下三種中的任意一種:None,返回一個(gè)Response對(duì)象,返回一個(gè)Request對(duì)象或raise IgnoreRequest谎仲。三種返回值的作用是不同的欺抗。
None:Scrapy將繼續(xù)處理該request,執(zhí)行其他的中間件的相應(yīng)方法强重,直到合適的下載器處理函數(shù)(download handler)被調(diào)用,該request被執(zhí)行(其response被下載)绞呈。
Response對(duì)象:Scrapy將不會(huì)調(diào)用任何其他的process_request()或process_exception() 方法贸人,或相應(yīng)地下載函數(shù);其將返回該response佃声。 已安裝的中間件的 process_response() 方法則會(huì)在每個(gè)response返回時(shí)被調(diào)用艺智。
Request對(duì)象:Scrapy則停止調(diào)用 process_request方法并重新調(diào)度返回的request。當(dāng)新返回的request被執(zhí)行后圾亏, 相應(yīng)地中間件鏈將會(huì)根據(jù)下載的response被調(diào)用十拣。
raise一個(gè)IgnoreRequest異常:則安裝的下載中間件的 process_exception() 方法會(huì)被調(diào)用。如果沒(méi)有任何一個(gè)方法處理該異常志鹃, 則request的errback(Request.errback)方法會(huì)被調(diào)用夭问。如果沒(méi)有代碼處理拋出的異常, 則該異常被忽略且不記錄曹铃。

process_response(request, response, spider)

可以看返回是否是200加入重試機(jī)制
process_response的返回值也是有三種:response對(duì)象缰趋,request對(duì)象,或者raise一個(gè)IgnoreRequest異常
如果其返回一個(gè)Response(可以與傳入的response相同陕见,也可以是全新的對(duì)象)秘血, 該response會(huì)被在鏈中的其他中間件的 process_response() 方法處理。
如果其返回一個(gè) Request 對(duì)象评甜,則中間件鏈停止灰粮, 返回的request會(huì)被重新調(diào)度下載。處理類似于 process_request() 返回request所做的那樣忍坷。
如果其拋出一個(gè) IgnoreRequest 異常粘舟,則調(diào)用request的errback(Request.errback)。 如果沒(méi)有代碼處理拋出的異常佩研,則該異常被忽略且不記錄(不同于其他異常那樣)柑肴。

參考:
https://www.cnblogs.com/x-pyue/p/7795315.html
https://www.colabug.com/2119457.html
https://www.cnblogs.com/zhaof/p/7198407.html
https://blog.csdn.net/xnby/article/details/52297047

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市韧骗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌零聚,老刑警劉巖袍暴,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異隶症,居然都是意外死亡政模,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蚂会,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)淋样,“玉大人,你說(shuō)我怎么就攤上這事胁住〕煤铮” “怎么了刊咳?”我有些...
    開(kāi)封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)儡司。 經(jīng)常有香客問(wèn)我娱挨,道長(zhǎng),這世上最難降的妖魔是什么捕犬? 我笑而不...
    開(kāi)封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任跷坝,我火速辦了婚禮,結(jié)果婚禮上碉碉,老公的妹妹穿的比我還像新娘柴钻。我一直安慰自己,他們只是感情好垢粮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布贴届。 她就那樣靜靜地躺著,像睡著了一般足丢。 火紅的嫁衣襯著肌膚如雪粱腻。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天斩跌,我揣著相機(jī)與錄音绍些,去河邊找鬼。 笑死耀鸦,一個(gè)胖子當(dāng)著我的面吹牛柬批,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袖订,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼氮帐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了洛姑?” 一聲冷哼從身側(cè)響起上沐,我...
    開(kāi)封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎楞艾,沒(méi)想到半個(gè)月后参咙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡硫眯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蕴侧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片两入。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡净宵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情择葡,我是刑警寧澤紧武,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站刁岸,受9級(jí)特大地震影響脏里,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜虹曙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一迫横、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酝碳,春花似錦矾踱、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至返奉,卻和暖如春贝搁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芽偏。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工雷逆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人污尉。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓膀哲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親被碗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子某宪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容