Scrapy 源碼剖析:架構(gòu)概覽
介紹

使用? scrapy startproject?命令創(chuàng)建一個(gè)爬蟲(chóng)模板,或自己按模板編寫(xiě)爬蟲(chóng)代碼定義一個(gè)爬蟲(chóng)類(lèi),并繼承? scrapy.Spider,然后重寫(xiě)?parse?方法parse?方法里編寫(xiě)網(wǎng)頁(yè)解析邏輯,以及抓取路徑使用? scrapy runspider?運(yùn)行這個(gè)爬蟲(chóng)
架構(gòu)

核心模塊
Scrapy Engine:核心引擎,負(fù)責(zé)控制和調(diào)度各個(gè)組件,保證數(shù)據(jù)流轉(zhuǎn);Scheduler:負(fù)責(zé)管理任務(wù)、過(guò)濾任務(wù)、輸出任務(wù)的調(diào)度器,存儲(chǔ)、去重任務(wù)都在此控制;Downloader:下載器,負(fù)責(zé)在網(wǎng)絡(luò)上下載數(shù)據(jù),輸入待下載的 URL,輸出下載結(jié)果;Spiders:我們自己編寫(xiě)的爬蟲(chóng)邏輯,定義抓取意圖;Item Pipeline:負(fù)責(zé)輸出結(jié)構(gòu)化數(shù)據(jù),可自定義格式和輸出的位置;
Downloader middlewares:介于引擎和下載器之間,可以在網(wǎng)頁(yè)在下載前、后進(jìn)行邏輯處理;Spider middlewares:介于引擎和爬蟲(chóng)之間,在向爬蟲(chóng)輸入下載結(jié)果前,和爬蟲(chóng)輸出請(qǐng)求 / 數(shù)據(jù)后進(jìn)行邏輯處理;
運(yùn)行流程
引擎從自定義爬蟲(chóng)中獲取初始化請(qǐng)求(也叫種子 URL); 引擎把該請(qǐng)求放入調(diào)度器中,同時(shí)調(diào)度器向引擎獲取待下載的請(qǐng)求; 調(diào)度器把待下載的請(qǐng)求發(fā)給引擎; 引擎發(fā)送請(qǐng)求給下載器,中間會(huì)經(jīng)過(guò)一系列下載器中間件; 這個(gè)請(qǐng)求通過(guò)下載器下載完成后,生成一個(gè)響應(yīng)對(duì)象,返回給引擎,這中間會(huì)再次經(jīng)過(guò)一系列下載器中間件; 引擎接收到下載器返回的響應(yīng)后,發(fā)送給爬蟲(chóng),中間會(huì)經(jīng)過(guò)一系列爬蟲(chóng)中間件,最后執(zhí)行爬蟲(chóng)自定義的解析邏輯; 爬蟲(chóng)執(zhí)行完自定義的解析邏輯后,生成結(jié)果對(duì)象或新的請(qǐng)求對(duì)象給引擎,再次經(jīng)過(guò)一系列爬蟲(chóng)中間件; 引擎把爬蟲(chóng)返回的結(jié)果對(duì)象交由結(jié)果處理器處理,把新的請(qǐng)求通過(guò)引擎再交給調(diào)度器; 重復(fù)執(zhí)行1-8,直到調(diào)度器中沒(méi)有新的請(qǐng)求處理,任務(wù)結(jié)束;
核心模塊的協(xié)作

Scrapyer?模塊,其實(shí)這也是 Scrapy 的一個(gè)核心模塊,但官方的架構(gòu)圖中沒(méi)有展示出來(lái)。這個(gè)模塊其實(shí)是處于?Engine、Spiders、Pipeline?之間,是連接這 3 個(gè)模塊的橋梁,我會(huì)在后面的源碼分析文章中具體講到。核心類(lèi)圖

沒(méi)有樣式的黑色文字是類(lèi)的核心屬性; 標(biāo)有黃色樣式的高亮文字是類(lèi)的核心方法;
五大核心類(lèi): Scrapy Engine、Scheduler、Downloader、Spiders、Item Pipeline四個(gè)中間件管理器類(lèi): DownloaderMiddlewareManager、SpiderMiddlewareManager、ItemPipelineMiddlewareManager、ExtensionManager其他輔助類(lèi): Request、Response、Selector
更多閱讀
特別推薦

點(diǎn)擊下方閱讀原文加入社區(qū)會(huì)員
評(píng)論
圖片
表情
