大家都知道,獲得信息是我們上網的很大一個目的,而獲得信息對於大多數人來說要通過網上的搜索引擎來搜索自己所需要的信息,而搜索軟件通過向搜索站點發出特殊搜索字串命令(各個站點的格式不一樣),然後用軟件對結果進行處理後顯示出來。原理簡單,可是效果卻是顯著的,能夠迅速而方便的搜索到各個站點的信息。下面我就通過介紹使用vb制作自己的搜索軟件和剖析現在流行的搜索軟件程序來介紹這些內容:
我們都知道vb是最簡單方便的編程語言,利用vb編寫一個小小的搜索軟件用不了多少行語句。第一步當然要安裝一個vb5.0或者6.0的運行環境。啟動vb以後,首先創建了一個窗體,然後要對運行環境進行一下設置:具體來說呢,就是添加上必要的控件,一般來說,如果您安裝了IE4.0以上的浏覽器,windows的system目錄中就會有SHDOCVW.DLL的文件,我們通過點擊菜單中“工程”-“部件”,在彈出的對話框中找到有一欄寫著”microsoftinternetcontrols”的選項,這個選項其實就是上面提到的SHDOCVW.DLL文件的描述。利用這個文件我們可以初始化一個浏覽器的實例。當您選中這個選項後,會發現工具欄中多了一個形狀如同地球的按鈕,這就是剛才選中的浏覽器控件,我們雙擊這個圖標按鈕在窗體上生成一個webbrowser1的部件,接下來我們就使用這個部件來顯示查詢的結果。
接下來我們在窗體上放上一個文本框和一個按鈕,其實就這幾個部件已經可以算是一個最小的搜索程序基本結構了。我們現在來所一說網絡搜索的原理:上面已經提到是通過向搜索站點發出特殊搜索字串命令(各個站點的格式不一樣),然後用軟件對結果進行處理後顯示出來,但如何發出搜索字符串、發出怎樣的字符串還需要有一定的HTML知識。我們知道對於網上信息的的發送是通過表單的形式來發送的,也就是說當我們在網上點擊某些表單時,通過表單中包含的默認地址中的表單處理程序來接受所有包含在表單中的信息,而這些信息有的是顯示的,而另外一些卻是隱藏的。您可以試著將一個包含有表單的網頁用Frontpage或者Dreamwaver打開,這時你就會發現有很多用浏覽器看不到的東西,這些隱藏的標志同樣在您發送表單時起著重要的作用。沒有這些標志,發出的字符串很可能得不到服務器的應答。我們知道了這些,再返回頭來看我們程序所需發出的字符串,舉個例子來說:最常用的雅虎中文的搜索代碼是”http://cn.search.yahoo.com/search/gb?p=***”,其中***代表的是所要搜索的字符串,而剩余的部分是處理字符串的服務器程序的地址,另外一個我們很常用的搜索引擎Yeah,它的搜索代碼相對復雜了一些是”http://www2.yeah.net/cgi-bin/query2.exe?query=***&start=0&REXP=AND”,但基本的東西沒有變,它們都是使用了這樣一種形式:http://目標URL?參數1名=參數1值&參數2名=參數2值&參數3名=參數3值…
對於http協議,其中包括重要的幾種傳送數據的方法,其中比較常用的有GET和POST方法,對於使用GET方法進行傳送數據的網站來說,使用上面的形式百發百中,都能夠通過一條查詢語句返回所需要查詢的內容網頁,但對於使用POST方法的網站,有可能返回不了查詢結果網頁,不過從我的經驗看,一般來說是能夠成功的。
知道了如何向服務器發送查詢語句,下面我們就從程序的角度來寫:假若窗體上有一個文本框Text1、一個標簽Label1、一個浏覽器Webbrowser1、一個按鈕Command11,其中文本框用於輸入關鍵詞,浏覽器用於顯示查詢結果網頁,按鈕用於發出請求語句,那麼點擊Command1的程序語句可以這樣寫:
PrivateSubCommand1_Click()
DimurlAsString
OnErrorResumeNext'出錯後繼續
IfText1.Text=""ThenMsgBox"請先輸入關鍵字":ExitSub'防止不輸入關鍵詞
url="http://search.chinese.yahoo.com/search/gb?p=" Text1.Text'將關鍵詞放入查詢語句中
Webbrowser1.Navigateurl'調用浏覽器顯示查詢結果
EndSub
雅虎的查詢語句比較簡單,而對於比較復雜網站的查詢語句一定要注意的是各個關鍵參數之間一定要用“&”來隔開。雖然你只是學會了這一招,但已經足夠利用網上的資源來編寫你的第一個程序了,因為網上所有類型的表單都能表示了,無論是查詢股票、軟件、書籍、圖片,都不外乎這種模式。只要你將查詢網頁調入Frontpage、Dreamwaver等所見即所得的網頁編輯軟件中,便會毫無遮攔的展現在你的面前,利用這些鏈接,再加上一個好的界面,當然可以制作自己的搜索工具軟件了,不過要注意的是,有些表單的傳送路徑的是相對路徑,這時要加上網站的地址鏈接。
可能有人要說,這麼簡單,誰不知道,不是為了賺稿費吧?錯。剛才的方法比起直接訪問搜索站點的確能節省不少上網的時間,但並沒有將程序的優勢全部發揮出來,我們現在繼續講另外一種檢索網頁的方法:首先介紹一個控件MicrosoftInternetTransfer(這個控件在安裝vb或者某些程序的時候會自動安裝),這個控件允許建立與其他計算機的鏈接,並傳送文件。它使兩個Internet規則HTTP和FTP的使用變得容易。當正常訪問一個網頁時,InternentTransfer用GET命令訪問網絡浏覽器的一個文件。例如,如果打開了URLhttp://www.cpcw.com/index.htm,浏覽器將建立與地址在www.cpcw.com的機器的鏈接,並傳送命令GET/index.htm。HTML將通過鏈接以普通文本的方式返回,因為返回的內容只是所要的網頁的源文件,節省了很多用於傳送顯示網頁中圖像的時間,速度要快了許多,但最重要的是我們可以很方便地使用自己的邏輯對凡會的源文件進行正確地分析和格式化,重新整理網頁的查詢結果。
我們還用剛才的窗體,只是要在菜單中選擇“工程“-”部件“,在彈出的對話框中找到一項是:MicrosoftInternetTransferControl,選中後,在工具欄中您就會發現增添了一個顯示有地球和計算機的小按鈕,雙擊這個按鈕會在窗體上加入一個InternetTransfer實例Inet1,完成了這些步驟後,窗體應如圖一所示。現在准備在實例工程中加入代碼。
InternetTransfer控件有一個事件StateChanged。這個事件的目的是當不同的操作發生時通知用戶程序。例如:控件在與網絡服務器鏈接時是一種狀態,檢索HTML是另一種狀態。當前的狀態用事件過程的State參數來表示。在示例程序的StateChanged事件中輸入如下代碼:
PrivateSubInet1_StateChanged(ByValStateAsInteger)
SelectCaseState
Case12'表明網絡連接檢索正常
stemp=Inet1.GetChunk(1024)'使用GetChunk方法從緩沖區中一次提取1024個字節的回應文本,並存放在stemp臨時變量中
Whilestemp<>””'當仍然返回信息時
LastResult=LastResult stemp'將整個網頁的源文件代碼放入LastResult變量中
stemp=Inet1.GetChunk(1024)'循環
Wend
Case11
MsgBox"未返回搜索結果"
EndSelect
EndSub
盡管StateChanged事件包含了這個示例程序代碼的主要部分,我們仍然需要在Command1的Click事件中加入代碼,以初始化這個請求。下面就是這段代碼:
`
PrivateSubCommand1_Click()
url="http://search.chinese.yahoo.com/search/gb?p=" Text1.Text
Inet1.protocol=icHTTP'指明控件協議類型
Inet1.ExecuteCStr(url),”GET/”'發出請求
WhileInet1.StillExecuting
DoEvents
Wend
EndSub
前面已經提到,以這種方法返回的信息包含了搜索的結果網頁,同直接搜索的區別就是由於這樣返回的就是源代碼,暫時存儲到一個臨時變量中,這樣一來,你既可以將返回的信息直接存儲到一個文件中,另一種方法,這就是我們下面要提到的對代碼的優化處理。
什麼叫對代碼的優化處理呢?因為返回的結果中包含許多其他沒有什麼用處的修飾,比如表格、banner、menta等等信息,而這些信息並不是我們需要的,去掉這些信息,只保留對我們來說有用的結果,這就是優化。那麼怎樣優化呢?分析HTML語法您就會看到,許多信息都是包含在一些關鍵詞之間。舉個例子:對於插入的圖片來說,都是用”<imgsrc=”來開頭,用往後遇到的第一個”>”來結尾,這樣一來就清楚了,只要把代碼中所有的滿足以上條件的語句刪掉,這樣代碼中就不會出現直接圖片信息,我們參考以下的一段代碼:
PublicFunctionpicFilter(downCode)'定義一個過濾圖片信息的過程
DimpStartAsLong,pStopAsLong
DimpString1AsString,pString2AsString
pString1="<img"
pString2=">"'分別將兩個關鍵詞定義
pStart=InStr(downCode,pString1)'找到第一個圖片信息的起始位置
IfpStart<>0Then'如果代碼中有圖片信息的話
pStop=InStr(pStart,downCode,pString2) 1'從上面找的起始部位開始找到第一個用於結束圖片信息的”>”
DoWhilepStart<>0'只要仍舊有圖片信息
Mid(downCode,pStart,pStop-pStart)=Space(pStop-pStart)'將代碼中的圖片信息用空格代替,實現刪除效果
pStart=InStr(pStop,downCode,pString1)'重復上面的過程,刪除其他的圖片信息
IfpStart=0ThenExitDo'沒有圖片信息後,退出循環
pStop=InStr(pStart,downCode,pString2,1) 1
Loop
picFilter=downCode'將處理過後的代碼返回過程函數
EndFunction
接下來只要使用
lastResult=picFilterlastResult
就實現了對臨時變量中搜索結果代碼的圖片信息去除工作,以此類推,很容易去掉諸如”<font”、”<b”等信息。
上面所說的是一種方法,但我們知道HTML語法中關鍵詞很多,如果都用以上的條件過濾的話,會使程序的效率大大降低,運行速度也會減慢很多。有沒有更好的方法?有,如果是有心人的話,您就會發現不同的搜索引擎返回的結果有其獨特的編排方式,我們仍舊以雅虎為例,你只要察看其返回的結果源代碼就會發現:每一條信息的鏈接和主題部分排列都是以“<LI>”開始,以“<A>”結束,而在“<A>”和接下來的第一個“<”之間的部分是該主題的簡單描述,這樣我們可以用下面的代碼來將雅虎搜索結果代碼中的有用信息提煉起來:
PublicFunctionyahooFilter(downCode)
DimsString1AsString,sString2AsString,sString3AsString
DimsStartAsLong,sStopAsLong
Dimstring1AsString,string2AsString,lastStringasstring
sString1="<LI>"
sString2="</A>"
sString3="<"
sStart=InStr(downCode,sString1)'取得第一條主題信息的起始位置
DoWhilesStart<>0
sStop=InStr(sStart,downCode,sString2)
string1=Mid(downCode,sStart 4,sStop-sStart)'將第一條主題信息存放在string1變量中
sStart=InStr(sStop,downCode,sString1)'從第一條主題信息的結束部位開始查找該主題的簡單描述
sStart=sStop 4
sStop=InStr(sStart,downCode,sString3)'取得該主題描述部分的結束位置
IfsStop=sStartThen'判斷只有主題而沒有描述的信息
string2=""
ElseIfsStop<>sStartThen
string2=Mid(downCode,sStart,sStop-sStart-1)'取出主題描述部分
EndIf
lastString=lastString "<p>" string1 string2'將提煉的結果存放在臨時變量中
sStart=InStr(sStop,downCode,sString1)'重新定位下一條信息的起始位置
Loop'循環
yahooFilter=lastString'
EndFunction
經過了上面復雜的提煉,然後將提煉的結果寫到一個網頁文件中,然後調用浏覽器顯示,會出現整整齊齊的結果,象圖二一樣:
返回頭來我們看一下現在比較流行的搜索軟件,比如SearchX98、Crazysearch、InforianQuest99,無論他們說明寫的再好,也跳不出上面所說的原理,但他們各自有自己的一些獨特之處,比如SearchX98能夠連續搜索多個引擎,其實就是發出一條搜索指令後,程序本身連續在各個搜索引擎發出搜索指令,將返回的結果經過簡單的處理生成一個頁面,其他的內容搜索更是最簡單的直接發出搜索指令而已。而對於Crazysearch,你只要打開注冊表,就會發現其中文搜索只能搜索中文雅虎,英文只能搜索Excite,但號稱注冊版本能夠搜索1000條記錄,其實您只要分析一下雅虎的搜索代碼就會發現,其中有一個關鍵詞是“n=”,代表一次搜索返回的結果數目;另外一個是“b=”,代表從第幾條記錄開始顯示,就這兩個關鍵詞起到了這麼重大的作用,但Crazysearch的獨特之處在於返回的搜索結果以表格方式排列,直觀醒目。最後要推薦的是InforianQuest99,盡管其原理也超脫不了以上的范圍(您只要打開其目錄下的site子目錄中的文件就清楚了),但我還是極力推薦,因為無論是從站點的數量,搜索范圍的廣泛,搜索的速度,結果的詳細,沒有能過超過InforianQuset99的,而且要差很多。當然基於對國產軟件的支持,我們還是可以對上面的兩個軟件寄予厚望。同是由於本人水平有限,難免有疏漏之處,敬請大家指正。->