一、
網路蜘蛛基本原理網路蜘蛛即Web Spider,是一個很形象的名字。把互連網比喻成一個蜘蛛網,那麼Spider就是在網上爬來爬去的蜘蛛。網路蜘蛛是通過網頁的連結地址來尋找網頁,從網站某一個頁面(通常是首頁)開始,讀取網頁的內容,找到在網頁中的其它連結地址,然後通過這些連結地址尋找下一個網頁,這樣一直迴圈下去,直到把這個網站所有的網頁都抓取完為止。如果把整個互連網當成一個網站,那麼網路蜘蛛就可以用這個原理把互連網上所有的網頁都抓取下來。
對於搜尋引擎來說,要抓取互連網上所有的網頁幾乎是不可能的,從目前公布的資料來看,容量最大的搜尋引擎也不過是抓取了整個網頁數量的百分之四十左右。這其中的原因一方面是抓取技術的瓶頸,薹ū槔械耐常行磯嗤澄薹ù悠淥車牧唇又姓業劍渙硪桓鱸蚴譴媧⒓際鹺痛砑際醯奈侍猓綣湊彰扛鮃趁嫻鈉驕笮∥0K計算(包含圖片),100億網頁的容量是100×2000G位元組,即使能夠儲存,下載也存在問題(按照一台機器每秒下載20K計算,需要340台機器不停的下載一年時間,才能把所有網頁下載完畢)。同時,由於資料量太大,在提供搜尋時也會有效率方面的影響。因此,許多搜尋引擎的網路蜘蛛只是抓取那些重要的網頁,而在抓取的時候評價重要性主要的依據是某個網頁的連結深度。
在抓取網頁的時候,網路蜘蛛一般有兩種策略:廣度優先和深度優先(如所示)。廣度優先是指網路蜘蛛會先抓取起始網頁中連結的所有網頁,然後再選擇其中的一個連結網頁,繼續抓取在此網頁中連結的所有網頁。這是最常用的方式,因為這個方法可以讓網路蜘蛛平行處理,提高其抓取速度。深度優先是指網路蜘蛛會從起始頁開始,一個連結一個連結跟蹤下去,處理完這條線路之後再轉入下一個起始頁,繼續跟蹤連結。這個方法有個優點是網路蜘蛛在設計的時候比較容易。兩種策略的區別,的說明會更加明確。 由於不可能抓取所有的網頁,有些網路蜘蛛對一些不太重要的網站,設定了訪問的層數。例如,在中,A為起始網頁,屬於0層,B、C、D、E、F屬於第1層,G、H屬於第2層,I屬於第3層。如果網路蜘蛛設定的訪問層數為2的話,網頁I是不會被訪問到的。這也讓有些網站上一部分網頁能夠在搜尋引擎上搜尋到,另外一部分不能被搜尋到。對於網站設計者來說,扁平化的網站結構設計有助於搜尋引擎抓取其更多的網頁。網路蜘蛛在訪問網站網頁的時候,經常會遇到加密資料和網頁許可權的問題,有些網頁是需要會員許可權才能訪問。當然,網站的所有者可以通過協議讓網路蜘蛛不去抓取,但對於一些出售報告的網站,他們希望搜尋引擎能搜尋到他們的報告,但又不能完全免費的讓搜尋者查看,這樣就需要給網路蜘蛛提供相應的使用者名稱和密碼。網路蜘蛛可以通過所給的許可權對這些網頁進行網頁抓取,從而提供搜尋。而當搜尋者點擊查看該網頁的時候,同樣需要搜尋者提供相應的許可權驗證。二、網站與網路蜘蛛網路蜘蛛需要抓取網頁,不同於一般的訪問,如果控制不好,則會引起網站伺服器負擔過重。每個網路蜘蛛都有自己的名字,在抓取網頁的時候,都會向網站標明自己的身份。網路蜘蛛在抓取網頁的時候會發送一個請求,這個請求中就有一個欄位為User-agent,用於標識此網路蜘蛛的身份。例如Google網路蜘蛛的標識為GoogleBot,Baidu網路蜘蛛的標識為BaiDuSpider,Yahoo網路蜘蛛的標識為Inktomi Slurp。如果在網站上有訪問日誌記錄,網站管理員就能知道,哪些搜尋引擎的網路蜘蛛過來過,什麼時候過來的,以及讀了多少資料等等。如果網站管理員發現某個蜘蛛有問題,就通過其標識來和其所有者聯絡。網路蜘蛛進入一個網站,一般會訪問一個特殊的文字檔Robots.txt,這個檔案一般放在痙衿韉母柯枷攏竟芾碓笨梢醞ü齬obots.txt來定義哪些目錄網路蜘蛛不能訪問,或者哪些目錄對於某些特定的網路蜘蛛不能訪問。例如有些網站的可執行檔目錄和臨時檔案目錄不希望被搜尋引擎搜尋到,那麼網站管理員就可以把這些目錄定義為拒絕訪問目錄。Robots.txt文法很簡單,例如如果對目錄沒有任何限制,可以用以下兩行來描述:User-agent: *
Disallow:
當然,Robots.txt只是一個協議,如果網路蜘蛛的設計者不遵循這個協議,網站管理員也無法阻止網路蜘蛛對於某些頁面的訪問,但一般的網路蜘蛛都會遵循這些協議,而且網站管理員還可以通過其它方式來拒絕網路蜘蛛對某些網頁的抓取。
網路蜘蛛在下載網頁的時候,會去識別網頁的HTML代碼,在其代碼的部分,會有META標識。通過這些標識,可以告訴網路蜘蛛本網頁是否需要被抓取,還可以告訴網路蜘蛛本網頁中的連結是否需要被繼續跟蹤。例如: 表示本網頁不需要被抓取,但是網頁內的連結需要被跟蹤。
關於Robots.txt的文法和META Tag文法,前面的一篇“禁止搜尋引擎收錄的方法”一文中做了詳細的介紹。
現在一般的網站都希望搜尋引擎能更全面的抓取自己網站的網頁,因為這樣可以讓更多的訪問者能通過搜尋引擎找到此網站。為了讓本網站的網頁更全面被抓取到,網站管理員可以建立一個網站地圖,即Site Map。許多網路蜘蛛會把sitemap.htm檔案作為一個網站網頁爬取的入口,網站管理員可以把網站內部所有網頁的連結放在這個檔案裡面,那麼網路蜘蛛可以很方便的把整個網站抓取下來,避免遺漏某些網頁,也會減小對網站伺服器的負擔。(Google專門為網站管理員提供了XML的Sitemap)三、網路蜘蛛對內容提取
搜尋引擎建立網頁索引,處理的對象是文字檔。對於網路蜘蛛來說,抓取下來網頁包括各種格式,包括html、圖片、doc、pdf、多媒體、動態網頁及其它格式等。這些檔案抓取下來後,需要把這些檔案中的文本資訊提取出來。準確提取這些文檔的資訊,一方面對搜尋引擎的搜尋準確性有重要作用,另一方面對於網路蜘蛛正確跟蹤其它連結有一定影響。對於doc、pdf等文檔,這種由專業廠商提供的軟體產生的文檔,廠商都會提供相應的文本提取介面。網路蜘蛛只需要調用這些外掛程式的介面,就可以輕鬆的提取文檔中的文本資訊和檔案其它相關的資訊。HTML等文檔不一樣,HTML有一套自己的文法,通過不同的命令標識符來表示不同的字型、顏色、位置等版式,如:、、等,提取文本資訊時需要把這些標識符都過濾掉。過濾標識符並非難事,因為這些標識符都有一定的規則,只要按照不同的標識符取得相應的資訊即可。但在識別這些資訊的時候,需要同步鍬夾磯喟媸叫畔ⅲ縹淖值淖痔宕笮 ⑹欠袷潛晏狻⑹欠袷羌喲窒允盡⑹欠袷且趁嫻墓丶實齲廡┬畔⒂兄詡撲愕ゴ試諭持械鬧匾潭取M保雜贖TML網頁來說,除了標題和本文以外,會有許多廣告連結以及公用的頻道連結,這些連結和文本本文一點關係也沒有,在提取網頁內容的時候,也需要過濾這些無用的連結。例如某個網站有“產品介紹”頻道,因為導航條在網站內每個網頁都有,若不過濾導航條連結,在搜尋“產品介紹”的時候,則網站內每個網頁都會搜尋到,無疑會帶來大量垃圾資訊。過濾這些無效連結需要統計大量的網頁結構規律,抽取一些共性,統一過濾;對於一些重要而結果特殊的網站,還需要個別處理。這就需要網路蜘蛛的設計有一定的擴充性。
四、網路蜘蛛的程式構架用ASP構造網路蜘蛛 那麼如何用ASP構建網路蜘蛛呢?答案是:Internet transfer control (ITC)。這個由 微軟提供的控制項,將使你能夠通過ASP程式訪問Internet資源。你可以用ITC搜尋Web頁面,訪問FTP伺服器,甚 至可以發送郵件標題。在本文裡,我們將著重討論搜尋Web頁面的功能。
有幾個缺陷必須先說明一下。第一,ASP無權訪問Windows的註冊表,這就使某些ITC正常儲存的常量和數 值不可用。通常你可以通過設定ITC為“不使用預設值”來解決這個問題,這就需要你在運行過程中指明每一 次的值。
另一個更嚴重的問題是關於許可認證的。由於ASP不具備調用License Manager(一項Windows中的功 能,可以保證組件和控制項的合法使用)的功能,那麼當License Manager檢查當前組件的密鑰密碼,並將 其與Windows註冊表進行比較後,如果發現它們不同,該組件將不會工作。因此,當你想把ITC配置到另一台沒 有所需密鑰的電腦上時,將導致ITC崩潰。解決的辦法之一是將ITC捆綁到另一個VB組件中,由VB組件複製 ITC的路徑和工具,從而進行配置。這項工作很麻煩,但不幸的是,它是必不可少的。
下面是一些例子:
你可以用下面的編碼建立ITC: set Inet1 = CreateObject("InetCtls.Inet")
Inet1.protocol = 4 'HTTP
Inet1.accesstype = 1 'Direct connection to internet
Inet1.requesttimeout = 60'in seconds
Inet1.URL = strURL
strHTML = Inet1.OpenURL'grab HTML page
現在strHTML儲存著strURL指向的整個頁面的HTML內容。要建立一個常規網路蜘蛛,你現在只需要調用 instr() 功能來看看你尋找的串是否在當前位置即可。你也可以按照href標記尋找,解析當前的 URL,然後把它設定到Internet 控制項的屬性中去,接著再繼續開啟另一個頁面。用來查看所有連結的最 好方法是使用遞迴。
要注意的是,儘管這種方法很易於實行,卻不是非常準確和強大。今天的許多搜尋引擎都可以進行額外的 邏輯檢查,例如計算一個頁面中某一短語重複的次數,相關字詞的近似程度等,有些甚至可以用來判斷所搜尋 的語段與內容相關的關係。
用VB構造網路蜘蛛蜘蛛程式網站層次及其工作原理描述:
序號網站層次父序號
1http://www.netfox.cn/ 10
2http://www.sina.com.cn/21
3http://www.cnnic.cn/21
4http://www.baidu.cn/32
5http://www.yahoo.cn/32 蜘蛛程式首先從層次1(http://www.netfox.cn/)開始提取所有的網站連結,把所有網站連結記錄到資料庫(或者大數組等),並把這些網站連結標識為層次2; 當把層次2全部記錄到資料庫後即硬憒中順序為第一的(這裡指序號為2的網站)網站連結開始提取其下面的的所有連結記錄到資料庫,並把這些網站連結標識為層次3;然後依次把層次為2的網站的所有連結記錄到資料庫,同時把他們的層次標識為層次3; 當層次3全部記錄資料庫後,開始從層次3中順序為第一的網站連結開始提取,依次類推即可! 注意:程式要保留一個指標記錄當前正在操作的序號!另外您也可以增加一個父序號欄位來記錄他們之間的繼承關係!層次1表示為網路種子;我們這裡把網路種子放在第一層,根據需要您可以設定一個或者多個網路種子,實際上我們通過這個層次圖可以很顯然地看出來,低層次的網址就是高層次的網路種子。也就是說只要有一個或者幾個網路種子,我們就可以通過他們的連結找到更多的網路種子。只要這樣我們的蜘蛛才能永遠地運行下去! 層次2是通過層次1(即網路種子)抓取到的連結; 層次3是通過層次2抓取到的連結; 依次類推,構成一棵大樹! 蜘蛛程式關鍵代碼:這裡使用VB實現核心部分的代碼,當然您也可以很簡單地轉換成其他語言代碼。在這裡了為了簡單起見,我們這裡不對資料庫操作,我們建立一個二維數組存放我們的網址!Dim Web(4,10000)‘//建立數組 Dim Pointer‘//建立指標,記錄當前種子 Dim Id ‘//建立序號,記錄當前抓區網站的序號 Dim Layer‘//建立層次,記錄當前正在運行種子的層次 Dim Running‘//建立是否啟動並執行標誌, Private Function NewworkSeed_Set() As Boolean ‘//用來設定網路種子,為示範方便我們把種子放在數組, '//當然您也可以根據需要把他們直接放到資料庫中 Web(0,0) = 1 ‘//序號 Web(1,0) = “http://www.netfox.cn/” ‘//網站 Web(2,0) = 1 ‘//層次 Web(3,0) = 0 ‘//父序號,0表示為網路原始種子 Web(4,0) = “奈福網路” ‘//當然這裡可以設定多個網路原始種子 Web(0,1) = 1 Web(1,1) = “http://www.aspfaq.cn/” Web(2,1) = 1 Web(3,1) = 0 Web(4,1) = “asp技術站” ‘//設定網路種子後,記錄種子序號開始後的序號,這裡設定了2個種子,所以Id=2開始 Id = 2 End Function Private Sub Spider_Work()‘//蜘蛛工作程式,抓取網站並記錄到數組
‘//根據需要可以把他們放到資料庫中 Dim A For Each A In WebBrowser.Document.All If UCase(A.tagName) = "A" Then If IsValidWeb(A.href) Then Id = Id + 1 Web(0, Id) = Id‘//記錄當前網站的序號 Web(1, Id) = A.href ‘//記錄當前網站 Web(2, Id) = Layer ‘//記錄當前網站的層次 If Web(2,Pointer)<> Layer Then Layer = Layer + 1‘//當指標層次與當前層次不同的話 ‘//則說明層次已經發生了增加 Web(3, Id) = Pointer ‘//記錄當前網站的父序號 Web(4,Id) = A.innerText‘//記錄當前網站的名稱 End If End If Next Pointer = Pointer + 1 WebBrowser.Navigate Web(1, Pointer-1) ‘//抓取當前種子完畢後,自動跳轉到下一個種子 If Running = False Then‘//運行為否,退出運行 Exit Sub End If End Sub Private Function Spider_Init() As Boolean‘//蜘蛛程式初始化函數 Pointer = 1 ‘//指標設定為1,表示從第一個序號開始運行 Id = 2‘//序號設定為2,以後可以讀取記錄 Layer = 0‘//層次設定為0,表示蜘蛛第一次運行 ‘//以上指標,序號,層次都可以記錄並且方便以後讀取 If IsValidWeb(Web(1, Pointer-1)) Then‘//判斷種子是否正確,如果正確初始化成功,否則失敗 Running = True Spider_Init = True WebBrowser.Navigate Web(1, Pointer-1) Else Running = False Spider_Init = False Exit Function End If End Function Private Sub WebBrowser_DocumentComplete(ByVal pDisp As Object, URL As Variant) ‘//WebBrowser控制項 Call Spider_Work() End Sub Private Function IsValidWeb(_href) As Boolean ‘//判斷是否是cn網域名稱函數 ‘//通過該函數可以實現抓取指定網站或資料 If InStr(_href, "http://www/.") > 0 And InStr(_href, ".cn/") > 0 And Len(_href) < 60 Then IsValidWeb = True Else IsValidWeb = False End If End Function Private Sub InitCommand_Click()‘//Init初始化 命令控制項 If Spider_Init() Then Msgbox “蜘蛛初始化成功並開始運行了” Else Msgbox “蜘蛛初始化失敗” End If End Private Private Sub StopCommand_Click()‘//Stop停止 命令控制項 Running = False ‘//停止運行 End Private Private Sub RunCommand_Click() ‘//Run運行 命令控制項 Running = True‘//繼續運行 Call Spider_Work()‘//蜘蛛運行主程式 End Private 特定網路蜘蛛 相對的,一個特定網路蜘蛛要複雜一些。如我們早先提到的,一個特定網路蜘蛛會搜尋一個頁面的特定部 分,因而要求預Crowdsourced Security Testing道該部分相關的情況。讓我們先看看下面的HTML:
<HTML><HEAD><TITLE>My News Page</TITLE><META Name="keywords" Content="News, headlines"><META Name="descr iption" Content="The current news headlines."></HEAD> <BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#FF3300 "VLINK="#CC0000" ALINK="#0000FF"><p><h3>Headlines&l t;/h3></p><!--put headlines here--><a href="/news/8094.asp _fcksavedurl=""/news/8094.asp" ">Stocks prices fall</a><a href="/news/8095.asp">New movies today</a><ahref="/news/8096.asp">Bush and&nb sp;Gore to debate tonight</a><a href="/news/8097.asp"> Fall TV lineup</a><!--end headlines--></BODY></HTML>
在這個頁面內,我們只關心位於“put headlines here”和 “end headlines”這 兩個標記之間的東西。你可以構建一個只返回該地區尋找結果的功能設定:Function GetText(strText, strStartTag, strEndTag)
dim intStart
intStart = instr(1, strText, strStartTag, vbtextcompare)
if intStart then
intStart = intStart + len(strStartTag)
intEnd = InStr(intStart + 1, strText, strEndTag, vbtextcompar e)
GetText = Mid(strText, intStart + 1, intEnd - intStart&n bsp;- 1)
else
GetText = " "
end if
End Function
按照上面構建ITC控制項的例子,你可以很容易地將strHTML中的“ <!--put headlines here-->”和 “<!--end headlines-->”作為參數傳 送到GetText中。
要注意,用於開始和結束的標記都不一定要是實際的HTML專用標記——它們可以是你想使用的任何文本界 定符。在通常情況下,你不容易找到好的HTML標記來界定搜尋地區。你只能使用比較方便稱手的標記——例如 ,你的首尾標記可以分別如下:strStartTag = "/td><td><font face="arial" size=&q uot;2"><p><b><u>"
strEndTag = "<p></td></tr><tr><td><ums>&quo t;
一定要確定搜尋的是HTML頁中比較獨特的標識,這樣你才可以準確地獲得你需要的東西。你也可以按照你 所返回的文本部分中的連結進行搜尋,不過如果你不知道那些頁面的格式,你的網路蜘蛛將無功而返。作者:奇點、Winter作者: 楓林
原載: 搜尋引擎最佳化SEO部落格
著作權。轉載時必須以連結形式註明作者和原始出處及本聲明。
本文連結地址: http://blog.5ixb.com/seo/search-engine-spider.html