鄒科文++李達(dá)++鄧婷敏++李嘉振++陳義明
摘要:隨著計(jì)算機(jī)技術(shù)和internet的迅猛發(fā)展,信息和知識(shí)呈現(xiàn)爆炸性的增長(zhǎng),如何獲取和利用信息成為現(xiàn)代社會(huì)提高競(jìng)爭(zhēng)力的重要途徑,網(wǎng)絡(luò)爬蟲(chóng)是達(dá)到這一途徑的重要工具。該文詳細(xì)闡述了網(wǎng)絡(luò)爬蟲(chóng)的體系結(jié)構(gòu)、工作原理和URL搜索策略,針對(duì)某些網(wǎng)站采用的“反爬”措施,提出了幾種爬取策略,以實(shí)現(xiàn)網(wǎng)頁(yè)的有效爬取。對(duì)實(shí)際網(wǎng)絡(luò)爬蟲(chóng)獲取信息具有重要的參考價(jià)值。
關(guān)鍵詞:網(wǎng)絡(luò)爬蟲(chóng);反爬蟲(chóng)機(jī)制;搜索引擎
中圖分類(lèi)號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)07-0061-03
信息和知識(shí)爆炸增長(zhǎng)的時(shí)代,搜索引擎成為人們獲取信息的重要工具。搜索引擎釋放出來(lái)的網(wǎng)絡(luò)爬蟲(chóng)會(huì)大量占用互聯(lián)網(wǎng)帶寬,很可能在短時(shí)間內(nèi)導(dǎo)致網(wǎng)站訪問(wèn)速度緩慢,甚至無(wú)法訪問(wèn)。應(yīng)對(duì)此種情況,許多網(wǎng)站采取了一些措施來(lái)攔截網(wǎng)絡(luò)爬蟲(chóng)的爬取。本文在分析網(wǎng)絡(luò)爬蟲(chóng)原理的基礎(chǔ)上,針對(duì)“反爬”網(wǎng)站提出了一些有效的爬取策略。
1網(wǎng)絡(luò)爬蟲(chóng)概述
網(wǎng)絡(luò)爬蟲(chóng)是抓取網(wǎng)頁(yè)信息的一種程序,它可用來(lái)檢查一系列站點(diǎn)的有效性,當(dāng)按照需求抓取并保存數(shù)據(jù)時(shí),是搜索引擎的重要組成部分。它還可以定向采集某些網(wǎng)站下的特定信息,比如招聘、二手買(mǎi)賣(mài)等信息。
網(wǎng)絡(luò)上的網(wǎng)頁(yè)許多都由超鏈接連接,故形成了一張網(wǎng),網(wǎng)絡(luò)爬蟲(chóng)因此也叫做網(wǎng)絡(luò)蜘蛛,順著網(wǎng)爬,每到一個(gè)網(wǎng)頁(yè)就抓取信息并抽取新的超鏈接,用于進(jìn)一步爬行的線(xiàn)索。網(wǎng)絡(luò)爬蟲(chóng)爬行的起點(diǎn)叫做種子,可以自己設(shè)定也可以從某些系列網(wǎng)站獲取。
1.1網(wǎng)絡(luò)爬蟲(chóng)的組成
網(wǎng)絡(luò)爬蟲(chóng)主要由控制器、解析器和資源庫(kù)三部分組成??刂破魇蔷W(wǎng)絡(luò)爬蟲(chóng)的控制中心,它負(fù)責(zé)分配線(xiàn)程并調(diào)用爬蟲(chóng)為其分配爬取任務(wù);解析器是網(wǎng)絡(luò)爬蟲(chóng)的核心,它的主要工作是下載網(wǎng)頁(yè)并對(duì)網(wǎng)頁(yè)中的信息進(jìn)行處理,例如刪除一些JS腳本、HTML標(biāo)簽和空格字符等,抽取特殊HTML標(biāo)簽的功能,分析數(shù)據(jù)功能;資源庫(kù)是用于保存下載的網(wǎng)頁(yè)資源,并提供生成索引的目標(biāo)源。一般采用中大型的數(shù)據(jù)庫(kù)存儲(chǔ),如Oracle、Sql Server等。
1.2網(wǎng)絡(luò)爬蟲(chóng)的工作原理
網(wǎng)絡(luò)爬蟲(chóng)的基本工作流程如下:
1)選取初始種子URL集合;
2)將URL集合放入待抓取URL隊(duì)列;
3)從待抓取URL隊(duì)列中取出待抓取URL,解析DNS,得到主機(jī)IP,將URL對(duì)應(yīng)網(wǎng)頁(yè)下載并存儲(chǔ)至網(wǎng)頁(yè)資源庫(kù)。結(jié)束后將這些URL放入已抓取URL隊(duì)列。
4)從已抓取URL隊(duì)列中的URL分析出新的滿(mǎn)足需求的URL,放入待抓取URL隊(duì)列。
5)循環(huán)第3步,直至滿(mǎn)足停止條件。
傳統(tǒng)網(wǎng)絡(luò)爬蟲(chóng)框架如圖1所示。
1.3網(wǎng)絡(luò)爬蟲(chóng)的搜索策略
網(wǎng)絡(luò)爬蟲(chóng)在運(yùn)行過(guò)程中,待抓取URL隊(duì)列是很重要的一部分。待抓取URL隊(duì)列中的URL如何排序也是一個(gè)值得研究的問(wèn)題,因?yàn)檫@涉及先抓取那個(gè)頁(yè)面,后抓取哪個(gè)頁(yè)面。而排列URL順序的方法,叫做抓取策略。常見(jiàn)的網(wǎng)絡(luò)爬蟲(chóng)策略有:
1)廣度優(yōu)先搜索策略。在抓取過(guò)程中,由根節(jié)點(diǎn)開(kāi)始,完成當(dāng)前層次的搜索后才跳到下一層次的搜索。該策略實(shí)現(xiàn)較為簡(jiǎn)單,其基本思想是認(rèn)為與初始URL在一定鏈接距離內(nèi)的網(wǎng)頁(yè)具有主題相關(guān)性的概率很大。
2)深度優(yōu)先搜索策略。這種策略的主要思想是網(wǎng)絡(luò)爬蟲(chóng)從起始頁(yè)開(kāi)始,一個(gè)鏈接一個(gè)鏈接跟蹤下去,處理完這條線(xiàn)路之后再轉(zhuǎn)入下一個(gè)起始頁(yè),繼續(xù)跟蹤鏈接。
3)最佳優(yōu)先搜索策略。該策略通過(guò)計(jì)算 URL 描述文本與目標(biāo)網(wǎng)頁(yè)的相似度,或者與主題的相關(guān)性,根據(jù)所設(shè)定的閾值選出有效 URL 進(jìn)行抓取。
4)反向鏈接數(shù)策略,反向鏈接數(shù)是指一個(gè)網(wǎng)頁(yè)被其他網(wǎng)頁(yè)鏈接指向的數(shù)量。反向鏈接數(shù)表示的是一個(gè)網(wǎng)頁(yè)的內(nèi)容受到其他人的推薦的程度。因此,很多時(shí)候搜索引擎的抓取系統(tǒng)會(huì)使用這個(gè)指標(biāo)來(lái)評(píng)價(jià)網(wǎng)頁(yè)的重要程度,從而決定不同網(wǎng)頁(yè)的抓取先后順序。
2如何應(yīng)對(duì)站點(diǎn)反爬蟲(chóng)機(jī)制
網(wǎng)絡(luò)爬蟲(chóng)會(huì)對(duì)目標(biāo)站點(diǎn)發(fā)送大量請(qǐng)求,而這樣的爬蟲(chóng)機(jī)制會(huì)消耗不少網(wǎng)站資源,這對(duì)于中小型網(wǎng)站的負(fù)載是 巨大的,甚至因此而崩潰,故不少網(wǎng)站都采取了反爬蟲(chóng)的機(jī)制。例如:通過(guò)識(shí)別爬蟲(chóng)的User-Agent信息來(lái)拒絕爬蟲(chóng),通過(guò)Filter過(guò)濾網(wǎng)絡(luò)爬蟲(chóng),通過(guò)網(wǎng)站流量統(tǒng)計(jì)系統(tǒng)和日志分析來(lái)識(shí)別爬蟲(chóng),利用網(wǎng)站的實(shí)時(shí)反爬蟲(chóng)防火墻實(shí)現(xiàn)策略。為了不被站點(diǎn)判斷為爬蟲(chóng)而被拒絕訪問(wèn)請(qǐng)求,此處提供兩種方法來(lái)維持爬蟲(chóng)的正常運(yùn)轉(zhuǎn)。
2.1降低訪問(wèn)請(qǐng)求頻率
降低訪問(wèn)請(qǐng)求頻率,在一定程度上是,模仿真人瀏覽頁(yè)面的動(dòng)作,故而不會(huì)輕易被網(wǎng)站所封殺,拒絕訪問(wèn)。實(shí)現(xiàn)的方法為在訪問(wèn)URL的程序中,將訪問(wèn)請(qǐng)求的線(xiàn)程休眠一段時(shí)間。
具體代碼如下:
try { Thread.currentThread().sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Sleep的休眠時(shí)間按照需求而定,以毫秒(ms)為單位。這種策略的優(yōu)點(diǎn)是減少了目標(biāo)站點(diǎn)單位時(shí)間內(nèi)的負(fù)載,而缺點(diǎn)則為爬蟲(chóng)爬取效率的降低。
2.2設(shè)置代理服務(wù)器
設(shè)置代理服務(wù)器,較之前一種方法來(lái)說(shuō)則以爬蟲(chóng)的效率為首要要求,實(shí)質(zhì)就是某些網(wǎng)站的反爬蟲(chóng)機(jī)制會(huì)封殺爬蟲(chóng)請(qǐng)求頻率過(guò)高的主機(jī)的IP,為了解決這一問(wèn)題,使用代理服務(wù)器,更換IP以及端口,解除站點(diǎn)對(duì)訪問(wèn)頻率高的主機(jī)訪問(wèn)的限制。
有兩種調(diào)用的方法,具體代碼如下:
方法一:
Jsoup.connect("http://pv.sohu.com/cityjson").proxy(Proxy.Type.HTTP, "61.158.237.35", 3128).get();
方法二:
System.setProperty("proxySet", "true"); System.setProperty("http.proxyHost", "61.158.237.35"); System.setProperty("http.proxyPort", "3128");
Document a = Jsoup.connect("http://pv.sohu.com/cityjson").get();
System.out.println(a);
其中的代理IP與端口為 61.158.237.35:3128。
代理前后的效果如圖2,3所示。
優(yōu)點(diǎn):保證爬蟲(chóng)執(zhí)行不被站點(diǎn)封殺。只要有足夠IP代理可滿(mǎn)足爬取條件。
缺點(diǎn):?jiǎn)挝粫r(shí)間內(nèi)消耗資源過(guò)多,給站點(diǎn)帶來(lái)較大的負(fù)載。延遲加大,失敗率提高。
2.3偽裝用戶(hù)代理
用戶(hù)代理User-agent是HTTP協(xié)議中的一個(gè)字段,作用是描述發(fā)出HTTP請(qǐng)求終端的一些信息。通俗來(lái)說(shuō),就是判斷訪問(wèn)網(wǎng)站對(duì)象的類(lèi)別,每個(gè)瀏覽器和正規(guī)的爬蟲(chóng)都有固定的user-agent,因此只要將這個(gè)字段改成知名的user-agent就可以成功偽裝了。對(duì)于偽裝瀏覽器user-agent或知名爬蟲(chóng)user-agent,更推薦偽裝瀏覽器,因?yàn)闉g覽器使用者可以是任何人,沒(méi)有固定的IP,而知名爬蟲(chóng)user-agent一般都有固定IP。下面給出若干個(gè)瀏覽器的user-agent,每次發(fā)送請(qǐng)求時(shí)可隨機(jī)選取一個(gè)。
Mozilla/4.0( compatible ;MSIE 8.0;Windows NT 6.0)
Mozilla/4.0( compatible ;MSIE 7.0;Windows NT 5.2)
Mozilla/4.0( compatible ;MSIE 6.0;Windows NT 5.1)
設(shè)置代碼如下:
HttpGet getMethod = new HttpGet(“URl”);
getMethod.setHeader(“User-Agent”,”user agent內(nèi)容”);
2.4 自動(dòng)登錄
有些網(wǎng)站一檢測(cè)到某IP的訪問(wèn)量異常,就會(huì)馬上提出要登錄的要求。針對(duì)這種“反爬”策略,在登錄前需要做一些準(zhǔn)備,查清楚POST登錄請(qǐng)求時(shí)要附帶的參數(shù),建議先用badboy錄制登錄過(guò)程,然后將這一過(guò)程導(dǎo)出為jmeter文件,最后用jmeter查看登錄所需的參數(shù)。
3結(jié)束語(yǔ)
總之,為了防止爬蟲(chóng)被封,原則就是偽裝成正常的用戶(hù),只要按照這個(gè)原則總有方法可循。不過(guò)若是能熟知一些反爬蟲(chóng)的原理,然后有針對(duì)地進(jìn)行拆招應(yīng)該還是十分有效的。
傳統(tǒng)網(wǎng)絡(luò)爬蟲(chóng)應(yīng)用于抓取靜態(tài)Web網(wǎng)頁(yè)的信息,而AJAX/Web2.0的流行使得如何抓取動(dòng)態(tài)頁(yè)面信息成為目前網(wǎng)絡(luò)爬蟲(chóng)的瓶頸。另外,網(wǎng)絡(luò)爬蟲(chóng)的效率與網(wǎng)站穩(wěn)定安全還未能完全達(dá)到兩者兼得的狀態(tài)。對(duì)于搜索引擎,它抓取的消耗較大,因此爬蟲(chóng)的效率、特性和抓取的質(zhì)量就顯得更為重要。在未來(lái)的大數(shù)據(jù)時(shí)代,網(wǎng)絡(luò)爬蟲(chóng)技術(shù)地位更為重要,和人工智能技術(shù)相結(jié)合將是熱門(mén)的課題。
參考文獻(xiàn):
[1] 郭小丹.幾種開(kāi)源網(wǎng)絡(luò)爬蟲(chóng)功能比較[J].黑龍江科技信息,2015(25).
[2] 林雄強(qiáng).網(wǎng)絡(luò)爬蟲(chóng)[J].中國(guó)科技博覽,2014(24).
[3] 趙全軍,成功,李小正,等.一種改進(jìn)的網(wǎng)絡(luò)爬蟲(chóng)搜索策略[J].中國(guó)科技信息,2014(14).
[4] 劉慶杰,孫旭光,王小英.通過(guò)Filter抵御網(wǎng)頁(yè)爬蟲(chóng)[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2010(1).
[5] 吳曉暉,紀(jì)星.Web爬蟲(chóng)檢測(cè)技術(shù)綜述[J].湖北汽車(chē)工業(yè)學(xué)院學(xué)報(bào),2012(1).
[6] 范純龍,袁濱,余周華, 等.基于陷阱技術(shù)的網(wǎng)絡(luò)爬蟲(chóng)檢測(cè)[J].計(jì)算機(jī)應(yīng)用,2010(7).
[7] 吳歡,宋力,劉遇哲.基于HTTP協(xié)議特征字的識(shí)別研究[J].計(jì)算機(jī)與網(wǎng)絡(luò),2015(9).