摘要:搜索引擎技術隨著互聯網的日益壯大而飛速發展。它成功的商業運作也造就了Google、百度等這樣的商業奇跡。作為搜索引擎的重要組成部分,網絡爬蟲的爬行效率對搜索引擎至關重要。基于Websphinx對網絡爬蟲進行了相關介紹,概述了Websphinx的結構框架、搜索方式及提出了一些看法。
關鍵詞:搜索引擎;Websphinx網絡爬蟲;超時;智能化
中圖法分類號:TP393文獻標識碼:A 文章編號:1009-3044(2008)28-0075-03
Research And Improvement of Network Reptile Based on Websphinx
ZHOU Xiang
(Tongji University Software College, Shanghai 200000, China)
Abstract: With the development of internet technical, Search engine is becoming more and more powerful. There are also some fantastic success cases like google and baidu. Network Reptile, as an important part of search engine, play an irreplaceable role in it, especially the performance. here we discuss about Network Reptile based on an exist open source——\"Websphinx\", explain the structure and search style of Websphinx, and show out some new opinion.
Key words: search engine;websphinx network reptilesInterface; overtime;intelligent
1 引言
現如今,隨著搜索引擎的普及,網絡爬蟲程序也越來越受到人們的重視,它的效率直接關系到搜索引擎的速度。作為搜索引擎三環節中的第一個環節,它的效率直接決定了搜索引擎的搜索廣度,面對浩瀚一望無邊的網絡海洋,如果有一個具有高性能爬蟲程序,可能就會達到能夠遍歷所有internet網頁內容的理想狀態,同樣會解決每天與日俱增的無數的網頁和舊網頁的更新。
本文主要結合Websphinx 這個網絡爬蟲源程序來探討一下關于爬蟲程序的現狀,該開源項目存在的一些問題以及一些可以改進的優化方案。
2 websphinx 基本原理
從一個基點網站出發,遍歷其中的所有有用信息,同時抽去其中的鏈接信息放入隊列,以待有空閑蠕蟲(worm)時,從隊列中讀取,發出request請求,繼續進行信息抽取和鏈接入隊列的工作。
3源代碼分析
入口為 websphinx.workbench.workbench
主界面如圖2。
輸入starting URLs后,爬蟲將以該網址為基點進行搜索
點擊start后代碼如下:
private transient PriorityQueue fetchQueue;//等待下載的鏈接隊列
private transient PriorityQueue crawlQueue;//已被爬出的但還未被處理鏈接隊列
fetchQueue接收到網絡應答和內容后則將鏈接加入crawlQueue隊列
configureCrawler ();//讀取界面輸入框中參數信息,準備以后搜索
……
Thread thread = new Thread (crawler, crawler.getName ());
thread.setDaemon (true);
thread.start ();//啟動線程搜索
crawler 是一個 Crawler類對象,實現Runnable接口
public void run () {
……
synchronized (crawlQueue) {
Timer timer = new CrawlTimer (this);
int timeout = dp.getCrawlTimeout();//dp:下載參數
if (timeout > 0)
timer.set (timeout*1000, 1);
int nWorms = Math.max (dp.getMaxThreads (), 1);//拿到最大可用線程
worms = new Worm[nWorms];//爬蟲對象
for (int i=0; i worms[i] = new Worm (this, i); worms[i].start ();//開啟網頁訪問進程,每個網址對應一個爬蟲 } …… Label 1 : synchronized (fetchQueue) { for (int i=0; i if (worms[i].link != 1) fetchQueue.put (worms[i].link); } 將爬蟲對象爬到的網頁對象,只要有,即裝入抓取隊列繼續等待抓取 其中: class Worm extends Thread { …… public void run () { crawler.fetch (this);//關鍵點, } …… } 其中fetch()用于抓取網址對象 在fetch() 關鍵為 :process(w.link) Process方法: // 網頁分類 for (int j=0, len=classifiers.size(); j Classifier cl = (Classifier) classifiers.elementAt(j); cl.classify (page); } ++numPagesVisited; if (pagePredicate == 1 || pagePredicate.shouldActOn (page)) { if (action != 1) action.visit (page); visit (page); } expand (page); //開始遍歷該page中的所有鏈接 expand方法: Link[] links = page.getLinks(); if (links != 1 links.length > 0) { for (int i=0;i Link l = links[i]; l.setDownloadParameters (dp);//設置下載參數 if (ignoreVisitedLinks visited (l))//已訪問過(可能訪問重復網頁) sendLinkEvent (l, LinkEvent.ALREADY_VISITED); else if (。。。)//需要跳過 sendLinkEvent (l, LinkEvent.SKIPPED); else if (page.getDepth() >= maxDepth)//超過最大深度 sendLinkEvent (l, LinkEvent.TOO_DEEP); else submit (l);//訪問網頁(加入隊列等待訪問) } } submit方法: markVisited (link); //將此link標記為訪問過的 synchronized (crawlQueue) { synchronized (fetchQueue) { crawlQueue.put (link); ++numPagesLeft;//剩余未處理的page個數加1 fetchQueue.put (link);//加入等待下載的鏈接隊列 fetchQueue.notifyAll ();//喚醒爬蟲程序開始捕捉 } } 于是此處將crawlQueue和fetchQueue更新,將來會根據里面的內容進行網頁遍歷 以上是其主要處理流程和核心代碼. 流程如圖3。 4 問題的提出 4.1 關于超時(timeout) 訪問網頁會設定了一個超時限制(timeout),這也是大多數爬蟲程序都有的限制。超時還沒返回網頁信息則放棄。對于此Websphinx fetchTimedOut方法 synchronized (crawlQueue) { crawlQueue.delete (w.link); --numPagesLeft; worms[w.i] = new Worm (this, w.i); worms[w.i].start (); crawlQueue.notify (); } timeout方法: synchronized (crawlQueue) { synchronized (fetchQueue) { state = CrawlEvent.TIMED_OUT; fetchQueue.clear (); crawlQueue.clear (); numPagesLeft = 0; crawlQueue.notify (); } } 這里存在一個很大的問題,我們知道,如果以國內為基點搜索,國內和國外的網站差別是很大的,而且現在的網絡并不是很穩定,對于同一個網站發請求,有時很快就能返回信息,有時過很長時間才行,有時甚至出現無法訪問的錯誤,在這樣的環境下,對于爬蟲程序,很容易就會返回不正確的結果,比如應該可以訪問的,由于網絡在某個時刻阻塞而返回超時或無法訪問;兩次以同一個網站為基站返回的搜索結果截然不同等等。 如果我們能給這種超時限制多一點空間,不要限制的太死是否會好一點? 基于這種想法,我們可以將超時限制分為不同的層次,如果在最開始的超時限制(最嚴格)下超時,我們可以再將超時限制放寬,再超時再放寬,直到達到上限,這樣就可以最大限度的避免網絡的不穩定和網站地域的區別而造成的誤差 具體做法如下:(限制從嚴到寬為限制1,限制2。。。) 在達到限制1時,不要馬上將對象(網址)剔出隊列,而是新建隊列:fetchQueue2,并將此對象加入此隊列;同樣,其他線程也有同樣情況對象出現也加入fetchQueue2。同時此時將此隊列的超時(timeout)限制放寬一層到限制2,優先級降低。一旦有返回結果時,則進行信息截取,然后重新將遍歷出的對象(網址)加入原隊列(fetchQueue);如果仍沒返回結果,新建隊列fetchQueue3,并再次放寬限制,降低優先級;一旦有返回結果時,再回到fetchQueue。。。 當然,一旦成功就回到原始隊列fetchQueue,這樣如果是國外的網站效率就會很低,因為它很可能每次都要走fetchQueue2,fetchQueue3甚至更高,所以可根據網址特征,過去搜索結果對網址進行評估,是國外網站則可以專門設計一隊列(fetchabroadQueue),它的初始限制比fetchQueue高,其他可仿照fetchQueue設計,同樣有fetchabroadQueue2,fetchabroadQueue3等等。 對于國內某些本來就很慢的網站(服務器網速慢等情況),可以在搜索時做一些智能化處理,比如,某一網站網址出現: fetchQueue→fetchQueue2→fetchQueue3→fetchQueue→fetchQueue2→fetchQueue3…… 這種情況達到一定次數,就認定為慢網站,可將該網站的流程改為: fetchQueue→fetchQueue2→fetchQueue3→fetchQueue2→fetchQueue3…… 4.2 關于算法 Websphinx對于每張網頁調用visit(page)然后expand(page),其中expand(page)用于遍歷所有該page中的鏈接。可以看出,它使用的是廣度遍歷的方法。 但不是所有的網站都適用于廣度遍歷。廣度遍歷適用于深度較少而每層內容較多的情況,而深度遍歷適用于深度高而每層內容較少的情況。對于那種像sina,sohu等等的信息集中網站鏈接比較多的網站適用于廣度優先,但是對于某些做專業技術的網站,比如化工,原料,生命科學專業信息網站,他們往往分類很細,要看到具體信息,需要往下找到具體分類,才能看到具體信息,此時深度已經很高了,如果將其看作一顆樹,則信息幾乎全在低層。如果還用廣度優先算法,則在開始會找到很多重復的沒有多大價值的信息,并且如果深度限制太死,則可能根本找不到底層而導致找到的有價值信息幾乎為0,也失去了爬蟲的意義。 但是我認為最值得我們關注的是爬蟲程序的智能化。正如我們所見到Websphinx的搜索程序是不變的,每次搜索都是用同樣的方法。但對于internet這個龐大的網絡而言,每次都用同樣的方法勢必會導致重復工作效率不高,如果搜索方式(廣度或深度)用錯,勢必每次都用錯,如果加入人工智能的因素會對程序的性能有很大的幫助。 對網站的分類(國內或國外,信息集中或專業化),每搜索一次根據前述方法區分一次,記錄結果;然后取出最近10次的搜索結果記錄取平均值,最近5次的搜索結果記錄取平均值;分別作比較,如果分類一致則不變,如果有變化,證明可能網站類型有變化,可再取最近4次,3次,2次的搜索結果記錄取平均值作分析重定位網站類型,記錄結果。 在掃描網頁內容時,可將每一次的信息與上一次比較,對于每次變化很小或長時間沒什么變化的網頁可以記為“懶惰”網頁,同樣對網站也是如此。從而可以降低其搜索周期,比如從原來的一周一次降為兩周一次,變化快的也可以縮短周期,但到上限為止。 5 結論 網絡爬蟲作為搜索引擎的基本組成部分,它的爬行速度和爬行量直接影響著搜索效率與質量。本文從具體網絡爬蟲程序Websphinx的代碼實現出發,結合一般網絡爬蟲的相關概念和構成,介紹了網絡爬蟲的相關概念,并闡述了網絡爬蟲的組成結構,對Websphinx的現狀提出一些問題和相應解決方案和優化方案。 參考文獻: [1] 徐寶文,張衛豐.搜索引擎與信息獲取技術[M].北京:清華大學出版社.2003. [2] Java開源項目Websphinx,可擴展的Web爬蟲項目[EB/OL].http://crawler.archive.org/. [3] 張敏,高劍峰,馬少平.基于鏈接描述文本及其上下文的Web信息檢索[J].計算機研究與發展,2004,41(1):221-226. [4] Jeff Heaton.Programming Spiders,Bots,and Aggrega-tors in Java.[M].Sybex,2002 [5] 李曉明,閆宏飛,王繼民.搜索引擎:原理,技術與系統[M].北京:科學出版社,2005. [6] [Abiteboul 97] Serge Abiteboul and Victor Vianu, Queries and Computation on the Web. Proceedings of the International Conference on Database Theory. Delphi, Greece 1997. [7] [Bagdikian 97] Ben H.Bagdikian. The Media Monopoly.5th Edition. Publisher: Beacon,ISBN: 0807061557. [8] [Gravano 94] Luis Gravano, Hector Garcia-Molina, and A. Tomasic. The Effectiveness of GlOSS for the Text-Database Discovery Problem. Proc. of the 1994 ACM SIGMOD International Conference On Management Of Data,1994 [9] [Marchiori 97] Massimo Marchiori. The Quest for Correct Information on the Web: Hyper Search Engines.The Sixth International WWW Conference (WWW 97).Santa Clara,USA, April 7-11,1997.