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

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

更新時間:2020-09-30 來源:黑馬程序員 瀏覽量:

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

Scrapy架構(gòu)

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

1601448357608_Scrapy.jpg

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

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

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

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

(4)Spiders(爬蟲):負(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ì)分析、過濾、存儲等)。

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

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

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

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

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

(1)引擎向Spider請求第一個要爬取的URL(s)。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

猜你喜

多線程爬蟲是什么?多線程爬蟲流程分析 

Python爬蟲可以做什么?

Python培訓(xùn)課程 



分享到:
在線咨詢 我要報名
和我們在線交談!