編者按:經常去雅虎、搜狐等網站搜索信息的讀者一定有這樣的疑問:如此龐大的網頁信息,到底是如何被這 些網站所收集到的呢?難道都是人工登記並整理的嗎?當然不是。這些搜索引擎能夠快速地找到如此之多的信 息,和網絡蜘蛛的應用是分不開的。
網絡蜘蛛可以算得上是為Internet而開發的最有用處的工具之一。時至今日,要想從以千萬計的各不相同 的站點中獲取信息,捨網絡蜘蛛之外,焉有他哉?
一個典型的網絡蜘蛛(例如雅虎)工作的方式,是查看一個頁面,並從中找到相關信息, 然後它再 從該頁面的所有鏈接中出發,繼續尋找相關的信息。以此類推,直至窮盡。很快地,就可以在數據庫中獲得成 千上萬的頁面和信息。這樣的工作方式就如同一張向外發散的蜘蛛網,這正是“網絡蜘蛛”這個名稱的由來。
接下來讓我們看看如何建立一個網絡蜘蛛。在此之前,我們先要了解幾個概念。
一、基本原理
我們可以用網絡蜘蛛搜尋很多東西。事實上,現在有一些特別用途的商用網絡蜘蛛,這些軟件為它們的開 發者賺取了大把的鈔票,比如Altavista科技的一份許可證,就價值30萬美元。以下是一個網絡蜘蛛的基礎原 理:
* 從各個消息來源收集信息
從技術角度講,一個網絡蜘蛛應該可以不受限制地從任意來源獲取信息。來源多多益善。
* 准確度
不管是誰,遇見這樣的事情肯定都會崩潰——搜索引擎向你返回了一百萬個結果,可是,只有最後兩個是 你需要的(這還算好的,如果是中間的兩個呢?)。所以好的網絡蜘蛛對其返回的結果應該有足夠的准確度, 而且在有些情況下,還要有特定的功能,也就是說,只返回特定類型的信息——比如www.enfused.com的專為 搜索游戲設計的網絡蜘蛛,就只返回與游戲相關的東西。
* 相對更新
這依賴於你所使用的技術(下面我們會專門提到),網絡蜘蛛應該找回更新後的信息,或者至少是比較新 的信息。如果網絡蜘蛛總是找回一些幾年前的陳芝麻爛谷子,那你一定會比系統先一步崩潰。
* 相對快速
這就不用多說了,如果沒有足夠的速度,那你的網絡蜘蛛再怎麼准確,也是白搭。
二、基本技術
有好幾種方法可以構建網絡蜘蛛。第一種,稱之為常規網絡蜘蛛,只是簡單地進行頁面尋找,搜索並獲得 你想要的東西。例如,用一個短語作為關鍵詞進行搜索。第二種,特殊網絡蜘蛛,只尋找頁面的特定部分。這 種網絡蜘蛛在某些特定場合很有用(比如,你只想獲得某一個站點內的新聞標題)。
常規網絡蜘蛛是兩者中相對簡單的一種。首先,你不需要預先知道目標頁面的情況。只需要在該頁面中, 以及在與其鏈接的頁面中,尋找你要的關鍵詞就可以了。你還可以在功能中設定,忽略掉那些在同一站點下的 鏈接,從而保證每一個結果都來源於不同的站點。
與之相對應,一個特定的網絡蜘蛛通常要求你預先知道一些目標頁面的情況,例如表格規劃等。舉個例子 ,如果你搜尋的是一個頁面中的新聞標題,你應該先知道限定此標題的HTML標記。如此你才可以直接搜索頁面 中正確的部分。在這種情況下,是否具備搜索該頁面的所有鏈接的功能顯得不是特別重要,因為你的網絡蜘蛛 很可能在別的頁面中無法找到標記,不能進行工作。
運行網絡蜘蛛的時間也有所不同:你可以預先運行,也可以實時運行。預先運行意味著當你的網絡蜘蛛運 行時,所有搜集到的信息都存貯在一個數據庫中,以備以後使用。很明顯,如此你將不會獲得最新的數據,但 是如果你經常運行網絡蜘蛛,這個問題也不會有什麼大礙。
實時運行意味著你每次運行網絡蜘蛛所獲得的信息都不會被保存下來,你只能現找現用。例如,如果你在 站點設置了搜索功能,在實時狀態下使用網絡蜘蛛,則無論何時,只要有用戶輸入一個關鍵詞並點下“發送” 按鈕,你的網絡蜘蛛就將運行,而不是僅僅訪問數據庫。盡管這可以保證你的數據總是最新的,但是卻不是大 多數站點的首選,因為網絡蜘蛛本身運行和返回數據都需要時間——而時間就是金錢呀!當然,所查找的資料 具有高度時間敏感性的時候例外。
三、構建網絡蜘蛛
那麼如何用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
trHTML = Inet1.OpenURL 'grab HTML page
現在strHTML保存著strURL指向的整個頁面的HTML內容。要建立一個常規網絡蜘蛛,你現在只需要調用 instr() 功能來看看你尋找的串是否在當前位置即可。你也可以按照href標記尋找,解析當前的 URL,然後把它設置到Internet 控件的屬性中去,接著再繼續打開另一個頁面。用來查看所有鏈接的最 好方法是使用遞歸。
要注意的是,盡管這種方法很易於實行,卻不是非常准確和強大。今天的許多搜索引擎都可以進行額外的 邏輯檢查,例如計算一個頁面中某一短語重復的次數,相關字詞的近似程度等,有些甚至可以用來判斷所搜尋 的語段與上下文的關系。這些功能將留待我們的讀者們自己去摸索。
四、特定網絡蜘蛛
相對的,一個特定網絡蜘蛛要復雜一些。如我們早先提到的,一個特定網絡蜘蛛會搜尋一個頁面的特定部 分,因而要求預先知道該部分相關的情況。讓我們先看看下面的HTML:
<HTML><HEAD><TITLE>My News Page</TITLE><META Name=&quo t;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 ">Stocks prices fall</a><a href="/news/8095.asp">Ne w movies today</a><a href="/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><o:ums>&quo t;
一定要確定搜索的是HTML頁中比較獨特的標識,這樣你才可以准確地獲得你需要的東西。你也可以按照你 所返回的文本部分中的鏈接進行搜尋,不過如果你不知道那些頁面的格式,你的網絡蜘蛛將無功而返。
五、保存信息
在大多數情況下,你會要求將收集到的信息保存在一個數據庫中,以備以後使用。你的需求也許包括很廣 泛的內容,但是在此之前,你要記住以下幾件事:
在你的數據庫中查找最新信息
如果你經常使用網絡蜘蛛去查找一個站點內的新聞標題,你要先確定比較新的標題已經存在於數據庫內。 然後將其與網絡蜘蛛返回的結果相比較,只添加更新過的部分。這樣可以防止你保存一大堆重復數據。
更新信息
也許你根本就不想從外部向數據庫中添加新信息。比如,如果你維護的是一個美國各州人口的網上索引, 你只需要在數據庫內部更新——你將不需要在表格內插入新的信息。
保存所需信息
如果你在查找標題,要確定你也同時查找了該標題指向的鏈接,並將其保存下來。如果沒有鏈接,你 也應該建立一個。例如,如果我從www.yoursite.com查找標題,並在www.mysite .com演示,而該標題與一篇在站點之外的文章有鏈接,那麼我必須先保存http://www.you rsite.com這一鏈接,然後再保存其它鏈接到數據庫內,這些鏈接才可以正常訪問。
六、結論
我們已經簡要介紹了如何構建一個比較完整的網絡蜘蛛。所有的基本功能都已涉及。現在你需要做的就是 再在裡面加上你自己的東西。
這一類功能將被應用在一個COM對象或者一個獨立的應用軟件內。在ASP中設置這項功能非常方便, 但是你應該將你的編碼移到另外的地方,以提高速度和安全性。而且這樣也可以令其更容易被打包和傳送。