摘要:網(wǎng)絡(luò)爬蟲(chóng)網(wǎng)絡(luò)爬蟲(chóng)能夠在無(wú)需人類干預(yù)的情況下自動(dòng)進(jìn)行一系列事務(wù)處理的軟件程序。根據(jù)這些爬蟲(chóng)自動(dòng)探查站點(diǎn)的方式,網(wǎng)絡(luò)爬蟲(chóng)也可稱作網(wǎng)絡(luò)蜘蛛螞蟻機(jī)器人等。遞歸地追蹤這些鏈接的爬蟲(chóng)會(huì)沿著超鏈創(chuàng)建的網(wǎng)絡(luò)爬行,所以將其稱為爬蟲(chóng)或蜘蛛。
網(wǎng)絡(luò)爬蟲(chóng)
網(wǎng)絡(luò)爬蟲(chóng)(web crawler)能夠在無(wú)需人類干預(yù)的情況下自動(dòng)進(jìn)行一系列Web事務(wù)處理的軟件程序。很多爬蟲(chóng)會(huì)從一個(gè)Web站點(diǎn)逛到另一個(gè)Web站點(diǎn),獲取內(nèi)容,跟蹤超鏈,并對(duì)它們找到的數(shù)據(jù)進(jìn)行處理。根據(jù)這些爬蟲(chóng)自動(dòng)探查Web站點(diǎn)的方式,網(wǎng)絡(luò)爬蟲(chóng)也可稱作網(wǎng)絡(luò)蜘蛛、螞蟻、機(jī)器人等。
Web爬蟲(chóng)會(huì)遞歸地對(duì)各種信息性Web站點(diǎn)進(jìn)行遍歷,獲取第一個(gè)Web頁(yè)面,然后獲取那個(gè)頁(yè)面指向的所有Web頁(yè)面,然后是那些頁(yè)面指向的所有Web頁(yè)面,依此類推。遞歸地追蹤這些Web鏈接的爬蟲(chóng)會(huì)沿著HTML超鏈創(chuàng)建的網(wǎng)絡(luò)"爬行",所以將其稱為爬蟲(chóng)(crawler)或蜘蛛(spider)。因特網(wǎng)搜索引擎使用爬蟲(chóng)在Web上游蕩,并把它們碰到的文檔全部拉回來(lái)。然后對(duì)這些文檔進(jìn)行處理,形成一個(gè)可搜索的數(shù)據(jù)庫(kù),以便用戶查找包含了特定單詞的文檔。網(wǎng)上有數(shù)萬(wàn)億的Web頁(yè)面需要查找和取回,這些搜索引擎必然是些最復(fù)雜的爬蟲(chóng)。
在把饑餓的爬蟲(chóng)放出去之前,需要給它一個(gè)起始點(diǎn)。爬蟲(chóng)開(kāi)始訪問(wèn)的URL初始集合被稱作根集(root set)。挑選根集時(shí),應(yīng)該從足夠多不同的站點(diǎn)中選擇URL,這樣,爬遍所有的鏈接才能最終到達(dá)大部分你感興趣的Web頁(yè)面。根集中并不需要有很多頁(yè)面,就可以涵蓋一大片Web結(jié)構(gòu),通常,一個(gè)好的根集會(huì)包括一些大的流行Web站點(diǎn),比如,一個(gè)新創(chuàng)建頁(yè)面的列表和一個(gè)不經(jīng)常被鏈接的無(wú)名頁(yè)面列表。很多大規(guī)模的爬蟲(chóng)產(chǎn)品,比如因特網(wǎng)搜索引擎使用的那些爬蟲(chóng),都為用戶提供了向根集中提交新頁(yè)面或無(wú)名頁(yè)面的方式。這個(gè)根集會(huì)隨時(shí)間推移而增長(zhǎng),是所有新爬蟲(chóng)的種子列表。
爬蟲(chóng)在Web上移動(dòng)時(shí),會(huì)不停地對(duì)HTML頁(yè)面進(jìn)行解析。它要對(duì)所解析的每個(gè)頁(yè)面上的URL鏈接進(jìn)行分析,并將這些鏈接添加到需要爬行的頁(yè)面列表中去。隨著爬蟲(chóng)的前進(jìn),當(dāng)其發(fā)現(xiàn)需要探查的新鏈接時(shí),這個(gè)列表常常會(huì)迅速地?cái)U(kuò)張。爬蟲(chóng)要通過(guò)簡(jiǎn)單的HTML解析,將這些鏈接提取出來(lái),并將相對(duì)URL轉(zhuǎn)換為絕對(duì)形式。
爬蟲(chóng)在Web上爬行時(shí),要特別小心不要陷入循環(huán),或環(huán)路(cycle)之中。爬蟲(chóng)必須知道它們到過(guò)何處,以避免環(huán)路的出現(xiàn)。環(huán)路會(huì)造成爬蟲(chóng)陷阱,這些陷阱會(huì)暫?;驕p緩爬蟲(chóng)的爬行進(jìn)程。
至少出于下列三個(gè)原因,環(huán)路對(duì)爬蟲(chóng)來(lái)說(shuō)是有害的:
它們會(huì)使爬蟲(chóng)陷入可能會(huì)將其困住的循環(huán)之中。循環(huán)會(huì)使未經(jīng)良好設(shè)計(jì)的爬蟲(chóng)不停地兜圈子,把所有時(shí)間都耗費(fèi)在不停地獲取相同的頁(yè)面上。爬蟲(chóng)會(huì)消耗掉很多網(wǎng)絡(luò)帶寬,可能完全無(wú)法獲取任何其他頁(yè)面了。
爬蟲(chóng)不斷地獲取相同的頁(yè)面時(shí),另一端的Web服務(wù)器也在遭受著打擊。如果爬蟲(chóng)與服務(wù)器連接良好,它就會(huì)擊垮Web站點(diǎn),阻止所有真實(shí)用戶訪問(wèn)這個(gè)站點(diǎn)。這種拒絕服務(wù)是可以作為法律訴訟理由的。
即使循環(huán)自身不是什么問(wèn)題,爬蟲(chóng)也是在獲取大量重復(fù)的頁(yè)面[通常被稱為"dups"(重復(fù)),以便與"loops"(循環(huán))押韻]。爬蟲(chóng)應(yīng)用程序會(huì)被重復(fù)的內(nèi)容所充斥,這樣應(yīng)用程序就會(huì)變得毫無(wú)用處。返回?cái)?shù)百份完全相同頁(yè)面的因特網(wǎng)搜索引擎就是一個(gè)這樣的例子。
記錄曾經(jīng)到過(guò)哪些地方記錄曾經(jīng)到過(guò)哪些地方并不總是一件容易的事。因特網(wǎng)上有數(shù)十億個(gè)不同的Web頁(yè)面,其中還不包括那些由動(dòng)態(tài)網(wǎng)關(guān)產(chǎn)生的內(nèi)容。如果要爬行世界范圍內(nèi)的一大塊Web內(nèi)容,就要做好訪問(wèn)數(shù)十億URL的準(zhǔn)備。記錄下哪些URL已經(jīng)訪問(wèn)過(guò)了是件很具挑戰(zhàn)的事情。由于URL的數(shù)量巨大,所以,要使用復(fù)雜的數(shù)據(jù)結(jié)構(gòu)以便快速判定哪些URL是曾經(jīng)訪問(wèn)過(guò)的。數(shù)據(jù)結(jié)構(gòu)在訪問(wèn)速度和內(nèi)存使用方面都應(yīng)該是非常高效的。數(shù)億URL需要具備快速搜索結(jié)構(gòu),所以速度是很重要的。窮舉搜索URL列表是根本不可能的。爬蟲(chóng)至少要用到搜索樹(shù)或散列表,以快速判定某個(gè)URL是否被訪問(wèn)過(guò)。數(shù)億URL還會(huì)占用大量的空間。
大規(guī)模Web爬蟲(chóng)對(duì)其訪問(wèn)過(guò)的地址進(jìn)行管理時(shí)使用的一些有用的技術(shù):
樹(shù)和散列表:復(fù)雜的爬蟲(chóng)可能會(huì)用搜索樹(shù)或散列表來(lái)記錄已訪問(wèn)的URL。這些是加速URL查找的軟件數(shù)據(jù)結(jié)構(gòu)。
有損的存在位圖:為了減小空間,一些大型爬蟲(chóng)會(huì)使用有損數(shù)據(jù)結(jié)構(gòu),比如存在位數(shù)組(presence bit array)。用一個(gè)散列函數(shù)將每個(gè)URL都轉(zhuǎn)換成一個(gè)定長(zhǎng)的數(shù)字,這個(gè)數(shù)字在數(shù)組中有個(gè)相關(guān)的"存在位"。爬行過(guò)一個(gè)URL時(shí),就將相應(yīng)的"存在位"置位。如果存在位已經(jīng)置位了,爬蟲(chóng)就認(rèn)為已經(jīng)爬行過(guò)那個(gè)URL了。
檢查點(diǎn):一定要將已訪問(wèn)URL列表保存到硬盤(pán)上,以防爬蟲(chóng)程序崩潰。
分布式:隨著Web的擴(kuò)展,在一臺(tái)計(jì)算機(jī)上通過(guò)單個(gè)爬蟲(chóng)來(lái)完成爬行就變得不太現(xiàn)實(shí)了。那臺(tái)計(jì)算機(jī)可能沒(méi)有足夠的內(nèi)存、磁盤(pán)空間、計(jì)算能力,或網(wǎng)絡(luò)帶寬來(lái)完成爬行任務(wù)。有些大型Web爬蟲(chóng)會(huì)使用爬蟲(chóng)"集群",每個(gè)獨(dú)立的計(jì)算機(jī)是一個(gè)爬蟲(chóng),以匯接方式工作。為每個(gè)爬蟲(chóng)分配一個(gè)特定的URL"片",由其負(fù)責(zé)爬行。這些爬蟲(chóng)配合工作,爬行整個(gè)Web。爬蟲(chóng)個(gè)體之間可能需要相互通信,來(lái)回傳送URL,以覆蓋出故障的對(duì)等實(shí)體的爬行范圍,或協(xié)調(diào)其工作。
別名與爬蟲(chóng)環(huán)路由于URL"別名"的存在,即使使用了正確的數(shù)據(jù)結(jié)構(gòu),有時(shí)也很難分辨出以前是否訪問(wèn)過(guò)某個(gè)頁(yè)面。如果兩個(gè)URL看起來(lái)不一樣,但實(shí)際指向的是同一資源,就稱這兩個(gè)URL互為"別名"。
大多數(shù)Web爬蟲(chóng)都試圖通過(guò)將URL"規(guī)范化"為標(biāo)準(zhǔn)格式來(lái)消除上面那些顯而易見(jiàn)的別名。爬蟲(chóng)首先可先將每個(gè)URL都轉(zhuǎn)化為規(guī)范化的格式,就可以消除大部分別名問(wèn)題了。但如果不知道特定Web服務(wù)器的相關(guān)信息,爬蟲(chóng)就沒(méi)什么好辦法來(lái)避免別名問(wèn)題了。URL規(guī)范化可以消除一些基本的語(yǔ)法別名,但爬蟲(chóng)還會(huì)遇到其他的、將URL轉(zhuǎn)換為標(biāo)準(zhǔn)形式也無(wú)法消除的URL別名。
通過(guò)下列步驟將每個(gè)URL都轉(zhuǎn)化為規(guī)范化的格式:
如果沒(méi)有指定端口的話,就向主機(jī)名中添加":80"。
將所有轉(zhuǎn)義符"%xx"都轉(zhuǎn)換成等價(jià)字符。
刪除"#"標(biāo)簽。
特定Web服務(wù)器的相關(guān)信息:
爬蟲(chóng)需要知道Web服務(wù)器是否是大小寫(xiě)無(wú)關(guān)的才能避免別名問(wèn)題。
爬蟲(chóng)需要知道Web服務(wù)器上這個(gè)目錄下的索引頁(yè)面配置才能知道是否是別名。
即使爬蟲(chóng)知道主機(jī)名和IP地址都指向同一臺(tái)計(jì)算機(jī),它也還要知道Web服務(wù)器是否配置為進(jìn)行虛擬主機(jī)操作,才能知道這個(gè)URL是不是別名。
文件系統(tǒng)連接環(huán)路文件系統(tǒng)中的符號(hào)連接會(huì)造成特定的潛在環(huán)路,因?yàn)樗鼈儠?huì)在目錄層次深度有限的情況下,造成深度無(wú)限的假象。符號(hào)連接環(huán)路通常是由無(wú)心錯(cuò)誤造成的,但也可能會(huì)惡意地為爬蟲(chóng)制造這樣的陷阱。
可能會(huì)有意創(chuàng)建一些復(fù)雜的循環(huán)來(lái)陷害那些無(wú)辜的、毫無(wú)戒備的爬蟲(chóng)。尤其是,發(fā)布一個(gè)看起來(lái)像普通文件,實(shí)際上卻是網(wǎng)關(guān)應(yīng)用程序的URL是很容易的。這個(gè)應(yīng)用程序可以在傳輸中構(gòu)造出包含了到同一服務(wù)器上虛構(gòu)URL鏈接的HTML。請(qǐng)求這些虛構(gòu)的URL時(shí),服務(wù)器就會(huì)捏造出一個(gè)帶有新的虛構(gòu)URL的新HTML頁(yè)面來(lái)。即使這個(gè)Web服務(wù)器實(shí)際上并不包含任何文件,它也可以通過(guò)無(wú)限虛擬的Web空間將爬蟲(chóng)帶入"夢(mèng)境"。更糟的是,每次的URL和HTML看起來(lái)都有很大的不同,爬蟲(chóng)很難檢測(cè)到環(huán)路。更常見(jiàn)的情況是,可能會(huì)在無(wú)意中通過(guò)符號(hào)連接或動(dòng)態(tài)內(nèi)容構(gòu)造出爬蟲(chóng)陷阱。比如,一個(gè)基于CGI的日歷程序,它會(huì)生成一個(gè)月歷和一個(gè)指向下個(gè)月的鏈接。真正的用戶是不會(huì)不停地請(qǐng)求下個(gè)月的鏈接的,但不了解其內(nèi)容的動(dòng)態(tài)特性的爬蟲(chóng)可能會(huì)不斷向這些資源發(fā)出無(wú)窮的請(qǐng)求。
沒(méi)有什么簡(jiǎn)單明了的方式可以避免所有的環(huán)路。實(shí)際上,經(jīng)過(guò)良好設(shè)計(jì)的爬蟲(chóng)中要包含一組試探方式,以避免環(huán)路的出現(xiàn)。總的說(shuō)來(lái),爬蟲(chóng)的自動(dòng)化程度越高(人為的監(jiān)管越少),越可能陷入麻煩之中。爬蟲(chóng)的實(shí)現(xiàn)者需要做一些取舍——這些試探方式有助于避免問(wèn)題的出現(xiàn),但你可能會(huì)終止掃描那些看起來(lái)可疑的有效內(nèi)容,因此這種方式也是"有損失"的。爬行Web這樣規(guī)模龐大的數(shù)據(jù)集時(shí),好的爬蟲(chóng)探測(cè)法總是會(huì)不斷改進(jìn)其工作的。隨著新的資源類型不斷加入Web,它會(huì)隨著時(shí)間的推移構(gòu)建出一些新的規(guī)則,并采納這些規(guī)則。好的規(guī)則總是在不斷發(fā)展之中的。當(dāng)受到錯(cuò)誤爬蟲(chóng)影響的資源(服務(wù)器、網(wǎng)絡(luò)帶寬等)處于可管理狀態(tài),或者處于執(zhí)行爬行工作的人的控制之下(比如在內(nèi)部站點(diǎn)上)時(shí),很多較小的、更具個(gè)性的爬蟲(chóng)就會(huì)繞開(kāi)這些問(wèn)題。這些爬蟲(chóng)更多的是依賴人類的監(jiān)視來(lái)防止這些問(wèn)題的 發(fā)生。
爬蟲(chóng)會(huì)遇到的各種危險(xiǎn)的Web中,有些技術(shù)的使用可以使爬蟲(chóng)有更好的表現(xiàn):
規(guī)范化URL:將URL轉(zhuǎn)換為標(biāo)準(zhǔn)形式以避免語(yǔ)法上的別名。
廣度優(yōu)先的爬行:每次爬蟲(chóng)都有大量潛在的URL要去爬行。以廣度優(yōu)先的方式來(lái)調(diào)度URL去訪問(wèn)Web站點(diǎn),就可以將環(huán)路的影響最小化。即使碰到了爬蟲(chóng)陷阱,也可以在回到環(huán)路中獲取的下一個(gè)頁(yè)面之前,從其他Web站點(diǎn)中獲取成百上千的頁(yè)面。如果采用深度優(yōu)先方式,一頭扎到單個(gè)站點(diǎn)中去,就可能會(huì)跳入環(huán)路,永遠(yuǎn)無(wú)法訪問(wèn)其他站點(diǎn)。
節(jié)流:限制一段時(shí)間內(nèi)爬蟲(chóng)可以從一個(gè)Web站點(diǎn)獲取的頁(yè)面數(shù)量。如果爬蟲(chóng)跳進(jìn)了一個(gè)環(huán)路,試圖不斷地訪問(wèn)某個(gè)站點(diǎn)的別名,也可以通過(guò)節(jié)流來(lái)限制重復(fù)的頁(yè)面總數(shù)和對(duì)服務(wù)器的訪問(wèn)總數(shù)。
限制URL的大小:爬蟲(chóng)可能會(huì)拒絕爬行超出特定長(zhǎng)度(通常是1KB)的URL。如果環(huán)路使URL的長(zhǎng)度增加,長(zhǎng)度限制就會(huì)最終終止這個(gè)環(huán)路。有些Web服務(wù)器在使用長(zhǎng)URL時(shí)會(huì)失敗,因此,被URL增長(zhǎng)環(huán)路困住的爬蟲(chóng)會(huì)使某些Web服務(wù)器崩潰。這會(huì)讓人錯(cuò)誤地將爬蟲(chóng)當(dāng)成發(fā)起拒絕服務(wù)攻擊的攻擊者。要小心,這種技術(shù)肯定會(huì)讓你錯(cuò)過(guò)一些內(nèi)容?,F(xiàn)在很多站點(diǎn)都會(huì)用URL來(lái)管理用戶的狀態(tài)(比如,在一個(gè)頁(yè)面引用的URL中存儲(chǔ)用戶ID)。用URL長(zhǎng)度來(lái)限制爬蟲(chóng)可能會(huì)帶來(lái)些麻煩;但如果每當(dāng)請(qǐng)求的URL達(dá)到某個(gè)特定長(zhǎng)度時(shí),都記錄一次錯(cuò)誤的話,就可以為用戶提供一種檢查某特定站點(diǎn)上所發(fā)生情況的方法。
URL/站點(diǎn)黑名單:維護(hù)一個(gè)與爬蟲(chóng)環(huán)路和陷阱相對(duì)應(yīng)的已知站點(diǎn)及URL列表,然后像躲避瘟疫一樣避開(kāi)它們。發(fā)現(xiàn)新問(wèn)題時(shí),就將其加入黑名單。這就要求有人工進(jìn)行干預(yù)。但現(xiàn)在很多大型爬蟲(chóng)產(chǎn)品都有某種形式的黑名單,用于避開(kāi)某些存在固有問(wèn)題或者有惡意的站點(diǎn)。還可以用黑名單來(lái)避開(kāi)那些對(duì)爬行大驚小怪的站點(diǎn)。
模式檢測(cè):文件系統(tǒng)的符號(hào)連接和類似的錯(cuò)誤配置所造成的環(huán)路會(huì)遵循某種模式;比如,URL會(huì)隨著組件的復(fù)制逐漸增加。有些爬蟲(chóng)會(huì)將具有重復(fù)組件的URL當(dāng)作潛在的環(huán)路,拒絕爬行帶有多于兩或三個(gè)重復(fù)組件的 URL。重復(fù)并不都是立即出現(xiàn)的。有些環(huán)路周期可能為2或其他間隔。有些爬蟲(chóng)會(huì)查找具有幾種不同周期的重復(fù)模式。
內(nèi)容指紋:一些更復(fù)雜的Web爬蟲(chóng)會(huì)使用指紋這種更直接的方式來(lái)檢測(cè)重復(fù)。使用內(nèi)容指紋的爬蟲(chóng)會(huì)獲取頁(yè)面內(nèi)容中的字節(jié),并計(jì)算出一個(gè)校驗(yàn)和(checksum)。這個(gè)校驗(yàn)和是頁(yè)面內(nèi)容的壓縮表示形式。如果爬蟲(chóng)獲取了一個(gè)頁(yè)面,而此頁(yè)面的校驗(yàn)和它曾經(jīng)見(jiàn)過(guò),它就不會(huì)再去爬行這個(gè)頁(yè)面的鏈接了——如果爬蟲(chóng)以前見(jiàn)過(guò)頁(yè)面的內(nèi)容,它就已經(jīng)爬行過(guò)頁(yè)面上的鏈接了。必須對(duì)校驗(yàn)和函數(shù)進(jìn)行選擇,以求兩個(gè)不同頁(yè)面擁有相同校驗(yàn)和的幾率非常低。MD5這樣的報(bào)文摘要函數(shù)就常被用于指紋計(jì)算。有些Web服務(wù)器會(huì)在傳輸過(guò)程中對(duì)頁(yè)面進(jìn)行動(dòng)態(tài)的修改,所以有時(shí)爬蟲(chóng)會(huì)在校驗(yàn)和的計(jì)算中忽略Web頁(yè)面內(nèi)容中的某些部分,比如那些嵌入的鏈接。而且,無(wú)論定制了什么頁(yè)面內(nèi)容的動(dòng)態(tài)服務(wù)器端包含(比如添加日期、訪問(wèn)計(jì)數(shù)等)都可能會(huì)阻礙重復(fù)檢測(cè)。
人工監(jiān)視:Web就是一片荒野。勇敢的爬蟲(chóng)最終總會(huì)陷入一個(gè)采用任何技術(shù)都無(wú)能為力的困境。設(shè)計(jì)所有產(chǎn)品級(jí)爬蟲(chóng)時(shí)都要有診斷和日志功能,這樣人類才能很方便地監(jiān)視爬蟲(chóng)的進(jìn)展,如果發(fā)生了什么不尋常的事情就可以很快收到警告。在某些情況下,憤怒的網(wǎng)民會(huì)給你發(fā)送一些無(wú)禮的郵件來(lái)提示你出了問(wèn)題。
爬蟲(chóng)的HTTP爬蟲(chóng)和所有其他HTTP客戶端程序并沒(méi)有什么區(qū)別。它們也要遵守HTTP規(guī)范中的規(guī)則。發(fā)出HTTP請(qǐng)求并將自己廣播成"HTTP/1.1"客戶端的爬蟲(chóng)也要使用正確的HTTP請(qǐng)求首部。很多爬蟲(chóng)都試圖只實(shí)現(xiàn)請(qǐng)求它們所查找內(nèi)容所需的最小HTTP集。這會(huì)引發(fā)一些問(wèn)題;但短期內(nèi)這種行為不會(huì)發(fā)生什么改變。結(jié)果就是,很多爬蟲(chóng)發(fā)出的都是"HTTP/1.0"請(qǐng)求,因?yàn)檫@個(gè)協(xié)議的要求很少。
盡管爬蟲(chóng)傾向于只支持最小的HTTP集,但大部分爬蟲(chóng)確實(shí)實(shí)現(xiàn)并發(fā)送了一些識(shí)別首部——最值得一提的就是User-Agent首部。建議爬蟲(chóng)實(shí)現(xiàn)者們發(fā)送一些基本的首部信息,以通知各站點(diǎn)爬蟲(chóng)的能力、爬蟲(chóng)的標(biāo)識(shí)符,以及它是從何處起源的。
在追蹤錯(cuò)誤爬蟲(chóng)的所有者,以及向服務(wù)器提供爬蟲(chóng)所能處理的內(nèi)容類型時(shí),這些信息都是很有用的。鼓勵(lì)爬蟲(chóng)實(shí)現(xiàn)者們使用的基本識(shí)別首部包括如下內(nèi)容:
User-Agent:將發(fā)起請(qǐng)求的爬蟲(chóng)名字告知服務(wù)器。
From:提供爬蟲(chóng)的用戶/管理員的E-mail地址。
Accept:告知服務(wù)器可以發(fā)送哪些媒體類型。這有助于確保爬蟲(chóng)只接收它感興趣的內(nèi)容(文本、圖片等)。
Referer:提供包含了當(dāng)前請(qǐng)求URL的文檔的URL。
虛擬主機(jī)爬蟲(chóng)實(shí)現(xiàn)者要支持Host首部。隨著虛擬主機(jī)的流行,請(qǐng)求中不包含Host首部的話,可能會(huì)使爬蟲(chóng)將錯(cuò)誤的內(nèi)容與一個(gè)特定的URL關(guān)聯(lián)起來(lái)。因此,"HTTP/1.1"要求使用Host首部。在默認(rèn)情況下,大多數(shù)服務(wù)器都被配置為提供一個(gè)特定的站點(diǎn)。因此,不包含Host首部的爬蟲(chóng)向提供兩個(gè)站點(diǎn)的服務(wù)器發(fā)起請(qǐng)求時(shí)。
盡量減少爬蟲(chóng)所要獲取內(nèi)容的數(shù)量通常是很有意義的。對(duì)因特網(wǎng)搜索引擎爬蟲(chóng)來(lái)說(shuō),需要下載的潛在頁(yè)面有數(shù)十億,所以,只在內(nèi)容發(fā)生變化時(shí)才重新獲取內(nèi)容是很有意義的。有些爬蟲(chóng)實(shí)現(xiàn)了條件HTTP請(qǐng)求,它們會(huì)對(duì)時(shí)間戳或?qū)嶓w標(biāo)簽進(jìn)行比較,看看它們最近獲取的版本是否已經(jīng)升級(jí)了。這與HTTP緩存查看已獲取資源的本地副本是否有效的方法非常相似。
很多爬蟲(chóng)的興趣主要在于用簡(jiǎn)單的GET方法來(lái)獲取所請(qǐng)求的內(nèi)容,所以,一般不會(huì)在處理響應(yīng)的方式上花費(fèi)太多時(shí)間。但是,使用了某些HTTP特性(比如條件請(qǐng)求)的爬蟲(chóng),以及那些想要更好地探索服務(wù)器,并與服務(wù)器進(jìn)行交互的爬蟲(chóng)則要能夠?qū)Ω鞣N不同類型的HTTP響應(yīng)進(jìn)行處理。
狀態(tài)碼:爬蟲(chóng)至少應(yīng)該能夠處理一些常見(jiàn)的,以及預(yù)期的狀態(tài)碼。所有爬蟲(chóng)都應(yīng)該理解"200 OK"和"404 Not Found"這樣的狀態(tài)碼。它們還應(yīng)該能夠根據(jù)響應(yīng)的一般類別對(duì)它并不十分理解的狀態(tài)碼進(jìn)行處理。
實(shí)體:除了HTTP首部所嵌的信息之外,爬蟲(chóng)也會(huì)在實(shí)體中查找信息。HTML元標(biāo)簽(比如元標(biāo)簽http-equiv),就是內(nèi)容編寫(xiě)者用于嵌入資源附加信息的一種方式。服務(wù)器可能會(huì)為它所處理的內(nèi)容提供一些首部,標(biāo)簽http-equiv為內(nèi)容編寫(xiě)者提供了一種覆蓋這些首部的方式(meta http-equiv="Refresh" content="1;URL=index.html")。這個(gè)標(biāo)簽會(huì)指示接收者處理這個(gè)文檔時(shí),要當(dāng)作其HTTP響應(yīng)首部中有一個(gè)值為"1, URL=index.html"的"Refresh HTTP"首部。有些服務(wù)器實(shí)際上會(huì)在發(fā)送HTML頁(yè)面之前先對(duì)其內(nèi)容進(jìn)行解析,并將http-equiv指令作為首部包含進(jìn)去;有些服務(wù)器則不會(huì)。爬蟲(chóng)實(shí)現(xiàn)者可能會(huì)去掃描HTML文檔的HEAD組件,以查找http-equiv信息。
User-Agent導(dǎo)向Web管理員應(yīng)該記住,會(huì)有很多的爬蟲(chóng)來(lái)訪問(wèn)它們的站點(diǎn),因此要做好接收爬蟲(chóng)請(qǐng)求的準(zhǔn)備。很多站點(diǎn)會(huì)為不同的用戶代理進(jìn)行內(nèi)容優(yōu)化,并嘗試著對(duì)瀏覽器類型進(jìn)行檢測(cè),以確保能夠支持各種站點(diǎn)特性。這樣的話,當(dāng)實(shí)際的HTTP客戶端根本不是瀏覽器,而是爬蟲(chóng)的時(shí)候,站點(diǎn)為爬蟲(chóng)提供的就會(huì)是出錯(cuò)頁(yè)面而不是頁(yè)面內(nèi)容了。在某些搜索引擎上執(zhí)行文本搜索,搜索短語(yǔ)"your browser does not support frames"(你的瀏覽器不支持框架),會(huì)生成一個(gè)包含那條短語(yǔ)的出錯(cuò)頁(yè)面列表。站點(diǎn)管理員應(yīng)該設(shè)計(jì)一個(gè)處理爬蟲(chóng)請(qǐng)求的策略。比如,它們可以為所有其他特性不太豐富的瀏覽器和爬蟲(chóng)開(kāi)發(fā)一些頁(yè)面,而不是將其內(nèi)容限定在特定瀏覽器所支持的范圍。至少,管理員應(yīng)該知道爬蟲(chóng)是會(huì)訪問(wèn)其站點(diǎn)的,不應(yīng)該在爬蟲(chóng)訪問(wèn)時(shí)感到猝不及防。
不守規(guī)矩的爬蟲(chóng)會(huì)造成很多嚴(yán)重問(wèn)題:
失控爬蟲(chóng):爬蟲(chóng)發(fā)起HTTP請(qǐng)求的速度要比在Web上沖浪的人類快得多,它們通常都運(yùn)行在具有快速網(wǎng)絡(luò)鏈路的高速計(jì)算機(jī)上。如果爬蟲(chóng)存在編程邏輯錯(cuò)誤,或者陷入了環(huán)路之中,就可能會(huì)向Web服務(wù)器發(fā)出大量的負(fù)載——很可能會(huì)使服務(wù)器過(guò)載,并拒絕為任何其他人提供服務(wù)。所有的爬蟲(chóng)編寫(xiě)者都必須特別小心地設(shè)計(jì)一些保護(hù)措施,以避免失控的爬蟲(chóng)帶來(lái)的危害。
失效的 URL:有些爬蟲(chóng)會(huì)去訪問(wèn)URL列表。這些列表可能很老了。如果一個(gè)Web站點(diǎn)對(duì)其內(nèi)容進(jìn)行了大量的修改,爬蟲(chóng)可能會(huì)對(duì)大量不存在的URL發(fā)起請(qǐng)求。這會(huì)激怒某些Web站點(diǎn)的管理員,他們不喜歡他們的錯(cuò)誤日志中充滿了對(duì)不存在文檔的訪問(wèn)請(qǐng)求,也不希望提供出錯(cuò)頁(yè)面的開(kāi)銷降低其Web服務(wù)器的處理能力。
很長(zhǎng)的錯(cuò)誤 URL:由于環(huán)路和編程錯(cuò)誤的存在,爬蟲(chóng)可能會(huì)向Web站點(diǎn)請(qǐng)求一些很大的、無(wú)意義的URL。如果URL足夠長(zhǎng)的話,就會(huì)降低Web服務(wù)器的性能,使Web服務(wù)器的訪問(wèn)日志雜亂不堪,甚至?xí)挂恍┍容^脆弱的Web服務(wù)器崩潰。
愛(ài)打聽(tīng)的爬蟲(chóng):有些爬蟲(chóng)可能會(huì)得到一些指向私有數(shù)據(jù)的URL,這樣,通過(guò)因特網(wǎng)搜索引擎和其他應(yīng)用程序就可以很方便地訪問(wèn)這些數(shù)據(jù)了。如果數(shù)據(jù)的所有者沒(méi)有主動(dòng)宣傳這些Web頁(yè)面,那么在最好的情況下,他只是會(huì)認(rèn)為爬蟲(chóng)的發(fā)布行為惹人討厭,而在最壞的情況下,則會(huì)認(rèn)為這種行為是對(duì)隱私的侵犯。通常,發(fā)生這種情況是由于爬蟲(chóng)所跟蹤的、指向"私有"內(nèi)容的超鏈已經(jīng)存在了(也就是說(shuō),這些內(nèi)容并不像其所有者認(rèn)為的那么隱密,或者其所有者忘記刪除先前存在的超鏈了)。偶爾也會(huì)因?yàn)榕老x(chóng)非常熱衷于尋找某站點(diǎn)上的文檔而出現(xiàn)這種情況,很可能就是在沒(méi)有顯式超鏈的情況下去獲取某個(gè)目錄的內(nèi)容造成的。從Web上獲取大量數(shù)據(jù)的爬蟲(chóng)的實(shí)現(xiàn)者們應(yīng)該清楚,他們的爬蟲(chóng)很可能會(huì)在某些地方獲得敏感的數(shù)據(jù)——站點(diǎn)的實(shí)現(xiàn)者不希望通過(guò)因特網(wǎng)能夠訪問(wèn)到這些數(shù)據(jù)。這些敏感數(shù)據(jù)可能包含密碼文件。很顯然,一旦被指出,就應(yīng)該有某種機(jī)制可以將這些數(shù)據(jù)丟棄(并從所有搜索索引或歸檔文件中將其刪除),這是非常重要的?,F(xiàn)在已知一些惡意使用搜索引擎和歸檔的用戶會(huì)利用大型Web爬蟲(chóng)來(lái)查找內(nèi)容——有些搜索引擎, 實(shí)際上會(huì)對(duì)它們爬行過(guò)的頁(yè)面進(jìn)行歸檔,這樣,即使內(nèi)容被刪除了,在一段時(shí)間內(nèi)還是可以找到并訪問(wèn)它。
動(dòng)態(tài)網(wǎng)關(guān)訪問(wèn):爬蟲(chóng)并不總是知道它們?cè)L問(wèn)的是什么內(nèi)容。爬蟲(chóng)可能會(huì)獲取一個(gè)內(nèi)容來(lái)自網(wǎng)關(guān)應(yīng)用程序的URL。在這種情況下,獲取的數(shù)據(jù)可能會(huì)有特殊的目的,計(jì)算的開(kāi)銷可能很高。很多Web站點(diǎn)管理員并不喜歡那些去請(qǐng)求網(wǎng)關(guān)文檔的幼稚爬蟲(chóng)。
拒絕爬蟲(chóng)訪問(wèn)爬蟲(chóng)社團(tuán)能夠理解爬蟲(chóng)訪問(wèn)Web站點(diǎn)時(shí)可能引發(fā)的問(wèn)題。1994 年,人們提出了一項(xiàng)簡(jiǎn)單的自愿約束技術(shù),可以將爬蟲(chóng)阻擋在不適合它的地方之外,并為網(wǎng)站管理員提供了一種能夠更好地控制爬蟲(chóng)行為的機(jī)制。這個(gè)標(biāo)準(zhǔn)被稱為"拒絕爬蟲(chóng)訪問(wèn)標(biāo)準(zhǔn)",但通常只是根據(jù)存儲(chǔ)訪問(wèn)控制信息的文件而將其稱為"robots.txt"。"robots.txt"的思想很簡(jiǎn)單。所有Web服務(wù)器都可以在服務(wù)器的文檔根目錄中提供一個(gè)可選的、名為"robots.txt"的文件。這個(gè)文件包含的信息說(shuō)明了爬蟲(chóng)可以訪問(wèn)服務(wù)器的哪些部分。如果爬蟲(chóng)遵循這個(gè)自愿約束標(biāo)準(zhǔn),它會(huì)在訪問(wèn)那個(gè)站點(diǎn)的所有其他資源之前,從Web站點(diǎn)請(qǐng)求"robots.txt"文件。
拒絕爬蟲(chóng)訪問(wèn)標(biāo)準(zhǔn)是一個(gè)臨時(shí)標(biāo)準(zhǔn)。不同的廠商實(shí)現(xiàn)了這個(gè)標(biāo)準(zhǔn)的不同子集。但是,具備一些對(duì)爬蟲(chóng)訪問(wèn)Web站點(diǎn)的管理能力,即使并不完美,也總比一點(diǎn)兒都沒(méi)有要好,而且大部分主要的生產(chǎn)廠商和搜索引擎爬蟲(chóng)都支持這個(gè)拒絕訪問(wèn)標(biāo)準(zhǔn)?,F(xiàn)在大多數(shù)爬蟲(chóng)采用的都是標(biāo)準(zhǔn)v0.0或v1.0。版本v2.0要復(fù)雜得多,沒(méi)有得到廣泛的應(yīng)用。
如果一個(gè)Web站點(diǎn)有"robots.txt"文件,那么在訪問(wèn)這個(gè)Web站點(diǎn)上的任意URL之前,爬蟲(chóng)都必須獲取它并對(duì)其進(jìn)行處理。由主機(jī)名和端口號(hào)定義的整個(gè)Web站點(diǎn)上僅有一個(gè)"robots.txt"資源。如果這個(gè)站點(diǎn)是虛擬主機(jī),每個(gè)虛擬的docroot都可以有一個(gè)不同的robots.txt文件,像所有其他文件一樣。通常不能在Web站點(diǎn)上多帶帶的子目錄中安裝"本地robots.txt文件"。管理員要負(fù)責(zé)創(chuàng)建一個(gè)聚合型"robots.txt"文件,用以描述Web站點(diǎn)上所有內(nèi)容的拒絕訪問(wèn)規(guī)則。
獲取robots.txt:爬蟲(chóng)會(huì)用HTTP的GET方法來(lái)獲取"robots.txt"資源,就像獲取Web服務(wù)器上所有其他資源一樣。如果有"robots.txt"文件的話,服務(wù)器會(huì)將其放在一個(gè)"text/plain"主體中返回。如果服務(wù)器以"404 Not Found"HTTP狀態(tài)碼進(jìn)行響應(yīng),爬蟲(chóng)就可以認(rèn)為這個(gè)服務(wù)器上沒(méi)有爬蟲(chóng)訪問(wèn)限制,它可以請(qǐng)求任意的文件。爬蟲(chóng)應(yīng)該在From首部和User-Agent首部中傳輸標(biāo)識(shí)信息,以幫助站點(diǎn)管理員對(duì)爬蟲(chóng)的訪問(wèn)進(jìn)行跟蹤,并在站點(diǎn)管理員要查詢,或投訴的爬蟲(chóng)事件中提供一些聯(lián)系信息。
響應(yīng)碼:很多Web站點(diǎn)都沒(méi)有"robots.txt"資源,但爬蟲(chóng)并不知道這一點(diǎn)。它必須嘗試著從每個(gè)站點(diǎn)上獲取"robots.txt"資源。爬蟲(chóng)會(huì)根據(jù)對(duì)"robots.txt"檢索的結(jié)果采取不同的行動(dòng)。
如果服務(wù)器以一個(gè)成功狀態(tài)(HTTP狀態(tài)碼2XX)為響應(yīng),爬蟲(chóng)就必須對(duì)內(nèi)容進(jìn)行解析,并使用排斥規(guī)則從那個(gè)站點(diǎn)上獲取內(nèi)容。
如果服務(wù)器響應(yīng)說(shuō)明資源并不存在(HTTP狀態(tài)碼404),爬蟲(chóng)就可以認(rèn)為服務(wù)器沒(méi)有激活任何排斥規(guī)則,對(duì)此站點(diǎn)的訪問(wèn)不受"robots.txt"的限制。
如果服務(wù)器響應(yīng)說(shuō)明有訪問(wèn)限制(HTTP狀態(tài)碼401或403),爬蟲(chóng)就應(yīng)該認(rèn)為對(duì)此站點(diǎn)的訪問(wèn)是完全受限的。
如果請(qǐng)求嘗試的結(jié)果是臨時(shí)故障(HTTP狀態(tài)碼503),爬蟲(chóng)就應(yīng)該推遲對(duì)此站點(diǎn)的訪問(wèn),直到可以獲取該資源為止。
如果服務(wù)器響應(yīng)說(shuō)明是重定向(HTTP狀態(tài)碼3XX),爬蟲(chóng)就應(yīng)該跟著重定向,直到找到資源為止。
robots.txt文件的格式"robots.txt"文件采用了非常簡(jiǎn)單的,面向行的語(yǔ)法。"robots.txt"文件中有三種類型的行:空行、注釋行和規(guī)則行。規(guī)則行看起來(lái)就像HTTP首部一樣,用于模式匹配。"robots.txt"文件中的行可以從邏輯上劃分成"記錄"。每條記錄都為一組特定的爬蟲(chóng)描述了一組排斥規(guī)則。通過(guò)這種方式,可以為不同的爬蟲(chóng)使用不同的排斥規(guī)則。每條記錄中都包含了一組規(guī)則行,由一個(gè)空行或文件結(jié)束符終止。記錄以一個(gè)或多個(gè)User-Agent行開(kāi)始,說(shuō)明哪些爬蟲(chóng)會(huì)受此記錄的影響,后面跟著一些Disallow和Allow行,用來(lái)說(shuō)明這些爬蟲(chóng)可以訪問(wèn)哪些URL。
此例顯示了一個(gè)"robots.txt"文件,這個(gè)文件允許爬蟲(chóng)Slurp和Webcrawler訪問(wèn)除了private子目錄下那些文件之外所有的文件。這個(gè)文件還會(huì)阻止所有其他爬蟲(chóng)訪問(wèn)那個(gè)站點(diǎn)上的任何內(nèi)容。
# this robots.txt file allows Slurp & Webcrawler to crawl # the public parts of our site, but no other robots... User-Agent: slurp User-Agent: webcrawler Disallow: /private User-Agent: * Disallow:
User-Agent行:每個(gè)爬蟲(chóng)記錄都以一個(gè)或多個(gè)下列形式的User-Agent行開(kāi)始。在爬蟲(chóng)"HTTP GET"請(qǐng)求的User-Agent首部中發(fā)送(由爬蟲(chóng)實(shí)現(xiàn)者選擇的)爬蟲(chóng)名。如果爬蟲(chóng)無(wú)法找到與其名字相匹配的User-Agent行,而且也無(wú)法找到通配的"User-Agent:*"行,就是沒(méi)有記錄與之匹配,訪問(wèn)不受限。
爬蟲(chóng)處理"robots.txt"文件時(shí),它所遵循的記錄必須符合下列規(guī)則之一:
第一個(gè)robot-name是爬蟲(chóng)名的大小寫(xiě)無(wú)關(guān)的子字符串;
第一個(gè)robot-name為“*”。
Disallow和Allow行:Disallow和Allow行緊跟在爬蟲(chóng)排斥記錄的User-Agent行之后。用來(lái)說(shuō)明顯式禁止或顯式允許特定爬蟲(chóng)使用哪些URL路徑。爬蟲(chóng)那個(gè)必須將期望訪問(wèn)的URL按序與排斥記錄中所有的Disallow和Allow規(guī)則進(jìn)行匹配。使用找到的第一個(gè)匹配項(xiàng)。如果沒(méi)有找到匹配項(xiàng),就說(shuō)明允許使用這個(gè)URL。要使Allow/Disallow行與一個(gè)URL相匹配,規(guī)則路徑就必須是URL路徑大小寫(xiě)相關(guān)的前綴。
Disallow/Allow 前綴匹配:前綴匹配通常都能很好地工作,但有幾種情況下它的表達(dá)力卻不夠強(qiáng)。如果希望無(wú)論使用什么路徑前綴,都不允許爬行一些特別的子目錄,那"robots.txt"是無(wú)能為力的。
Disallow/Allow前綴匹配的一些細(xì)節(jié):
Disallow和Allow規(guī)則要求大小寫(xiě)相關(guān)的前綴匹配。(與User-Agent行不同)這里的"*"(星號(hào))沒(méi)什么特殊的含義,但空字符串可以起到通配符的效果。
在進(jìn)行比較之前,要將規(guī)則路徑或URL路徑中所有"被轉(zhuǎn)義"的字符(%XX)都反轉(zhuǎn)為字節(jié)(除了正斜杠%2F之外,它必須嚴(yán)格匹配)。
如果規(guī)則路徑為空字符串,就與所有內(nèi)容都匹配。
其他有關(guān)robots.txt的知識(shí)解析 robots.txt 文件時(shí)還需遵循其他一些規(guī)則。
隨著規(guī)范的發(fā)展,"robots.txt"文件中可能會(huì)包含除了User-Agent、Disallow和Allow之外的其他字段。爬蟲(chóng)應(yīng)該將所有它不理解的字段都忽略掉。
為了實(shí)現(xiàn)后向兼容,不能在中間斷行。
注釋可以出現(xiàn)在文件的任何地方;注釋包括可選的空格,以及后面的注釋符(#)、注釋符后面的注釋,直到行結(jié)束符為止。
0.0版的拒絕爬蟲(chóng)訪問(wèn)標(biāo)準(zhǔn)并不支持Allow行。有些爬蟲(chóng)只實(shí)現(xiàn)了0.0版的規(guī)范,因此會(huì)忽略Allow行。在這種情況下,爬蟲(chóng)的行為會(huì)比較保守,有些允許訪問(wèn)的URL它也不去獲取。
緩存和robots.txt的過(guò)期如果一個(gè)爬蟲(chóng)在每次訪問(wèn)文件之前都要重新獲取"robots.txt"文件,Web服務(wù)器上的負(fù)載就會(huì)加倍,爬蟲(chóng)的效率也會(huì)降低。爬蟲(chóng)使用的替代方法是,它會(huì)周期性地獲取"robots.txt"文件,并將得到的文件緩存起來(lái)。爬蟲(chóng)會(huì)使用這個(gè)robots.txt文件的緩存副本,直到其過(guò)期為止。原始服務(wù)器和爬蟲(chóng)都會(huì)使用標(biāo)準(zhǔn)的HTTP存控制機(jī)制來(lái)控制"robots.txt"文件的緩存。爬蟲(chóng)應(yīng)該留意HTTP響應(yīng)中的Cache-Control和Expires首部。現(xiàn)在很多產(chǎn)品級(jí)爬蟲(chóng)都不是"HTTP/1.1"的客戶端;管理員應(yīng)該意識(shí)到這些爬蟲(chóng)不一定能夠理解那些為"robots.txt"資源提供的緩存指令。如果沒(méi)有提供Cache-Control指令,規(guī)范草案允許將其緩存7天。但實(shí)際上,這個(gè)時(shí)間通常太長(zhǎng)了。不了解"robots.txt"文件的Web服務(wù)器管理員通常會(huì)在響應(yīng)爬蟲(chóng)的訪問(wèn)時(shí)創(chuàng)建一個(gè)新的文件,但如果將缺乏信息的"robots.txt"文件緩存一周,新創(chuàng)建的"robots.txt"文件就沒(méi)什么效果了,站點(diǎn)管理員會(huì)責(zé)怪爬蟲(chóng)管理員沒(méi)有遵守拒絕爬蟲(chóng)訪問(wèn)標(biāo)準(zhǔn)。
得到最廣泛使用的Web爬蟲(chóng)都是因特網(wǎng)搜索引擎。因特網(wǎng)搜索引擎可以幫助用戶找到世界范圍內(nèi)涉及任意主題的文檔?,F(xiàn)在Web上很多最流行的站點(diǎn)都是搜索引擎。很多Web用戶將其作為起始點(diǎn),它們會(huì)為用戶提供寶貴的服務(wù),幫助用戶找到他們感興趣的信息。Web爬蟲(chóng)為因特網(wǎng)搜索引擎提供信息,它們獲取Web上的文檔,并允許搜索引擎創(chuàng)建索引,用以說(shuō)明哪些文檔中有哪些詞存在。搜索引擎是Web爬蟲(chóng)的主要來(lái)源。
Web發(fā)展的初期,搜索引擎就是一些相當(dāng)簡(jiǎn)單的數(shù)據(jù)庫(kù),可以幫助用戶在Web上定位文檔?,F(xiàn)在,Web上有數(shù)十億可供訪問(wèn)的頁(yè)面,搜索引擎已經(jīng)成為因特網(wǎng)用戶查找信息不可缺少的工具。它們?cè)诓粩嗟匕l(fā)展,以應(yīng)對(duì)Web龐大的規(guī)模,因此,現(xiàn)在已經(jīng)變得相當(dāng)復(fù)雜了。
面對(duì)數(shù)十億的Web頁(yè)面,和數(shù)百萬(wàn)要查找信息的用戶,搜索引擎要用復(fù)雜的爬蟲(chóng)來(lái)獲取這數(shù)十億Web頁(yè)面,還要使用復(fù)雜的查詢引擎來(lái)處理數(shù)百萬(wàn)用戶產(chǎn)生的查詢負(fù)荷。產(chǎn)品級(jí)Web爬蟲(chóng)的任務(wù),要獲取搜索索引所需的頁(yè)面,它要發(fā)出數(shù)十億條HTTP請(qǐng)求。如果每條請(qǐng)求都要花半秒鐘的時(shí)間(對(duì)有些服務(wù)器來(lái)說(shuō)可能慢了,對(duì)另一些服務(wù)器來(lái)說(shuō)可能快了)。如果請(qǐng)求是連續(xù)發(fā)出的,結(jié)果差不多是5700天!很顯然,大型爬蟲(chóng)得更聰明一些,要對(duì)請(qǐng)求進(jìn)行并行處理,并使用大量服務(wù)器來(lái)完成這項(xiàng)任務(wù)。但由于其規(guī)模龐大,爬行整個(gè)Web仍然是件十分艱巨的任務(wù)。
現(xiàn)在的搜索引擎都構(gòu)建了一些名為"全文索引"的復(fù)雜本地?cái)?shù)據(jù)庫(kù),裝載了全世界的Web頁(yè)面,以及這些頁(yè)面所包含的內(nèi)容。這些索引就像Web上所有文檔的卡片目錄一樣。搜索引擎爬蟲(chóng)會(huì)搜集Web頁(yè)面,把它們帶回家,并將其添加到全文索引中去。同時(shí),搜索引擎用戶會(huì)通過(guò)HotBot或Google這樣的Web搜索網(wǎng)關(guān)對(duì)全文索引進(jìn)行查詢。Web頁(yè)面總是在不斷地發(fā)生變化,而且爬行一大塊Web要花費(fèi)很長(zhǎng)的時(shí)間,所以全文索引充其量也就是Web的一個(gè)快照。
全文索引就是一個(gè)數(shù)據(jù)庫(kù),給它一個(gè)單詞,它可以立即提供包含那個(gè)單詞的所有文檔。創(chuàng)建了索引之后,就不需要對(duì)文檔自身進(jìn)行掃描了。
用戶向Web搜索引擎網(wǎng)關(guān)發(fā)布一條請(qǐng)求時(shí),會(huì)填寫(xiě)一個(gè)HTML表單,他的瀏覽器會(huì)用一個(gè)HTTP GET或POST請(qǐng)求將這個(gè)表單發(fā)送給網(wǎng)關(guān)。網(wǎng)關(guān)程序?qū)λ阉髡?qǐng)求進(jìn)行解析,并將Web UI查詢轉(zhuǎn)換成搜索全文索引所需的表達(dá)式。
旦搜索引擎通過(guò)其索引得到了查詢結(jié)果,網(wǎng)關(guān)應(yīng)用程序會(huì)獲取結(jié)果,并將其拼成結(jié)果頁(yè)面提供給終端用戶。很多Web頁(yè)面都可能包含任意指定的單詞,所以搜索引擎采用了一些很聰明的算法,嘗試著對(duì)結(jié)果進(jìn)行排名。為了將相關(guān)度最高的結(jié)果提供給用戶,搜索引擎要知道應(yīng)該按照什么順序來(lái)提供結(jié)果列表中的文檔。這被稱為相關(guān)性排名(relevancy ranking)——這是對(duì)一系列搜索結(jié)果的評(píng)分和排序處理。為了更好地輔助這一進(jìn)程,在爬行Web的過(guò)程中都會(huì)進(jìn)行數(shù)據(jù)統(tǒng)計(jì)。比如,對(duì)指向指定頁(yè)面的鏈接進(jìn)行計(jì)數(shù)有助于判斷其流行程度,還可以用此信息來(lái)衡量提供結(jié)果的順序。算法、爬行中獲取的輔助信息以及搜索引擎所使用的其他技巧都是保守最森嚴(yán)的秘密。
在搜索請(qǐng)求得到的前幾個(gè)結(jié)果中沒(méi)有看到自己想要查找的內(nèi)容時(shí),用戶通常會(huì)感到很沮喪,因此,查找站點(diǎn)時(shí)搜索結(jié)果的順序是很重要的。在搜索管理員們認(rèn)為能夠最好地描述其站點(diǎn)功能的單詞時(shí),會(huì)有眾多因素激勵(lì)著這些管理員,努力使其站點(diǎn)排在靠近結(jié)果頂端的位置上,尤其是那些依賴于用戶找到它們,并使用其服務(wù)的商業(yè)站點(diǎn)。這種對(duì)較好排列位置的期待引發(fā)了很多對(duì)搜索系統(tǒng)的博弈,也在搜索引擎的實(shí)現(xiàn)者和那些想方設(shè)法要將其站點(diǎn)列在突出位置的人之間引發(fā)了持久的拉鋸戰(zhàn)。很多管理員都列出了無(wú)數(shù)關(guān)鍵字(有些是毫不相關(guān)的),使用一些假冒頁(yè)面,或者采用欺詐行為——甚至?xí)镁W(wǎng)關(guān)應(yīng)用程序來(lái)生成一些在某些特定單詞上可以更好地欺騙搜索引擎相關(guān)性算法的假冒頁(yè)面。這么做的結(jié)果就是,搜索引擎和爬蟲(chóng)實(shí)現(xiàn)者們要不斷地修改相關(guān)性算法,以便更有效地抓住這些欺詐者。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/52757.html
對(duì)于python爬蟲(chóng)來(lái)說(shuō),大多人聽(tīng)起來(lái)是比較陌生的,但是對(duì)于一些專業(yè)人來(lái)說(shuō),對(duì)其了解還是比較的深刻的。但是,也會(huì)遇到一些問(wèn)題,比如我們?cè)谑褂门老x(chóng)爬取的時(shí)候,如果遇到對(duì)方設(shè)置了一些爬蟲(chóng)限制,那么爬起來(lái)就比較的麻煩了。那么,遇到代理ip問(wèn)題的話,要怎么去解決呢?下面就給大家詳細(xì)解答下?! ≈饕獌?nèi)容:代理ip使用原理,怎么在自己的爬蟲(chóng)里設(shè)置代理ip,怎么知道代理ip是否生效,沒(méi)生效的話哪里出了問(wèn)題,...
從行業(yè)角度來(lái)說(shuō),通過(guò)一步一步剖析,目標(biāo)就是簡(jiǎn)易,新手入門(mén)requests網(wǎng)絡(luò)爬蟲(chóng)及新手入門(mén)pandas數(shù)據(jù)剖析就能完成,文中關(guān)鍵為大家介紹Python網(wǎng)絡(luò)爬蟲(chóng)抓取金融衍生品數(shù)據(jù)庫(kù)的經(jīng)典案例,感興趣的小伙伴一起了解一下吧 哈嘍大家好政胤今日教給大家抓取金融衍生品數(shù)據(jù)和信息 每日任務(wù)介紹 最先,顧客原消費(fèi)是獲得https://hq.smm.cn/copper網(wǎng)站里的價(jià)錢(qián)數(shù)據(jù)和信息(注:獲得的...
大家都知道,在python當(dāng)中,需要面對(duì)是各種各樣的問(wèn)題,比如我們需要用到的是:使用python爬蟲(chóng)實(shí)現(xiàn)子域名探測(cè),這種技能是值得我們?nèi)ミM(jìn)行學(xué)習(xí)的,但是學(xué)習(xí)的話,內(nèi)容還是比較多的,下面就具體的內(nèi)容,給大家做出一個(gè)詳細(xì)解答。 前言 意義:子域名枚舉是為一個(gè)或多個(gè)域查找子域的過(guò)程,它是信息收集階段的重要組成部分?! ?shí)現(xiàn)方法:使用爬蟲(chóng)與字典爆破?! ∫?、爬蟲(chóng) 1.ip138 defsear...
閱讀 2530·2021-11-12 10:34
閱讀 1527·2019-08-29 16:15
閱讀 2745·2019-08-29 15:17
閱讀 1451·2019-08-23 17:09
閱讀 439·2019-08-23 11:37
閱讀 2512·2019-08-23 10:39
閱讀 549·2019-08-22 16:43
閱讀 3173·2019-08-22 14:53