网站seo优化_seo云优化_搜索引擎seo_启新网络服务中心

企億推信息網(wǎng)
專注網(wǎng)絡(luò)推廣服務(wù)

搜索引擎蜘蛛爬行原理

深度優(yōu)先遍歷代碼

//////深度優(yōu)先遍歷接口For連通圖

///publicvoidDFSTraverse()

//////深度優(yōu)先遍歷算法

//////頂點(diǎn)privatevoidDFS(Vertexv)

v.isVisited=true;//首先將訪問(wèn)標(biāo)志設(shè)為true標(biāo)識(shí)為已訪問(wèn)

Console.Write(v.data.ToString()+);//進(jìn)行訪問(wèn)操作:這里是輸出頂點(diǎn)data

Nodenode=v.firstEdge;

while(node!=null)

if(node.adjvex.isVisited==false)//如果鄰接頂點(diǎn)未被訪問(wèn)

2.3.2廣度優(yōu)先策略圖的廣度優(yōu)先遍歷算法是一個(gè)分層遍歷的過(guò)程,和二叉樹(shù)的廣度優(yōu)先遍歷類似,其基本思想在于:從圖中的某一個(gè)頂點(diǎn)Vi觸發(fā),訪問(wèn)此頂點(diǎn)后,依次訪問(wèn)Vi的各個(gè)為層訪問(wèn)過(guò)的鄰接點(diǎn),然后分別從這些鄰接點(diǎn)出發(fā),直至圖中所有頂點(diǎn)都被訪問(wèn)到。對(duì)于上圖所示的無(wú)向連通圖,若從頂點(diǎn)V1開(kāi)始,則廣度優(yōu)先遍歷的頂點(diǎn)訪問(wèn)順序是V1→V2→V3→V4→V5→V6→V7→V8。廣度優(yōu)先遍歷代碼:

//////寬度優(yōu)先遍歷接口For連通圖

///publicvoidBFSTraverse()

//////寬度優(yōu)先遍歷算法

//////頂點(diǎn)privatevoidBFS(Vertexv)

v.isVisited=true;//首先將訪問(wèn)標(biāo)志設(shè)為true標(biāo)識(shí)為已訪問(wèn)

Console.Write(v.data.ToString()+);//進(jìn)行訪問(wèn)操作:這里是輸出頂點(diǎn)data

QueueverQueue=newQueue();//使用隊(duì)列存儲(chǔ)

verQueue.Enqueue(v);

while(verQueue.Count>0)

Vertexw=verQueue.Dequeue();

Nodenode=w.firstEdge;

//訪問(wèn)此頂點(diǎn)的所有鄰接節(jié)點(diǎn)

while(node!=null)

//如果鄰接節(jié)點(diǎn)沒(méi)有被訪問(wèn)過(guò)則訪問(wèn)它的邊

if(node.adjvex.isVisited==false)

搜索引擎蜘蛛爬行原理

(圖1)

搜索引擎蜘蛛如何爬行URL并形成快照僅作了解。2.3.3反向鏈接數(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è)的抓取先后順序。?在真實(shí)的網(wǎng)絡(luò)環(huán)境中,由于廣告鏈接、作弊鏈接的存在,反向鏈接數(shù)不能完全等他我那個(gè)也的重要程度。因此,搜索引擎往往考慮一些可靠的反向鏈接數(shù)。2.3.4PartialPageRank策略?PartialPageRank算法借鑒了PageRank算法的思想:對(duì)于已經(jīng)下載的網(wǎng)頁(yè),連同待抓取URL隊(duì)列中的URL,形成網(wǎng)頁(yè)集合,計(jì)算每個(gè)頁(yè)面的PageRank值,計(jì)算完之后,將待抓取URL隊(duì)列中的URL按照PageRank值的大小排列,并按照該順序抓取頁(yè)面。?如果每次抓取一個(gè)頁(yè)面,就重新計(jì)算PageRank值,一種折中方案是:每抓取K個(gè)頁(yè)面后,重新計(jì)算一次PageRank值。但是這種情況還會(huì)有一個(gè)問(wèn)題:對(duì)于已經(jīng)下載下來(lái)的頁(yè)面中分析出的鏈接,也就是我們之前提到的未知網(wǎng)頁(yè)那一部分,暫時(shí)是沒(méi)有PageRank值的。為了解決這個(gè)問(wèn)題,會(huì)給這些頁(yè)面一個(gè)臨時(shí)的PageRank值:將這個(gè)網(wǎng)頁(yè)所有入鏈傳遞進(jìn)來(lái)的PageRank值進(jìn)行匯總,這樣就形成了該未知頁(yè)面的PageRank值,從而參與排序。下面舉例說(shuō)明:2.3.5OPIC策略策略?該算法實(shí)際上也是對(duì)頁(yè)面進(jìn)行一個(gè)重要性打分。在算法開(kāi)始前,給所有頁(yè)面一個(gè)相同的初始現(xiàn)金(cash)。當(dāng)下載了某個(gè)頁(yè)面P之后,將P的現(xiàn)金分?jǐn)偨o所有從P中分析出的鏈接,并且將P的現(xiàn)金清空。對(duì)于待抓取URL隊(duì)列中的所有頁(yè)面按照現(xiàn)金數(shù)進(jìn)行排序。?2.3.6大站優(yōu)先策略?對(duì)于待抓取URL隊(duì)列中的所有網(wǎng)頁(yè),根據(jù)所屬的網(wǎng)站進(jìn)行分類。對(duì)于待下載頁(yè)面數(shù)多的網(wǎng)站,優(yōu)先下載。這個(gè)策略也因此叫做大站優(yōu)先策略。三、網(wǎng)絡(luò)爬蟲(chóng)分類?開(kāi)發(fā)網(wǎng)絡(luò)爬蟲(chóng)應(yīng)該選擇Nutch、Crawler4j、WebMagic、scrapy、WebCollector還是其他的?上面說(shuō)的爬蟲(chóng),基本可以分3類:?(1)分布式爬蟲(chóng):Nutch?(2)JAVA爬蟲(chóng):Crawler4j、WebMagic、WebCollector?(3)非JAVA爬蟲(chóng):scrapy(基于Python語(yǔ)言開(kāi)發(fā))?3.1分布式爬蟲(chóng)?爬蟲(chóng)使用分布式,主要是解決兩個(gè)問(wèn)題:?1)海量URL管理?2)網(wǎng)速?現(xiàn)在比較流行的分布式爬蟲(chóng),是Apache的Nutch。但是對(duì)于大多數(shù)用戶來(lái)說(shuō),Nutch是這幾類爬蟲(chóng)里,最不好的選擇,理由如下:?1)Nutch是為搜索引擎設(shè)計(jì)的爬蟲(chóng),大多數(shù)用戶是需要一個(gè)做精準(zhǔn)數(shù)據(jù)爬取(精抽取)的爬蟲(chóng)。Nutch運(yùn)行的一套流程里,有三分之二是為了搜索引擎而設(shè)計(jì)的。對(duì)精抽取沒(méi)有太大的意義。也就是說(shuō),用Nutch做數(shù)據(jù)抽取,會(huì)浪費(fèi)很多的時(shí)間在不必要的計(jì)算上。而且如果你試圖通過(guò)對(duì)Nutch進(jìn)行二次開(kāi)發(fā),來(lái)使得它適用于精抽取的業(yè)務(wù),基本上就要破壞Nutch的框架,把Nutch改的面目全非,有修改Nutch的能力,真的不如自己重新寫一個(gè)分布式爬蟲(chóng)框架了。?2)Nutch依賴hadoop運(yùn)行,hadoop本身會(huì)消耗很多的時(shí)間。如果集群機(jī)器數(shù)量較少,爬取速度反而不如單機(jī)爬蟲(chóng)快。?3)Nutch雖然有一套插件機(jī)制,而且作為亮點(diǎn)宣傳。可以看到一些開(kāi)源的Nutch插件,提供精抽取的功能。但是開(kāi)發(fā)過(guò)Nutch插件的人都知道,Nutch的插件系統(tǒng)有多蹩腳。利用反射的機(jī)制來(lái)加載和調(diào)用插件,使得程序的編寫和調(diào)試都變得異常困難,更別說(shuō)在上面開(kāi)發(fā)一套復(fù)雜的精抽取系統(tǒng)了。而且Nutch并沒(méi)有為精抽取提供相應(yīng)的插件掛載點(diǎn)。Nutch的插件有只有五六個(gè)掛載點(diǎn),而這五六個(gè)掛載點(diǎn)都是為了搜索引擎服務(wù)的,并沒(méi)有為精抽取提供掛載點(diǎn)。大多數(shù)Nutch的精抽取插件,都是掛載在“頁(yè)面解析”(parser)這個(gè)掛載點(diǎn)的,這個(gè)掛載點(diǎn)其實(shí)是為了解析鏈接(為后續(xù)爬取提供URL),以及為搜索引擎提供一些易抽取的網(wǎng)頁(yè)信息(網(wǎng)頁(yè)的meta信息、text文本)。?4)用Nutch進(jìn)行爬蟲(chóng)的二次開(kāi)發(fā),爬蟲(chóng)的編寫和調(diào)試所需的時(shí)間,往往是單機(jī)爬蟲(chóng)所需的十倍時(shí)間不止。了解Nutch源碼的學(xué)習(xí)成本很高,何況是要讓一個(gè)團(tuán)隊(duì)的人都讀懂Nutch源碼。調(diào)試過(guò)程中會(huì)出現(xiàn)除程序本身之外的各種問(wèn)題(hadoop的問(wèn)題、hbase的問(wèn)題)。?5)很多人說(shuō)Nutch2有g(shù)ora,可以持久化數(shù)據(jù)到avro文件、hbase、mysql等。很多人其實(shí)理解錯(cuò)了,這里說(shuō)的持久化數(shù)據(jù),是指將URL信息(URL管理所需要的數(shù)據(jù))存放到avro、hbase、mysql。并不是你要抽取的結(jié)構(gòu)化數(shù)據(jù)。其實(shí)對(duì)大多數(shù)人來(lái)說(shuō),URL信息存在哪里無(wú)所謂。?6)Nutch2的版本目前并不適合開(kāi)發(fā)。官方現(xiàn)在穩(wěn)定的Nutch版本是nutch2.2.1,但是這個(gè)版本綁定了gora-0.3。如果想用hbase配合nutch(大多數(shù)人用nutch2就是為了用hbase),只能使用0.90版本左右的hbase,相應(yīng)的就要將hadoop版本降到hadoop0.2左右。而且nutch2的官方教程比較有誤導(dǎo)作用,Nutch2的教程有兩個(gè),分別是Nutch1.x和Nutch2.x,這個(gè)Nutch2.x官網(wǎng)上寫的是可以支持到hbase0.94。但是實(shí)際上,這個(gè)Nutch2.x的意思是Nutch2.3之前、Nutch2.2.1之后的一個(gè)版本,這個(gè)版本在官方的SVN中不斷更新。而且非常不穩(wěn)定(一直在修改)。?所以,如果你不是要做搜索引擎,盡量不要選擇Nutch作為爬蟲(chóng)。有些團(tuán)隊(duì)就喜歡跟風(fēng),非要選擇Nutch來(lái)開(kāi)發(fā)精抽取的爬蟲(chóng),其實(shí)是沖著Nutch的名氣(Nutch作者是DougCutting),當(dāng)然最后的結(jié)果往往是項(xiàng)目延期完成。?如果你是要做搜索引擎,Nutch1.x是一個(gè)非常好的選擇。Nutch1.x和solr或者es配合,就可以構(gòu)成一套非常強(qiáng)大的搜索引擎了。如果非要用Nutch2的話,建議等到Nutch2.3發(fā)布再看。目前的Nutch2是一個(gè)非常不穩(wěn)定的版本。?分布式爬蟲(chóng)平臺(tái)架構(gòu)圖?3.2JAVA爬蟲(chóng)?這里把JAVA爬蟲(chóng)單獨(dú)分為一類,是因?yàn)镴AVA在網(wǎng)絡(luò)爬蟲(chóng)這塊的生態(tài)圈是非常完善的。相關(guān)的資料也是最全的。這里可能有爭(zhēng)議,我只是隨便談?wù)劇?其實(shí)開(kāi)源網(wǎng)絡(luò)爬蟲(chóng)(框架)的開(kāi)發(fā)非常簡(jiǎn)單,難問(wèn)題和復(fù)雜的問(wèn)題都被以前的人解決了(比如DOM樹(shù)解析和定位、字符集檢測(cè)、海量URL去重),可以說(shuō)是毫無(wú)技術(shù)含量。包括Nutch,其實(shí)Nutch的技術(shù)難點(diǎn)是開(kāi)發(fā)hadoop,本身代碼非常簡(jiǎn)單。網(wǎng)絡(luò)爬蟲(chóng)從某種意義來(lái)說(shuō),類似遍歷本機(jī)的文件,查找文件中的信息。沒(méi)有任何難度可言。之所以選擇開(kāi)源爬蟲(chóng)框架,就是為了省事。比如爬蟲(chóng)的URL管理、線程池之類的模塊,誰(shuí)都能做,但是要做穩(wěn)定也是需要一段時(shí)間的調(diào)試和修改的。?對(duì)于爬蟲(chóng)的功能來(lái)說(shuō)。用戶比較關(guān)心的問(wèn)題往往是:?1)爬蟲(chóng)支持多線程么、爬蟲(chóng)能用代理么、爬蟲(chóng)會(huì)爬取重復(fù)數(shù)據(jù)么、爬蟲(chóng)能爬取JS生成的信息么??不支持多線程、不支持代理、不能過(guò)濾重復(fù)URL的,那都不叫開(kāi)源爬蟲(chóng),那叫循環(huán)執(zhí)行http請(qǐng)求。?能不能爬js生成的信息和爬蟲(chóng)本身沒(méi)有太大關(guān)系。爬蟲(chóng)主要是負(fù)責(zé)遍歷網(wǎng)站和下載頁(yè)面。爬js生成的信息和網(wǎng)頁(yè)信息抽取模塊有關(guān),往往需要通過(guò)模擬瀏覽器(htmlunit,selenium)來(lái)完成。這些模擬瀏覽器,往往需要耗費(fèi)很多的時(shí)間來(lái)處理一個(gè)頁(yè)面。所以一種策略就是,使用這些爬蟲(chóng)來(lái)遍歷網(wǎng)站,遇到需要解析的頁(yè)面,就將網(wǎng)頁(yè)的相關(guān)信息提交給模擬瀏覽器,來(lái)完成JS生成信息的抽取。?2)爬蟲(chóng)可以爬取ajax信息么??網(wǎng)頁(yè)上有一些異步加載的數(shù)據(jù),爬取這些數(shù)據(jù)有兩種方法:使用模擬瀏覽器(問(wèn)題1中描述過(guò)了),或者分析ajax的http請(qǐng)求,自己生成ajax請(qǐng)求的url,獲取返回的數(shù)據(jù)。如果是自己生成ajax請(qǐng)求,使用開(kāi)源爬蟲(chóng)的意義在哪里?其實(shí)是要用開(kāi)源爬蟲(chóng)的線程池和URL管理功能(比如斷點(diǎn)爬取)。?如果我已經(jīng)可以生成我所需要的ajax請(qǐng)求(列表),如何用這些爬蟲(chóng)來(lái)對(duì)這些請(qǐng)求進(jìn)行爬取??爬蟲(chóng)往往都是設(shè)計(jì)成廣度遍歷或者深度遍歷的模式,去遍歷靜態(tài)或者動(dòng)態(tài)頁(yè)面。爬取ajax信息屬于deepweb(深網(wǎng))的范疇,雖然大多數(shù)爬蟲(chóng)都不直接支持。但是也可以通過(guò)一些方法來(lái)完成。比如WebCollector使用廣度遍歷來(lái)遍歷網(wǎng)站。爬蟲(chóng)的第一輪爬取就是爬取種子集合(seeds)中的所有url。簡(jiǎn)單來(lái)說(shuō),就是將生成的ajax請(qǐng)求作為種子,放入爬蟲(chóng)。用爬蟲(chóng)對(duì)這些種子,進(jìn)行深度為1的廣度遍歷(默認(rèn)就是廣度遍歷)。?3)爬蟲(chóng)怎么爬取要登陸的網(wǎng)站??這些開(kāi)源爬蟲(chóng)都支持在爬取時(shí)指定cookies,模擬登陸主要是靠cookies。至于cookies怎么獲取,不是爬蟲(chóng)管的事情。你可以手動(dòng)獲取、用http請(qǐng)求模擬登陸或者用模擬瀏覽器自動(dòng)登陸獲取cookie。?4)爬蟲(chóng)怎么抽取網(wǎng)頁(yè)的信息??開(kāi)源爬蟲(chóng)一般都會(huì)集成網(wǎng)頁(yè)抽取工具。主要支持兩種規(guī)范:CSSSELECTOR和XPATH。至于哪個(gè)好,這里不評(píng)價(jià)。?5)爬蟲(chóng)怎么保存網(wǎng)頁(yè)的信息??有一些爬蟲(chóng),自帶一個(gè)模塊負(fù)責(zé)持久化。比如webmagic,有一個(gè)模塊叫pipeline。通過(guò)簡(jiǎn)單地配置,可以將爬蟲(chóng)抽取到的信息,持久化到文件、數(shù)據(jù)庫(kù)等。還有一些爬蟲(chóng),并沒(méi)有直接給用戶提供數(shù)據(jù)持久化的模塊。比如crawler4j和webcollector。讓用戶自己在網(wǎng)頁(yè)處理模塊中添加提交數(shù)據(jù)庫(kù)的操作。至于使用pipeline這種模塊好不好,就和操作數(shù)據(jù)庫(kù)使用ORM好不好這個(gè)問(wèn)題類似,取決于你的業(yè)務(wù)。?6)爬蟲(chóng)被網(wǎng)站封了怎么辦??爬蟲(chóng)被網(wǎng)站封了,一般用多代理(隨機(jī)代理)就可以解決。但是這些開(kāi)源爬蟲(chóng)一般沒(méi)有直接支持隨機(jī)代理的切換。所以用戶往往都需要自己將獲取的代理,放到一個(gè)全局?jǐn)?shù)組中,自己寫一個(gè)代理隨機(jī)獲取(從數(shù)組中)的代碼。?7)網(wǎng)頁(yè)可以調(diào)用爬蟲(chóng)么??爬蟲(chóng)的調(diào)用是在Web的服務(wù)端調(diào)用的,平時(shí)怎么用就怎么用,這些爬蟲(chóng)都可以使用。?8)爬蟲(chóng)速度怎么樣??單機(jī)開(kāi)源爬蟲(chóng)的速度,基本都可以講本機(jī)的網(wǎng)速用到極限。爬蟲(chóng)的速度慢,往往是因?yàn)橛脩舭丫€程數(shù)開(kāi)少了、網(wǎng)速慢,或者在數(shù)據(jù)持久化時(shí),和數(shù)據(jù)庫(kù)的交互速度慢。而這些東西,往往都是用戶的機(jī)器和二次開(kāi)發(fā)的代碼決定的。這些開(kāi)源爬蟲(chóng)的速度,都很可以。?9)明明代碼寫對(duì)了,爬不到數(shù)據(jù),是不是爬蟲(chóng)有問(wèn)題,換個(gè)爬蟲(chóng)能解決么??如果代碼寫對(duì)了,又爬不到數(shù)據(jù),換其他爬蟲(chóng)也是一樣爬不到。遇到這種情況,要么是網(wǎng)站把你封了,要么是你爬的數(shù)據(jù)是javascript生成的。爬不到數(shù)據(jù)通過(guò)換爬蟲(chóng)是不能解決的。?10)哪個(gè)爬蟲(chóng)可以判斷網(wǎng)站是否爬完、那個(gè)爬蟲(chóng)可以根據(jù)主題進(jìn)行爬取??爬蟲(chóng)無(wú)法判斷網(wǎng)站是否爬完,只能盡可能覆蓋。?至于根據(jù)主題爬取,爬蟲(chóng)之后把內(nèi)容爬下來(lái)才知道是什么主題。所以一般都是整個(gè)爬下來(lái),然后再去篩選內(nèi)容。如果嫌爬的太泛,可以通過(guò)限制URL正則等方式,來(lái)縮小一下范圍。?11)哪個(gè)爬蟲(chóng)的設(shè)計(jì)模式和構(gòu)架比較好??設(shè)計(jì)模式純屬扯淡。說(shuō)軟件設(shè)計(jì)模式好的,都是軟件開(kāi)發(fā)完,然后總結(jié)出幾個(gè)設(shè)計(jì)模式。設(shè)計(jì)模式對(duì)軟件開(kāi)發(fā)沒(méi)有指導(dǎo)性作用。用設(shè)計(jì)模式來(lái)設(shè)計(jì)爬蟲(chóng),只會(huì)使得爬蟲(chóng)的設(shè)計(jì)更加臃腫。?至于構(gòu)架,開(kāi)源爬蟲(chóng)目前主要是細(xì)節(jié)的數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì),比如爬取線程池、任務(wù)隊(duì)列,這些大家都能控制好。爬蟲(chóng)的業(yè)務(wù)太簡(jiǎn)單,談不上什么構(gòu)架。?所以對(duì)于JAVA開(kāi)源爬蟲(chóng),我覺(jué)得,隨便找一個(gè)用的順手的就可以。如果業(yè)務(wù)復(fù)雜,拿哪個(gè)爬蟲(chóng)來(lái),都是要經(jīng)過(guò)復(fù)雜的二次開(kāi)發(fā),才可以滿足需求。?3.3非JAVA爬蟲(chóng)?在非JAVA語(yǔ)言編寫的爬蟲(chóng)中,有很多優(yōu)秀的爬蟲(chóng)。這里單獨(dú)提取出來(lái)作為一類,并不是針對(duì)爬蟲(chóng)本身的質(zhì)量進(jìn)行討論,而是針對(duì)larbin、scrapy這類爬蟲(chóng),對(duì)開(kāi)發(fā)成本的影響。?先說(shuō)python爬蟲(chóng),python可以用30行代碼,完成JAVA50行代碼干的任務(wù)。python寫代碼的確快,但是在調(diào)試代碼的階段,python代碼的調(diào)試往往會(huì)耗費(fèi)遠(yuǎn)遠(yuǎn)多于編碼階段省下的時(shí)間。使用python開(kāi)發(fā),要保證程序的正確性和穩(wěn)定性,就需要寫更多的測(cè)試模塊。當(dāng)然如果爬取規(guī)模不大、爬取業(yè)務(wù)不復(fù)雜,使用scrapy這種爬蟲(chóng)也是蠻不錯(cuò)的,可以輕松完成爬取任務(wù)。?上圖是Scrapy的架構(gòu)圖,綠線是數(shù)據(jù)流向,首先從初始URL開(kāi)始,Scheduler會(huì)將其交給Downloader進(jìn)行下載,下載之后會(huì)交給Spider進(jìn)行分析,需要保存的數(shù)據(jù)則會(huì)被送到ItemPipeline,那是對(duì)數(shù)據(jù)進(jìn)行后期處理。另外,在數(shù)據(jù)流動(dòng)的通道里還可以安裝各種中間件,進(jìn)行必要的處理。因此在開(kāi)發(fā)爬蟲(chóng)的時(shí)候,最好也先規(guī)劃好各種模塊。我的做法是單獨(dú)規(guī)劃下載模塊,爬行模塊,調(diào)度模塊,數(shù)據(jù)存儲(chǔ)模塊。?對(duì)于C++爬蟲(chóng)來(lái)說(shuō),學(xué)習(xí)成本會(huì)比較大。而且不能只計(jì)算一個(gè)人的學(xué)習(xí)成本,如果軟件需要團(tuán)隊(duì)開(kāi)發(fā)或者交接,那就是很多人的學(xué)習(xí)成本了。軟件的調(diào)試也不是那么容易。?還有一些ruby、php的爬蟲(chóng),這里不多評(píng)價(jià)。的確有一些非常小型的數(shù)據(jù)采集任務(wù),用ruby或者php很方便。但是選擇這些語(yǔ)言的開(kāi)源爬蟲(chóng),一方面要調(diào)研一下相關(guān)的生態(tài)圈,還有就是,這些開(kāi)源爬蟲(chóng)可能會(huì)出一些你搜不到的BUG(用的人少、資料也少)四、反爬蟲(chóng)技術(shù)?因?yàn)樗阉饕娴牧餍校W(wǎng)絡(luò)爬蟲(chóng)已經(jīng)成了很普及網(wǎng)絡(luò)技術(shù),除了專門做搜索的Google,Yahoo,微軟,百度以外,幾乎每個(gè)大型門戶網(wǎng)站都有自己的搜索引擎,大大小小叫得出來(lái)名字得就幾十種,還有各種不知名的幾千幾萬(wàn)種,對(duì)于一個(gè)內(nèi)容型驅(qū)動(dòng)的網(wǎng)站來(lái)說(shuō),受到網(wǎng)絡(luò)爬蟲(chóng)的光顧是不可避免的。?一些智能的搜索引擎爬蟲(chóng)的爬取頻率比較合理,對(duì)網(wǎng)站資源消耗比較少,但是很多糟糕的網(wǎng)絡(luò)爬蟲(chóng),對(duì)網(wǎng)頁(yè)爬取能力很差,經(jīng)常并發(fā)幾十上百個(gè)請(qǐng)求循環(huán)重復(fù)抓取,這種爬蟲(chóng)對(duì)中小型網(wǎng)站往往是毀滅性打擊,特別是一些缺乏爬蟲(chóng)編寫經(jīng)驗(yàn)的程序員寫出來(lái)的爬蟲(chóng)破壞力極強(qiáng),造成的網(wǎng)站訪問(wèn)壓力會(huì)非常大,會(huì)導(dǎo)致網(wǎng)站訪問(wèn)速度緩慢,甚至無(wú)法訪問(wèn)。?一般網(wǎng)站從三個(gè)方面反爬蟲(chóng):用戶請(qǐng)求的Headers,用戶行為,網(wǎng)站目錄和數(shù)據(jù)加載方式。前兩種比較容易遇到,大多數(shù)網(wǎng)站都從這些角度來(lái)反爬蟲(chóng)。第三種一些應(yīng)用ajax的網(wǎng)站會(huì)采用,這樣增大了爬取的難度。4.1通過(guò)Headers反爬蟲(chóng)?從用戶請(qǐng)求的Headers反爬蟲(chóng)是最常見(jiàn)的反爬蟲(chóng)策略。很多網(wǎng)站都會(huì)對(duì)Headers的User-Agent進(jìn)行檢測(cè),還有一部分網(wǎng)站會(huì)對(duì)Referer進(jìn)行檢測(cè)(一些資源網(wǎng)站的防盜鏈就是檢測(cè)Referer)。如果遇到了這類反爬蟲(chóng)機(jī)制,可以直接在爬蟲(chóng)中添加Headers,將瀏覽器的User-Agent復(fù)制到爬蟲(chóng)的Headers中;或者將Referer值修改為目標(biāo)網(wǎng)站域名[評(píng)論:往往容易被忽略,通過(guò)對(duì)請(qǐng)求的抓包分析,確定referer,在程序中模擬訪問(wèn)請(qǐng)求頭中添加]。對(duì)于檢測(cè)Headers的反爬蟲(chóng),在爬蟲(chóng)中修改或者添加Headers就能很好的繞過(guò)。4.2基于用戶行為反爬蟲(chóng)?還有一部分網(wǎng)站是通過(guò)檢測(cè)用戶行為,例如同一IP短時(shí)間內(nèi)多次訪問(wèn)同一頁(yè)面,或者同一賬戶短時(shí)間內(nèi)多次進(jìn)行相同操作。[這種防爬,需要有足夠多的ip來(lái)應(yīng)對(duì)]?大多數(shù)網(wǎng)站都是前一種情況,對(duì)于這種情況,使用IP代理就可以解決。可以專門寫一個(gè)爬蟲(chóng),爬取網(wǎng)上公開(kāi)的代理ip,檢測(cè)后全部保存起來(lái)。這樣的代理ip爬蟲(chóng)經(jīng)常會(huì)用到,最好自己準(zhǔn)備一個(gè)。有了大量代理ip后可以每請(qǐng)求幾次更換一個(gè)ip,這在requests或者urllib2中很容易做到,這樣就能很容易的繞過(guò)第一種反爬蟲(chóng)。[評(píng)論:動(dòng)態(tài)撥號(hào)也是一種解決方案]?對(duì)于第二種情況,可以在每次請(qǐng)求后隨機(jī)間隔幾秒再進(jìn)行下一次請(qǐng)求。有些有邏輯漏洞的網(wǎng)站,可以通過(guò)請(qǐng)求幾次,退出登錄,重新登錄,繼續(xù)請(qǐng)求來(lái)繞過(guò)同一賬號(hào)短時(shí)間內(nèi)不能多次進(jìn)行相同請(qǐng)求的限制。[評(píng)論:對(duì)于賬戶做防爬限制,一般難以應(yīng)對(duì),隨機(jī)幾秒請(qǐng)求也往往可能被封,如果能有多個(gè)賬戶,切換使用,效果更佳4.3動(dòng)態(tài)頁(yè)面的反爬蟲(chóng)?上述的幾種情況大多都是出現(xiàn)在靜態(tài)頁(yè)面,還有一部分網(wǎng)站,我們需要爬取的數(shù)據(jù)是通過(guò)ajax請(qǐng)求得到,或者通過(guò)Java生成的。首先用Firebug或者HttpFox對(duì)網(wǎng)絡(luò)請(qǐng)求進(jìn)行分析[評(píng)論:感覺(jué)google的、IE的網(wǎng)絡(luò)請(qǐng)求分析使用也挺好]。如果能夠找到ajax請(qǐng)求,也能分析出具體的參數(shù)和響應(yīng)的具體含義,我們就能采用上面的方法,直接利用requests或者urllib2模擬ajax請(qǐng)求,對(duì)響應(yīng)的json進(jìn)行分析得到需要的數(shù)據(jù)。能夠直接模擬ajax請(qǐng)求獲取數(shù)據(jù)固然是極好的,但是有些網(wǎng)站把a(bǔ)jax請(qǐng)求的所有參數(shù)全部加密了。我們根本沒(méi)辦法構(gòu)造自己所需要的數(shù)據(jù)的請(qǐng)求。我這幾天爬的那個(gè)網(wǎng)站就是這樣,除了加密ajax參數(shù),它還把一些基本的功能都封裝了,全部都是在調(diào)用自己的接口,而接口參數(shù)都是加密的。遇到這樣的網(wǎng)站,我們就不能用上面的方法了,我用的是selenium+phantomJS框架,調(diào)用瀏覽器內(nèi)核,并利用phantomJS執(zhí)行js來(lái)模擬人為操作以及觸發(fā)頁(yè)面中的js腳本。從填寫表單到點(diǎn)擊按鈕再到滾動(dòng)頁(yè)面,全部都可以模擬,不考慮具體的請(qǐng)求和響應(yīng)過(guò)程,只是完完整整的把人瀏覽頁(yè)面獲取數(shù)據(jù)的過(guò)程模擬一遍用這套框架幾乎能繞過(guò)大多數(shù)的反爬蟲(chóng),因?yàn)樗皇窃趥窝b成瀏覽器來(lái)獲取數(shù)據(jù)(上述的通過(guò)添加Headers一定程度上就是為了偽裝成瀏覽器),它本身就是瀏覽器,phantomJS就是一個(gè)沒(méi)有界面的瀏覽器,只是操控這個(gè)瀏覽器的不是人。利用selenium+phantomJS能干很多事情,例如識(shí)別點(diǎn)觸式(12306)或者滑動(dòng)式的驗(yàn)證碼,對(duì)頁(yè)面表單進(jìn)行暴力破解等等。它在自動(dòng)化滲透中還會(huì)大展身手,以后還會(huì)提到這個(gè)。

未經(jīng)允許不得轉(zhuǎn)載:啟新網(wǎng)站SEO優(yōu)化 » 搜索引擎蜘蛛爬行原理
分享到: 更多 (0)
加載中~
主站蜘蛛池模板: 粘度计,数显粘度计,指针旋转粘度计| 飞利浦LED体育场灯具-吸顶式油站灯-飞利浦LED罩棚灯-佛山嘉耀照明有限公司 | 上海物流公司,上海货运公司,上海物流专线-优骐物流公司 | 美的商用净水器_美的直饮机_一级代理经销商_Midea租赁价格-厂家反渗透滤芯-直饮水批发品牌售后 | 贝壳粉涂料-内墙腻子-外墙腻子-山东巨野七彩贝壳漆业中心 | 润东方环保空调,冷风机,厂房车间降温设备-20年深圳环保空调生产厂家 | 天津仓储物流-天津电商云仓-天津云仓一件代发-博程云仓官网 | 盘式曝气器-微孔曝气器-管式曝气器-曝气盘-斜管填料 | 郑州市前程水处理有限公司 | 818手游网_提供当下热门APP手游_最新手机游戏下载 | 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 高速龙门架厂家_监控杆_多功能灯杆_信号灯杆_锂电池太阳能路灯-鑫世源照明 | 大流量卧式砂磨机_强力分散机_双行星双动力混合机_同心双轴搅拌机-莱州市龙跃化工机械有限公司 | 北京四合院出租,北京四合院出售,北京平房买卖 - 顺益兴四合院 | 金属切削液-脱水防锈油-电火花机油-抗磨液压油-深圳市雨辰宏业科技发展有限公司 | DAIKIN电磁阀-意大利ATOS电磁阀-上海乾拓贸易有限公司 | IHDW_TOSOKU_NEMICON_EHDW系列电子手轮,HC1系列电子手轮-上海莆林电子设备有限公司 | 诚暄电子公司首页-线路板打样,pcb线路板打样加工制作厂家 | 专业甜品培训学校_广东糖水培训_奶茶培训_特色小吃培训_广州烘趣甜品培训机构 | 汝成内控-行政事业单位内部控制管理服务商 | 大学食堂装修设计_公司餐厅效果图_工厂食堂改造_迈普装饰 | Type-c防水母座|贴片母座|耳机接口|Type-c插座-深圳市步步精科技有限公司 | 氧化锆纤维_1800度高温退火炉_1800度高温烧结炉-南京理工宇龙新材料股份有限公司 | 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 牛皮纸|牛卡纸|进口牛皮纸|食品级牛皮纸|牛皮纸厂家-伽立实业 | Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 酒吧霸屏软件_酒吧霸屏系统,酒吧微上墙,夜场霸屏软件,酒吧点歌软件,酒吧互动游戏,酒吧大屏幕软件系统下载 | 焊接减速机箱体,减速机箱体加工-淄博博山泽坤机械厂 | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | TPU薄膜_TPU薄膜生产厂家_TPU热熔胶膜厂家定制_鑫亘环保科技(深圳)有限公司 | 中药超微粉碎机(中药细胞级微粉碎)-百科 | 纯化水设备-纯水设备-超纯水设备-[大鹏水处理]纯水设备一站式服务商-东莞市大鹏水处理科技有限公司 | 管家婆-管家婆软件-管家婆辉煌-管家婆进销存-管家婆工贸ERP | 引领中高档酒店加盟_含舍·美素酒店品牌官网 | 昆山新莱洁净应用材料股份有限公司-卫生级蝶阀,无菌取样阀,不锈钢隔膜阀,换向阀,离心泵 | 膜片万向弹性联轴器-冲压铸造模具「沧州昌运模具」 | 小型数控车床-数控车床厂家-双头数控车床 | 湖南自考_湖南自学考试网| 油液红外光谱仪-油液监测系统-燃油嗅探仪-上海冉超光电科技有限公司 | 高柔性拖链电缆_卷筒电缆_耐磨耐折聚氨酯电缆-玖泰特种电缆 | 二手电脑回收_二手打印机回收_二手复印机回_硒鼓墨盒回收-广州益美二手电脑回收公司 | 超声波成孔成槽质量检测仪-压浆机-桥梁预应力智能张拉设备-上海硕冠检测设备有限公司 |