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