
對(duì)于不同的應(yīng)用來(lái)說(shuō),爬蟲系統(tǒng)實(shí)現(xiàn)方式可能各異,但是實(shí)用的爬蟲系統(tǒng)都應(yīng)該具備以下幾種特性。
高性能
互聯(lián)網(wǎng)的網(wǎng)頁(yè)數(shù)量龐大如海,所以爬蟲的性能至關(guān)重要,這里的性能主要是指爬蟲下載網(wǎng)頁(yè)的抓取速度,常見的評(píng)價(jià)方式是以爬蟲每秒能夠下載的網(wǎng)頁(yè)數(shù)量作為性能指標(biāo),單位時(shí)間能夠下載的網(wǎng)頁(yè)數(shù)量越多,則爬蟲的性能越高。
要提高爬蟲的性能,在設(shè)計(jì)時(shí)程序訪問磁盤的操作方法及具體實(shí)現(xiàn)時(shí)數(shù)據(jù)結(jié)構(gòu)的選擇很關(guān)鍵。比如對(duì)于待抓取URL隊(duì)列和已抓取URL隊(duì)列,因?yàn)閁RL數(shù)量非常大,不同實(shí)現(xiàn)方式性能表現(xiàn)迥異,所以高效的數(shù)據(jù)結(jié)構(gòu)對(duì)于爬蟲性能影響很大。
可擴(kuò)展性
如上所述,爬蟲需要抓取的網(wǎng)頁(yè)數(shù)量巨大,即使單個(gè)爬蟲的性能很高,要將所有網(wǎng)頁(yè)都下載到本地,仍然需要相當(dāng)長(zhǎng)的時(shí)間周期,為了能夠盡可能縮短抓取周期,爬蟲系統(tǒng)應(yīng)該有很好的可擴(kuò)展性,即很容易通過增加抓取服務(wù)器和爬蟲數(shù)量來(lái)達(dá)到此目的。
目前實(shí)用的大型網(wǎng)絡(luò)爬蟲一定是分布式運(yùn)行的,即多臺(tái)服務(wù)器專做抓取,每臺(tái)服務(wù)器部署多個(gè)爬蟲,每個(gè)爬蟲多線程運(yùn)行,通過多種方式增加并發(fā)性。對(duì)于巨型
的搜索引擎服務(wù)商來(lái)說(shuō),可能還要在全球范圍、不同地域分別部署數(shù)據(jù)中心,爬蟲也被分配到不同的數(shù)據(jù)中心,這樣對(duì)于提高爬蟲系統(tǒng)的整體性能是很有幫助的。
健壯性
爬蟲要訪問各種類型的網(wǎng)站服務(wù)器,可能會(huì)遇到很多種非正常情況,比如網(wǎng)頁(yè)HTML編碼不規(guī)范,被抓取服務(wù)器突然死機(jī),甚至是爬蟲陷阱等。爬蟲對(duì)各種異常情況能夠正確處理非常重要,否則可能會(huì)不定期停止工作,這是無(wú)法忍受的。
從另外一個(gè)角度來(lái)講,假設(shè)爬蟲程序在抓取過程中死掉,或者爬蟲所在的服務(wù)器宕機(jī),健壯的爬蟲系統(tǒng)應(yīng)該能夠做到:再次啟動(dòng)爬蟲時(shí),能夠恢復(fù)之前抓取的內(nèi)容和數(shù)據(jù)結(jié)構(gòu),而不是每次都需要把所有工作完全從頭做起,這也是爬蟲健壯性的一種體現(xiàn)。
友好性
爬蟲的友好性包含兩方面的含義:一是保護(hù)網(wǎng)站的部分私密性,另一是減少被抓取網(wǎng)站的網(wǎng)絡(luò)負(fù)載。
爬蟲抓取的對(duì)象是各種類型的網(wǎng)站,對(duì)于網(wǎng)站擁有者來(lái)說(shuō),有些內(nèi)容并不希望被所有人搜索到,所以需要設(shè)定協(xié)議,來(lái)告知爬蟲哪些內(nèi)容是不允許抓取的。目前有兩種主流的方法可達(dá)此目的:爬蟲禁抓協(xié)議和網(wǎng)頁(yè)禁抓標(biāo)記。
爬蟲禁抓協(xié)議(Robot Exclusion Protocol)指的是由網(wǎng)站所有者生成一個(gè)指定的文件robot.txt,并放在網(wǎng)站服務(wù)器的根目錄下,這個(gè)文件指明了網(wǎng)站中哪些目錄下的網(wǎng)頁(yè)是不允許爬蟲抓取的。具有友好性的爬蟲在抓取該網(wǎng)站的網(wǎng)頁(yè)前,首先要讀取robot.txt文件,對(duì)于禁止抓取的網(wǎng)頁(yè)一般不進(jìn)行下載。
圖1-1給出了某個(gè)網(wǎng)站對(duì)應(yīng)的robot.txt文件內(nèi)容,User-agent字段指出針對(duì)哪個(gè)爬蟲,圖中示例為Google的爬蟲,而Disallow字段則指出不允許抓取的目錄。
圖1-1爬蟲禁抓協(xié)議
爬蟲禁抓協(xié)議一般以目錄為單位,即整個(gè)目錄下的網(wǎng)頁(yè)或內(nèi)容都不允許被抓取。如果只想讓單個(gè)網(wǎng)頁(yè)不被抓取,該如何做呢?網(wǎng)頁(yè)禁抓標(biāo)記(Robot METAtag)可在此種場(chǎng)合派上用場(chǎng)。
圖1-2給出了網(wǎng)頁(yè)禁抓標(biāo)記的示例,即在網(wǎng)頁(yè)的HTML代碼里加入meta name=“robots”標(biāo)記,content字段指出允許或者不允許爬蟲的哪些行為??梢苑譃閮煞N情形,一種是告知爬蟲不要索引該網(wǎng)頁(yè)內(nèi)容,以noindex作為標(biāo)記;另外一種情形是告知爬蟲不要抓取網(wǎng)頁(yè)所包含的鏈接,以nofollow作為標(biāo)記。通過這種方式,可以達(dá)到對(duì)網(wǎng)頁(yè)內(nèi)容的一種隱私保護(hù)。
圖1-2網(wǎng)頁(yè)禁抓標(biāo)記
遵循以上協(xié)議的爬蟲可以被認(rèn)為是友好的,這是從保護(hù)私密性的角度考慮的。另外一種友好性則是,希望爬蟲對(duì)某網(wǎng)站的訪問造成的網(wǎng)絡(luò)負(fù)載較低。爬蟲一般會(huì)根據(jù)網(wǎng)頁(yè)的鏈接連續(xù)獲取某網(wǎng)站的網(wǎng)頁(yè),如果爬蟲訪問網(wǎng)站頻率過高,會(huì)給網(wǎng)站服務(wù)器造成很大的訪問壓力,有時(shí)候甚至?xí)绊懢W(wǎng)站的正常訪問,造成類似DOS攻擊的效果,所以為了減少網(wǎng)站的網(wǎng)絡(luò)負(fù)載,友好性的爬蟲應(yīng)該在抓取策略部署時(shí)考慮每個(gè)被抓取網(wǎng)站的負(fù)載,在盡可能不影響爬蟲性能的情況下,減少對(duì)單一站點(diǎn)短期內(nèi)的高頻訪問。



皖公網(wǎng)安備 34010202600669



