一、運(yùn)行流程
1、數(shù)據(jù)流
-
下圖顯示了Scrapy框架的體系結(jié)構(gòu)及其組件,以及系統(tǒng)內(nèi)部發(fā)生的數(shù)據(jù)流(由紅色的箭頭顯示)
Scrapy中的數(shù)據(jù)流由執(zhí)行引擎控制,流程如下:
(1)首先從爬蟲(chóng)獲取初始的請(qǐng)求
(2)將請(qǐng)求放入調(diào)度模塊,然后獲取下一個(gè)需要爬取的請(qǐng)求
(3)調(diào)度模塊返回下一個(gè)需要爬取的請(qǐng)求給引擎
(4)引擎將請(qǐng)求發(fā)送給下載器,依次穿過(guò)所有的下載中間件
(5)一旦頁(yè)面下載完成,下載器會(huì)返回一個(gè)響應(yīng)包含了頁(yè)面數(shù)據(jù),然后再依次穿過(guò)所有的下載中間件。
(6)引擎從下載器接收到響應(yīng),然后發(fā)送給爬蟲(chóng)進(jìn)行解析,依次穿過(guò)所有的爬蟲(chóng)中間件
(7)爬蟲(chóng)處理接收到的響應(yīng),然后解析出item和生成新的請(qǐng)求,并發(fā)送給引擎
(8)引擎將已經(jīng)處理好的item發(fā)送給管道組件,將生成好的新的請(qǐng)求發(fā)送給調(diào)度模塊,并請(qǐng)求下一個(gè)請(qǐng)求
以上過(guò)程重復(fù),直到調(diào)度程序不再有請(qǐng)求為止。
2、組件介紹
-
Scrapy引擎
引擎負(fù)責(zé)控制系統(tǒng)所有組件之間的數(shù)據(jù)流,并在發(fā)生某些操作時(shí)觸發(fā)事件。 -
調(diào)度程序
調(diào)度程序接收來(lái)自引擎的請(qǐng)求,將它們排入隊(duì)列,以便稍后引擎請(qǐng)求它們。 -
下載器
下載程序負(fù)責(zé)獲取web頁(yè)面并將它們提供給引擎,引擎再將它們提供給spider。 -
爬蟲(chóng)
爬蟲(chóng)是由用戶編寫(xiě)的自定義的類(lèi),用于解析響應(yīng),從中提取數(shù)據(jù),或其他要抓取的請(qǐng)求。 -
item管道
管道負(fù)責(zé)在數(shù)據(jù)被爬蟲(chóng)提取后進(jìn)行后續(xù)處理。典型的任務(wù)包括清理,驗(yàn)證和持久性(如將數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中)框架。它使用非阻塞(也成為異步)代碼實(shí)現(xiàn)并發(fā)。
3、中間件
(1)下載中間件
下載中間件是位于引擎和下載器之間的特定的鉤子,它們處理從引擎?zhèn)鬟f到下載器的請(qǐng)求,以及下載器傳遞到引擎的響應(yīng)。- 如果你要執(zhí)行以下操作之一,請(qǐng)使用Downloader中間件:
1、在請(qǐng)求發(fā)送到下載程序之前處理請(qǐng)求(即在scrapy將請(qǐng)求發(fā)送到網(wǎng)站之前)
2、在響應(yīng)發(fā)送給爬蟲(chóng)之前
3、直接發(fā)送新的請(qǐng)求,而不是將收到的響應(yīng)傳遞給蜘蛛
4、將響應(yīng)傳遞給爬行器而不獲取web頁(yè)面;
5、默默的放棄一些請(qǐng)求
(2)爬蟲(chóng)中間件
爬蟲(chóng)中間件是位于引擎和爬蟲(chóng)之間的特定的鉤子,能夠處理傳入的響應(yīng)和傳遞出去的item和請(qǐng)求。- 如果你需要以下操作請(qǐng)使用爬蟲(chóng)中間件:
1、處理爬蟲(chóng)回調(diào)之后的 請(qǐng)求或item
2、處理start_requests
3、處理爬蟲(chóng)異常
4、根據(jù)響應(yīng)內(nèi)容調(diào)用errback而不是回調(diào)請(qǐng)求
(3)事件驅(qū)動(dòng)的網(wǎng)絡(luò)
scrapy 是用Twisted編寫(xiě)的,Twisted是一個(gè)流行的事件驅(qū)動(dòng)的Python網(wǎng)絡(luò)框架。它使用非阻塞(也稱(chēng)為異步)代碼實(shí)現(xiàn)并發(fā)。
