用VB制作網絡搜索軟件
發(fā)表時間:2023-08-03 來源:明輝站整理相關軟件相關文章人氣:
[摘要]◆ 南京工程學院仿真部 施建強(shiyu789@163.com) 網絡搜索的原理 搜索軟件是通過向搜索站點發(fā)出特殊搜索字串命令(各個站點的格式不一樣),然后對結果進行處理后顯示出來,但如何發(fā)出搜索...
◆ 南京工程學院仿真部 施建強(shiyu789@163.com)
網絡搜索的原理
搜索軟件是通過向搜索站點發(fā)出特殊搜索字串命令(各個站點的格式不一樣),然后對結果進行處理后顯示出來,但如何發(fā)出搜索字符串、發(fā)出怎樣的字符串還需要對HTML有一定的認識。我們知道對于網上信息的發(fā)送是通過表單的形式來進行的,也就是說當我們在網上點擊某些表單時,通過表單中包含的默認地址中的表單處理程序來接受所有包含在表單中的信息,這些信息有的是顯示的,而另外一些卻是隱藏的。您可以試著將一個包含有表單的網頁用Frontpage或者Dreamwaver打開,這時您就會發(fā)現有很多在瀏覽器里看不到的東西,這些隱藏的標志在您發(fā)送表單時起著重要的作用。沒有這些標志,發(fā)出的字符串很可能得不到服務器的應答。
知道了這些,再來看程序所需發(fā)送的字符串,舉個例子來說:雅虎中文的搜索代碼是 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方法的網站,有可能返回不了查詢結果網頁,不過從筆者的經驗看,一般來說是能夠成功的。
實現方法
下面剖析現在流行的搜索軟件程序,并介紹使用VB制作自己的搜索軟件的方法。
啟動VB 6.0,首先創(chuàng)建一個窗體,然后要對運行環(huán)境進行一下設置:具體來說,就是添加上必要的控件,一般情況下,如果您安裝了IE 4.0以上的瀏覽器,可通過點擊VB菜單中“工程->部件”,在彈出的部件對話框中找到有一欄寫著“Microsoft Internet Controls”的選項。利用它我們可以初始化一個瀏覽器的實例。當您選中這個選項后,會發(fā)現工具欄中多了一個形狀如同地球的按鈕,這就是剛才選中的瀏覽器控件,雙擊這個圖標按鈕在窗體上生成一個WebBrowser1的部件,接下來就使用這個部件來顯示查詢的結果。然后在窗體上放上一個文本框和一個按鈕,其實就這幾個部件已經可以構成一個最小的搜索程序基本結構了。
程序的編制
假若窗體上有一個文本框Text1、一個標簽Label1、一個瀏覽器WebBrowser1、一個按鈕Command1,其中文本框用于輸入關鍵詞,瀏覽器用于顯示查詢結果網頁,按鈕用于發(fā)出請求語句,點擊Command1的程序代碼可以這樣寫:
Private Sub Command1_Click()
Dim url As String
On Error Resume Next ’出錯后繼續(xù)
If Text1.Text = “” Then
MsgBox “請先輸入關鍵字”
EndIf ’防止不輸入關鍵詞
url = “http://search.chinese.yahoo
.com/search/gb?p=” + Text1.Text
’將關鍵詞放入查詢語句中
Webbrowser1.Navigate url
’調用瀏覽器顯示查詢結果
End Sub
雅虎的查詢語句比較簡單,而對于比較復雜網站的查詢語句一定要注意的是各個關鍵參數之間一定要用“&”來隔開。雖然您只是學會了這一招,但已經足夠利用網上的資源來編寫您的第一個程序了,因為網上所有類型的表單都能表示了,無論是查詢股票、軟件、書籍等都不外乎這種模式。只要您將查詢網頁調入 Frontpage、Dreamwaver等所見即所得的網頁編輯軟件中,這些網頁的源碼便會展現在您的面前,利用這些鏈接,再加上一個好的界面,就可以制作自己的搜索工具軟件了,不過要注意的是,有些表單的傳送路徑是相對路徑,這時要加上網站的地址鏈接。
程序的改進
上面的方法比起直接訪問搜索站點的確能節(jié)省不少上網的時間,但并沒有將程序的優(yōu)勢全部發(fā)揮出來,我們現在繼續(xù)介紹另外一種檢索網頁的方法:
首先介紹一個控件Microsoft Internet Transfer(這個控件在安裝VB或者某些應用程序的時候會自動安裝),這個控件允許建立與其他計算機的連接,并傳送文件。它使兩個Internet協議HTTP和FTP的使用變得容易。當正常訪問一個網頁時,Internet Transfer用GET命令訪問網絡瀏覽器的一個文件。例如,如果打開了URL: http://www.computerworld.com
.cn/,瀏覽器將建立與地址是www.computerworld
.com的機器的連接,并傳送GET命令。HTML 將通過連接以普通文本的方式返回,因為返回的內容只是所要的網頁的源文件,節(jié)省了很多用于傳送、顯示網頁中圖像的時間,速度要快了許多,而且最重要的是我們可以很方便地使用自己的邏輯對返回的源文件進行正確地分析和格式化,重新整理網頁的查詢結果。
還用剛才的窗體,只是要在菜單中選擇“工程->部件”,在彈出的對話框中找到一項“ Microsoft Internet Transfer Control”,選中后,在工具欄中您就會發(fā)現增添了一個顯示有地球和計算機的小按鈕,雙擊這個按鈕會在窗體上加入一個 Internet Transfer實例Inet1,完成了這些步驟后,現在準備在實例工程中加入代碼。
Internet Transfer控件有一個事件StateChanged。這個事件的目的是當不同的操作發(fā)生時通知用戶程序。例如:控件在與網絡服務器連接時是一種狀態(tài),檢索HTML是另一種狀態(tài)。當前的狀態(tài)用事件過程的State 參數來表示。在示例程序的StateChanged事件中輸入如下代碼:
Private Sub Inet1_StateChanged(ByVal State As Integer)
Select Case State
Case 12 ’表明網絡連接檢索正常
stemp=Inet1.GetChunk(1024)
’使用GetChunk方法從緩沖區(qū)中一次提取1024個字節(jié)的文本,并存放在stemp臨時變量中
While stemp<>“”
’當仍然返回信息時
LastResult=LastResult+stemp
’將整個網頁的源文件代碼放入LastResult變量中
stemp=Inet1.GetChunk(1024) ’循環(huán)
Wend
Case 11
MsgBox “未返回搜索結果”
End Select
End Sub
盡管StateChanged事件包含了這個示例程序代碼的主要部分,我們仍然需要在Command1的Click事件中加入代碼,以初始化這個請求。下面就是這段代碼:
Private Sub Command1_Click()
url =“http://search.chinese.yahoo
.com/search/gb?p=” +Text1.Text
Inet1.protocol=icHTTP
’指明控件協議類型
Inet1.Execute CStr(url),“GET /”
’發(fā)出請求
While Inet1.StillExecuting
DoEvents
Wend
End Sub
進一步優(yōu)化
前面已經提到,用這種方法返回的信息包含了搜索的結果網頁,同直接搜索的區(qū)別就是由于這樣返回的是源代碼,暫時存儲到一個臨時變量中,這樣一來,您可以將返回的信息直接存儲到一個文件中。還有另一種方法,這就是我們下面要提到的對代碼的優(yōu)化處理。
什么叫對代碼的優(yōu)化處理呢?因為返回的結果中包含許多其他沒有什么用處的修飾,比如表格、“banner”等等信息,而這些信息并不是我們需要的,去掉這些信息,只保留對我們來說有用的結果,這就是優(yōu)化。那么怎樣優(yōu)化呢?分析HTML語法您就會看到,許多信息都是包含在一些關鍵詞之間。舉個例子:對于插入的圖片來說,都是用“”來結尾,這樣就清楚了,只要把代碼中所有的滿足以上條件的語句刪掉,這樣代碼中就不會出現圖片信息,代碼如下:
Public Function picFilter(downCode)
’定義一個過濾圖片信息的過程
Dim pStart As Long, pStop As Long
Dim pString1 As String, pString2 As String
pString1 = “
pString2 = “>”
’分別將兩個關鍵詞定義
pStart = InStr(downCode, pString1)
’找到第一個圖片信息的起始位置
If pStart <> 0 Then
’如果代碼中有圖片信息的話
pStop = InStr(pStart, downCode, pString2) + 1
’從上面找的起始部位開始找到第一個用于結束圖片信息的“>”
Do While pStart <> 0
’只要仍舊有圖片信息就繼續(xù)處理
Mid(downCode, pStart, pStop - pStart) = Space(pStop - pStart)
’將代碼中的圖片信息用空格代替,實現刪除效果
pStart = InStr(pStop, downCode, pString1)
’重復上面的過程,刪除其他的圖片
If pStart = 0 Then Exit Do
’沒有圖片信息后,退出循環(huán)
pStop = InStr(pStart, downCode, pString2, 1) + 1
Loop
End If
picFilter=downCode
’將處理過后的代碼返回過程函數
End Function
接下來只要使用lastResult=picFilter(lastResult)就實現了對臨時變量中搜索結果代碼的圖片信息去除工作,以此類推,很容易去掉諸如“
上面所說的是一種解決方法,但我們知道HTML語法中關鍵詞很多,如果都用以上的條件過濾的話,會使程序的效率大大降低,運行速度也會減慢很多。有沒有更好的方法?有,不同的搜索引擎返回的結果有其獨特的編排方式。我們仍以雅虎為例,您只要看看其返回的結果源代碼就會發(fā)現:每一條信息的鏈接和主題部分排列都是以“
”開始,以“”結束,而在“” 和接下來的第一個“<”之間的部分是該主題的簡單描述,這樣我們可以用下面的代碼來將雅虎搜索結果代碼中的有用信息提取出來:
Public Function yahooFilter(downCode)
Dim sString1 As String, sString2 As String, sString3 As String
Dim sStart As Long, sStop As Long
Dim string1 As String, string2 As String, lastString as string
sString1 =“
”
sString2 =“”
sString3 =“<”
sStart = InStr(downCode, sString1)
’取得第一條主題信息的起始位置
Do While sStart <> 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)
’取得該主題描述部分的結束位置
If sStop = sStart Then
’判斷是否只有主題而沒有描述的信息
string2 = “”
ElseIf sStop <> sStart Then
string2 = Mid(downCode, sStart, sStop - sStart - 1)
’取出主題描述部分
End If
lastString = lastString + “
” + string1 + string2
’將提煉的結果存放在臨時變量中
Start = InStr(sStop, downCode, sString1)
’重新定位下一條信息的起始位置
Loop ’循環(huán)
yahooFilter = lastString
End Function
經過了上面復雜的處理,將結果寫到一個網頁文件中,然后調用瀏覽器顯示,就會出現整整齊齊的結果。
現在比較流行的搜索軟件,比如 SearchX98、Crazysearch,它們都符合上面所說的原理,但它們各自都有自己的一些獨特之處,比如SearchX98 能夠連續(xù)搜索多個引擎,其實就是發(fā)出一條搜索指令后,程序本身連續(xù)向各個搜索引擎發(fā)出搜索指令,將返回的結果經過簡單的處理生成一個頁面,其他的內容搜索更是最簡單地直接發(fā)出搜索指令而已。而對于 Crazysearch,您只要打開注冊表,就會發(fā)現其中文搜索只能搜索中文雅虎,英文只能搜索Excite,號稱注冊版本能夠搜索1000條記錄,其實您只要分析一下雅虎的搜索代碼就會發(fā)現,其中有一個關鍵詞是“n=”,代表一次搜索返回的結果數目;另外一個是“b=”,代表從第幾條記錄開始顯示,就是這兩個關鍵詞起到了重要的作用,但Crazysearch的獨特之處在于返回的搜索結果以表格方式排列,直觀醒目。
結束語
本文剖析了現在流行的搜索軟件并介紹了使用VB 6.0制作搜索軟件的辦法。在搜索軟件方面, 當然還有很多工作可以去做, 希望此文能起到拋磚引玉的作用。