Python抓取框架 Scrapy的架構(gòu)
最近在學(xué)Python,同時(shí)也在學(xué)如何使用python抓取數(shù)據(jù),于是就被我發(fā)現(xiàn)了這個(gè)非常受歡迎的Python抓取框架Scrapy,下面一起學(xué)習(xí)下Scrapy的架構(gòu),便于更好的使用這個(gè)工具。
一、概述
下圖顯示了Scrapy的大體架構(gòu),其中包含了它的主要組件及系統(tǒng)的數(shù)據(jù)處理流程(綠色箭頭所示)。下面就來(lái)一個(gè)個(gè)解釋每個(gè)組件的作用及數(shù)據(jù)的處理過(guò)程。

二、組件
1、Scrapy Engine(Scrapy引擎)
Scrapy引擎是用來(lái)控制整個(gè)系統(tǒng)的數(shù)據(jù)處理流程,并進(jìn)行事務(wù)處理的觸發(fā)。更多的詳細(xì)內(nèi)容可以看下面的數(shù)據(jù)處理流程。
2、Scheduler(調(diào)度)
調(diào)度程序從Scrapy引擎接受請(qǐng)求并排序列入隊(duì)列,并在Scrapy引擎發(fā)出請(qǐng)求后返還給他們。
3、Downloader(下載器)
下載器的主要職責(zé)是抓取網(wǎng)頁(yè)并將網(wǎng)頁(yè)內(nèi)容返還給蜘蛛( Spiders)。
4、Spiders(蜘蛛)
蜘蛛是有Scrapy用戶自己定義用來(lái)解析網(wǎng)頁(yè)并抓取制定URL返回的內(nèi)容的類,每個(gè)蜘蛛都能處理一個(gè)域名或一組域名。換句話說(shuō)就是用來(lái)定義特定網(wǎng)站的抓取和解析規(guī)則。
蜘蛛的整個(gè)抓取流程(周期)是這樣的:
1).首先獲取第一個(gè)URL的初始請(qǐng)求,當(dāng)請(qǐng)求返回后調(diào)取一個(gè)回調(diào)函數(shù)。第一個(gè)請(qǐng)求是通過(guò)調(diào)用start_requests()方法。該方法默認(rèn)從start_urls中的Url中生成請(qǐng)求,并執(zhí)行解析來(lái)調(diào)用回調(diào)函數(shù)。
2).在回調(diào)函數(shù)中,你可以解析網(wǎng)頁(yè)響應(yīng)并返回項(xiàng)目對(duì)象和請(qǐng)求對(duì)象或兩者的迭代。這些請(qǐng)求也將包含一個(gè)回調(diào),然后被Scrapy下載,然后有指定的回調(diào)處理。
3).在回調(diào)函數(shù)中,你解析網(wǎng)站的內(nèi)容,同程使用的是Xpath選擇器(但是你也可以使用BeautifuSoup, lxml或其他任何你喜歡的程序),并生成解析的數(shù)據(jù)項(xiàng)。
4).最后,從蜘蛛返回的項(xiàng)目通常會(huì)進(jìn)駐到項(xiàng)目管道。
5、Item Pipeline(項(xiàng)目管道)
項(xiàng)目管道的主要責(zé)任是負(fù)責(zé)處理有蜘蛛從網(wǎng)頁(yè)中抽取的項(xiàng)目,他的主要任務(wù)是清晰、驗(yàn)證和存儲(chǔ)數(shù)據(jù)。當(dāng)頁(yè)面被蜘蛛解析后,將被發(fā)送到項(xiàng)目管道,并經(jīng)過(guò)幾個(gè)特定的次序處理數(shù)據(jù)。每個(gè)項(xiàng)目管道的組件都是有一個(gè)簡(jiǎn)單的方法組成的Python類。他們獲取了項(xiàng)目并執(zhí)行他們的方法,同時(shí)他們還需要確定的是是否需要在項(xiàng)目管道中繼續(xù)執(zhí)行下一步或是直接丟棄掉不處理。
項(xiàng)目管道通常執(zhí)行的過(guò)程有:
1).清洗HTML數(shù)據(jù)
2).驗(yàn)證解析到的數(shù)據(jù)(檢查項(xiàng)目是否包含必要的字段)
3).檢查是否是重復(fù)數(shù)據(jù)(如果重復(fù)就刪除)
4).將解析到的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中
6、Downloader middlewares(下載器中間件)
下載中間件是位于Scrapy引擎和下載器之間的鉤子框架,主要是處理Scrapy引擎與下載器之間的請(qǐng)求及響應(yīng)。它提供了一個(gè)自定義的代碼的方式來(lái)拓展Scrapy的功能。下載中間器是一個(gè)處理請(qǐng)求和響應(yīng)的鉤子框架。他是輕量級(jí)的,對(duì)Scrapy盡享全局控制的底層的系統(tǒng)。
7、Spider middlewares(蜘蛛中間件)
蜘蛛中間件是介于Scrapy引擎和蜘蛛之間的鉤子框架,主要工作是處理蜘蛛的響應(yīng)輸入和請(qǐng)求輸出。它提供一個(gè)自定義代碼的方式來(lái)拓展Scrapy的功能。蛛中間件是一個(gè)掛接到Scrapy的蜘蛛處理機(jī)制的框架,你可以插入自定義的代碼來(lái)處理發(fā)送給蜘蛛的請(qǐng)求和返回蜘蛛獲取的響應(yīng)內(nèi)容和項(xiàng)目。
8、Scheduler middlewares(調(diào)度中間件)
調(diào)度中間件是介于Scrapy引擎和調(diào)度之間的中間件,主要工作是處從Scrapy引擎發(fā)送到調(diào)度的請(qǐng)求和響應(yīng)。他提供了一個(gè)自定義的代碼來(lái)拓展Scrapy的功能。
三、數(shù)據(jù)處理流程
Scrapy的整個(gè)數(shù)據(jù)處理流程有Scrapy引擎進(jìn)行控制,其主要的運(yùn)行方式為:
引擎打開一個(gè)域名,時(shí)蜘蛛處理這個(gè)域名,并讓蜘蛛獲取第一個(gè)爬取的URL。
引擎從蜘蛛那獲取第一個(gè)需要爬取的URL,然后作為請(qǐng)求在調(diào)度中進(jìn)行調(diào)度。
引擎從調(diào)度那獲取接下來(lái)進(jìn)行爬取的頁(yè)面。
調(diào)度將下一個(gè)爬取的URL返回給引擎,引擎將他們通過(guò)下載中間件發(fā)送到下載器。
當(dāng)網(wǎng)頁(yè)被下載器下載完成以后,響應(yīng)內(nèi)容通過(guò)下載中間件被發(fā)送到引擎。
引擎收到下載器的響應(yīng)并將它通過(guò)蜘蛛中間件發(fā)送到蜘蛛進(jìn)行處理。
蜘蛛處理響應(yīng)并返回爬取到的項(xiàng)目,然后給引擎發(fā)送新的請(qǐng)求。
引擎將抓取到的項(xiàng)目項(xiàng)目管道,并向調(diào)度發(fā)送請(qǐng)求。
系統(tǒng)重復(fù)第二部后面的操作,直到調(diào)度中沒(méi)有請(qǐng)求,然后斷開引擎與域之間的聯(lián)系。
四、驅(qū)動(dòng)器
Scrapy是由Twisted寫的一個(gè)受歡迎的Python事件驅(qū)動(dòng)網(wǎng)絡(luò)框架,它使用的是非堵塞的異步處理。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python實(shí)現(xiàn)sublime3的less編譯插件示例
這篇文章主要介紹了python實(shí)現(xiàn)sublime3的less編譯插件示例的相關(guān)資料2014-04-04
Python激活A(yù)naconda環(huán)境變量的詳細(xì)步驟
今天給大家分享Python激活A(yù)naconda環(huán)境變量的詳細(xì)步驟,激活A(yù)naconda環(huán)境變量分為簡(jiǎn)潔版和詳細(xì)版,簡(jiǎn)潔版只需要通過(guò)輸入命令進(jìn)行配置即可,詳細(xì)版本文通過(guò)圖文步驟給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-06-06
python?動(dòng)態(tài)導(dǎo)入模塊實(shí)現(xiàn)模塊熱更新的方法
這篇文章主要介紹了python?動(dòng)態(tài)導(dǎo)入模塊,實(shí)現(xiàn)模塊熱更新,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
python list count統(tǒng)計(jì)個(gè)數(shù)的實(shí)現(xiàn)
這篇文章主要介紹了python list count統(tǒng)計(jì)個(gè)數(shù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Python面向?qū)ο罂偨Y(jié)及類與正則表達(dá)式詳解
Python中的類提供了面向?qū)ο缶幊痰乃谢竟δ埽侯惖睦^承機(jī)制允許多個(gè)基類,派生類可以覆蓋基類中的任何方法,方法中可以調(diào)用基類中的同名方法。這篇文章主要介紹了Python面向?qū)ο罂偨Y(jié)及類與正則表達(dá)式 ,需要的朋友可以參考下2019-04-04
Django多數(shù)據(jù)庫(kù)的實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了Django多數(shù)據(jù)庫(kù)的實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python實(shí)現(xiàn)提取指定名稱的文件并批量復(fù)制到其他文件夾
本文介紹基于Python語(yǔ)言,讀取一個(gè)文件夾,并將其中每一個(gè)子文件夾內(nèi)符合名稱要求的文件加以篩選,并將篩選得到的文件復(fù)制到另一個(gè)目標(biāo)文件夾中的方法,需要的朋友可以參考下2023-10-10

