全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

首頁(yè)技術(shù)文章正文

Scrapy框架的工作原理是什么?

更新時(shí)間:2020-09-30 來(lái)源:黑馬程序員 瀏覽量:

Scrapy框架的工作原理是什么?

Scrapy架構(gòu)

學(xué)習(xí)Scrapy框架,從理解它的架構(gòu)開(kāi)始。圖1所示是Scrapy的架構(gòu)圖。

1601448357608_Scrapy.jpg

從圖1可知,Scrapy框架主要包含以下組件:

(1)Scrapy Engine(引擎):負(fù)責(zé)Spider、Item Pipeline、Downloader、Scheduler之間的通訊,包括信號(hào)和數(shù)據(jù)的傳遞等。

(2)Scheduler(調(diào)度器):負(fù)責(zé)接受引擎發(fā)送過(guò)來(lái)的Request請(qǐng)求,并按照一定的方式進(jìn)行整理排列和入隊(duì),當(dāng)引擎需要時(shí),交還給引擎。

(3)Downloader(下載器):負(fù)責(zé)下載Scrapy Engine(引擎)發(fā)送的所有Requests(請(qǐng)求),并將其獲取到的Responses(響應(yīng))交還給Scrapy Engine(引擎),由引擎交給Spider來(lái)處理。

(4)Spiders(爬蟲(chóng)):負(fù)責(zé)處理所有Responses,從中分析提取數(shù)據(jù),獲取Item字段需要的數(shù)據(jù),并將需要跟進(jìn)的URL提交給引擎,再次進(jìn)入Scheduler(調(diào)度器)。

(5)Item Pipeline(管道):負(fù)責(zé)處理Spiders中獲取到的Item數(shù)據(jù),并進(jìn)行后期處理(詳細(xì)分析、過(guò)濾、存儲(chǔ)等)。

(6)Downloader Middlewares(下載中間件):是一個(gè)可以自定義擴(kuò)展下載功能的組件。

(7)Spider Middlewares(Spider中間件):是一個(gè)可以自定義擴(kuò)展Scrapy Engine和Spiders中間通信的功能組件(比如進(jìn)入Spiders的Responses和從Spiders出去的Requests)。

Scrapy的這些組件通力合作,共同完成整個(gè)爬取任務(wù)。架構(gòu)圖中的箭頭是數(shù)據(jù)的流動(dòng)方向,首先從初始URL開(kāi)始,Scheduler會(huì)將其交給Downloader進(jìn)行下載,下載之后會(huì)交給Spider進(jìn)行分析,Spider分析出來(lái)的結(jié)果有兩種:一種是需要進(jìn)一步抓取的鏈接,例如之前分析的“下一頁(yè)”的鏈接,這些東西會(huì)被傳回Scheduler;另一種是需要保存的數(shù)據(jù),它們則被送到Item Pipeline那里,那是對(duì)數(shù)據(jù)進(jìn)行后期處理(詳細(xì)分析、過(guò)濾、存儲(chǔ)等)的地方。另外,在數(shù)據(jù)流動(dòng)的通道里還可以安裝各種中間件,進(jìn)行必要的處理。

Scrapy框架的運(yùn)作流程

Scrapy的運(yùn)作流程由引擎控制,其過(guò)程如下所示:

(1)引擎向Spider請(qǐng)求第一個(gè)要爬取的URL(s)。

(2)引擎從Spider中獲取到第一個(gè)要爬取的URL,封裝成Request并交給調(diào)度器。

(3)引擎向調(diào)度器請(qǐng)求下一個(gè)要爬取的Request。

(4)調(diào)度器返回下一個(gè)要爬取的Request給引擎,引擎將Request通過(guò)下載中間件轉(zhuǎn)發(fā)給下載器。

(5)一旦頁(yè)面下載完畢,下載器生成一個(gè)該頁(yè)面的Response,并將其通過(guò)下載中間件發(fā)送給引擎。

(6)引擎從下載器中接收到Response并通過(guò)Spider中間件發(fā)送給Spider處理。

(7)Spider處理Response并返回爬取到的Item及新的Request給引擎。

(8)引擎將爬取到的Item給Item Pipeline,將Request給調(diào)度器。

(9)從(2)開(kāi)始重復(fù),直到調(diào)度器中沒(méi)有更多的Request。

多學(xué)一招:Scrapy擬人小劇場(chǎng)

為了幫助大家更好地理解Scrapy的一次完整運(yùn)行流程,我們可以把Scrapy的運(yùn)作流程用擬人小劇場(chǎng)的方式進(jìn)行表現(xiàn),如下所示:

(1)引擎:Hi!Spider,你要處理哪一個(gè)網(wǎng)站?

(2)Spider:老大要我處理xxxx.com。

(3)引擎:你把第一個(gè)需要處理的URL給我吧。

(4)Spider:給你,第一個(gè)URL是xxxxxxx.com。

(5)引擎:Hi!調(diào)度器,我這有Request請(qǐng)求,你幫我排序入隊(duì)一下。

(6)調(diào)度器:好的,正在處理,你等一下。

(7)引擎:Hi!調(diào)度器,把你處理好的Request請(qǐng)求給我。

(8)調(diào)度器:給你,這是我處理好的Request。

(9)引擎:Hi!下載器,你按照老大的下載中間件的設(shè)置幫我下載一下這個(gè)Request請(qǐng)求。

(10)下載器:好的!給你,這是下載好的東西。(如果失?。篠orry,這個(gè)Request下載失敗了。然后引擎告訴調(diào)度器,這個(gè)Request下載失敗了,你記錄一下,我們待會(huì)兒再下載)。

(11)引擎:Hi!Spider,這是下載好的東西,并且已經(jīng)按照老大的下載中間件處理過(guò)了,你自己處理一下(注意!這兒Responses默認(rèn)是交給def parse()這個(gè)函數(shù)處理的)。

(12)Spider:(處理完畢數(shù)據(jù)之后對(duì)于需要跟進(jìn)的URL),Hi!引擎,我這里有兩個(gè)結(jié)果,這個(gè)是我需要跟進(jìn)的URL,還有這個(gè)是我獲取到的Item數(shù)據(jù)。

(13)引擎:Hi !管道,我這兒有個(gè)item你幫我處理一下!調(diào)度器!這是需要跟進(jìn)的URL你幫我處理下。

(14)管道,調(diào)度器:好的,現(xiàn)在就做!

然后從(4)開(kāi)始循環(huán),直到獲取完老大需要的全部信息。

猜你喜

多線(xiàn)程爬蟲(chóng)是什么?多線(xiàn)程爬蟲(chóng)流程分析 

Python爬蟲(chóng)可以做什么?

Python培訓(xùn)課程 



分享到:
在線(xiàn)咨詢(xún) 我要報(bào)名
和我們?cè)诰€(xiàn)交談!