明輝手游網(wǎng)中心:是一個免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

制作自己的網(wǎng)絡(luò)搜索軟件

[摘要]閆輝 大家都知道,獲得信息是我們上網(wǎng)的很大一個目的,而獲得信息對于大多數(shù)人來說要通過網(wǎng)上的搜索引擎來搜索自己所需要的信息,而搜索軟件通過向搜索站點(diǎn)發(fā)出特殊搜索字串命令(各個站點(diǎn)的格式不一樣),然后用軟件對結(jié)果進(jìn)行處理后顯示出來。原理簡單,可是效果卻是顯著的,能夠迅速而方便的搜索到各個站點(diǎn)的...
閆輝

    大家都知道,獲得信息是我們上網(wǎng)的很大一個目的,而獲得信息對于大多數(shù)人來說要通過網(wǎng)上的搜索引擎來搜索自己所需要的信息,而搜索軟件通過向搜索站點(diǎn)發(fā)出特殊搜索字串命令(各個站點(diǎn)的格式不一樣),然后用軟件對結(jié)果進(jìn)行處理后顯示出來。原理簡單,可是效果卻是顯著的,能夠迅速而方便的搜索到各個站點(diǎn)的信息。下面我就通過介紹使用 vb制作自己的搜索軟件和剖析現(xiàn)在流行的搜索軟件程序來介紹這些內(nèi)容:

  我們都知道vb是最簡單方便的編程語言,利用vb編寫一個小小的搜索軟件用不了多少行語句。第一步當(dāng)然要安裝一個vb5.0或者6.0 的運(yùn)行環(huán)境。啟動vb以后,首先創(chuàng)建了一個窗體,然后要對運(yùn)行環(huán)境進(jìn)行一下設(shè)置:具體來說呢,就是添加上必要的控件,一般來說,如果您安裝了IE4.0以上的瀏覽器,windows的 system目錄中就會有SHDOCVW.DLL的文件,我們通過點(diǎn)擊菜單中“工程”-“部件”,在彈出的對話框中找到有一欄寫著”microsoft internet controls”的選項(xiàng),這個選項(xiàng)其實(shí)就是上面提到的SHDOCVW.DLL 文件的描述。利用這個文件我們可以初始化一個瀏覽器的實(shí)例。當(dāng)您選中這個選項(xiàng)后,會發(fā)現(xiàn)工具欄中多了一個形狀如同地球的按鈕,這就是剛才選中的瀏覽器控件,我們雙擊這個圖標(biāo)按鈕在窗體上生成一個webbrowser1 的部件,接下來我們就使用這個部件來顯示查詢的結(jié)果。

  接下來我們在窗體上放上一個文本框和一個按鈕,其實(shí)就這幾個部件已經(jīng)可以算是一個最小的搜索程序基本結(jié)構(gòu)了。我們現(xiàn)在來所一說網(wǎng)絡(luò)搜索的原理:上面已經(jīng)提到是通過向搜索站點(diǎn)發(fā)出特殊搜索字串命令(各個站點(diǎn)的格式不一樣),然后用軟件對結(jié)果進(jìn)行處理后顯示出來,但如何發(fā)出搜索字符串、發(fā)出怎樣的字符串還需要有一定的HTML 知識。我們知道對于網(wǎng)上信息的的發(fā)送是通過表單的形式來發(fā)送的,也就是說當(dāng)我們在網(wǎng)上點(diǎn)擊某些表單時,通過表單中包含的默認(rèn)地址中的表單處理程序來接受所有包含在表單中的信息,而這些信息有的是顯示的,而另外一些卻是隱藏的。您可以試著將一個包含有表單的網(wǎng)頁用Frontpage或者Dreamwaver打開,這時你就會發(fā)現(xiàn)有很多用瀏覽器看不到的東西,這些隱藏的標(biāo)志同樣在您發(fā)送表單時起著重要的作用。沒有這些標(biāo)志,發(fā)出的字符串很可能得不到服務(wù)器的應(yīng)答。我們知道了這些,再返回頭來看我們程序所需發(fā)出的字符串,舉個例子來說:最常用的雅虎中文的搜索代碼是 ”http://cn.search.yahoo.com/search/gb?p=***”,其中***代表的是所要搜索的字符串,而剩余的部分是處理字符串的服務(wù)器程序的地址,另外一個我們很常用的搜索引擎Yeah,它的搜索代碼相!
對復(fù)雜了一些是”http://www2.yeah.net/cgi-bin/query2.exe?query=***&start=0&REXP=AND” ,但基本的東西沒有變,它們都是使用了這樣一種形式:http://目標(biāo)URL?參數(shù)1名=參數(shù)1值&參數(shù)2名=參數(shù)2值&參數(shù)3名=參數(shù)3值…

  對于http協(xié)議,其中包括重要的幾種傳送數(shù)據(jù)的方法,其中比較常用的有GET和POST方法,對于使用GET方法進(jìn)行傳送數(shù)據(jù)的網(wǎng)站來說,使用上面的形式百發(fā)百中,都能夠通過一條查詢語句返回所需要查詢的內(nèi)容網(wǎng)頁,但對于使用 POST方法的網(wǎng)站,有可能返回不了查詢結(jié)果網(wǎng)頁,不過從我的經(jīng)驗(yàn)看,一般來說是能夠成功的。

  知道了如何向服務(wù)器發(fā)送查詢語句,下面我們就從程序的角度來寫:假若窗體上有一個文本框Text1、一個標(biāo)簽Label1、一個瀏覽器Webbrowser1、一個按鈕Command11,其中文本框用于輸入關(guān)鍵詞,瀏覽器用于顯示查詢結(jié)果網(wǎng)頁,按鈕用于發(fā)出請求語句,那么點(diǎn)擊Command1的程序語句可以這樣寫:

Private Sub Command1_Click()

Dim url As String

On Error Resume Next '出錯后繼續(xù)

If Text1.Text = "" Then MsgBox "請先輸入關(guān)鍵字": Exit Sub '防止不輸入關(guān)鍵詞

url = "http://search.chinese.yahoo.com/search/gb?p=" +Text1.Text '將關(guān)鍵詞放入查詢語句中

Webbrowser1.Navigate url'調(diào)用瀏覽器顯示查詢結(jié)果

End Sub

  雅虎的查詢語句比較簡單,而對于比較復(fù)雜網(wǎng)站的查詢語句一定要注意的是各個關(guān)鍵參數(shù)之間一定要用“&”來隔開。雖然你只是學(xué)會了這一招,但已經(jīng)足夠利用網(wǎng)上的資源來編寫你的第一個程序了,因?yàn)榫W(wǎng)上所有類型的表單都能表示了,無論是查詢股票、軟件、書籍、圖片,都不外乎這種模式。只要你將查詢網(wǎng)頁調(diào)入 Frontpage、Dreamwaver等所見即所得的網(wǎng)頁編輯軟件中,便會毫無遮攔的展現(xiàn)在你的面前,利用這些鏈接,再加上一個好的界面,當(dāng)然可以制作自己的搜索工具軟件了,不過要注意的是,有些表單的傳送路徑的是相對路徑,這時要加上網(wǎng)站的地址鏈接。
  可能有人要說,這么簡單,誰不知道,不是為了賺稿費(fèi)吧?錯。剛才的方法比起直接訪問搜索站點(diǎn)的確能節(jié)省不少上網(wǎng)的時間,但并沒有將程序的優(yōu)勢全部發(fā)揮出來,我們現(xiàn)在繼續(xù)講另外一種檢索網(wǎng)頁的方法:首先介紹一個控件Microsoft Internet Transfer(這個控件在安裝vb或者某些程序的時候會自動安裝),這個控件允許建立與其他計算機(jī)的鏈接,并傳送文件。它使兩個Internet規(guī)則 HTTP和FTP的使用變得容易。當(dāng)正常訪問一個網(wǎng)頁時,Internent Transfer用GET命令訪問網(wǎng)絡(luò)瀏覽器的一個文件。例如,如果打開了URL http://www.cpcw.com/index.htm,瀏覽器將建立與地址在www.cpcw.com的機(jī)器的鏈接,并傳送命令GET/index.htm。HTML 將通過鏈接以普通文本的方式返回,因?yàn)榉祷氐膬?nèi)容只是所要的網(wǎng)頁的源文件,節(jié)省了很多用于傳送顯示網(wǎng)頁中圖像的時間,速度要快了許多,但最重要的是我們可以很方便地使用自己的邏輯對凡會的源文件進(jìn)行正確地分析和格式化,重新整理網(wǎng)頁的查詢結(jié)果。

  我們還用剛才的窗體,只是要在菜單中選擇“工程“-”部件“,在彈出的對話框中找到一項(xiàng)是:Microsoft Internet Transfer Control,選中后,在工具欄中您就會發(fā)現(xiàn)增添了一個顯示有地球和計算機(jī)的小按鈕,雙擊這個按鈕會在窗體上加入一個 Internet Transfer實(shí)例Inet1,完成了這些步驟后,窗體應(yīng)如圖一所示。現(xiàn)在準(zhǔn)備在實(shí)例工程中加入代碼。

  Internet Transfer控件有一個事件StateChanged。這個事件的目的是當(dāng)不同的操作發(fā)生時通知用戶程序。例如:控件在與網(wǎng)絡(luò)服務(wù)器鏈接時是一種狀態(tài),檢索HTML是另一種狀態(tài)。當(dāng)前的狀態(tài)用事件過程的State 參數(shù)來表示。在示例程序的StateChanged事件中輸入如下代碼:

Private Sub Inet1_StateChanged(ByVal State As Integer)

Select Case State

Case 12 '表明網(wǎng)絡(luò)連接檢索正常

stemp=Inet1.GetChunk(1024) '使用GetChunk方法從緩沖區(qū)中一次提取1024個字節(jié)的回應(yīng)文本,并存放在stemp臨時變量中

While stemp<>””'當(dāng)仍然返回信息時

LastResult=LastResult+stemp'將整個網(wǎng)頁的源文件代碼放入LastResult變量中

stemp=Inet1.GetChunk(1024)'循環(huán)

Wend

Case 11

MsgBox "未返回搜索結(jié)果"

End Select

End Sub

盡管StateChanged事件包含了這個示例程序代碼的主要部分,我們?nèi)匀恍枰贑ommand1的Click事件中加入代碼,以初始化這個請求。下面就是這段代碼:

`

Private Sub Command1_Click()

url = "http://search.chinese.yahoo.com/search/gb?p=" +Text1.Text

Inet1.protocol=icHTTP'指明控件協(xié)議類型

Inet1.Execute CStr(url),”GET /” '發(fā)出請求

While Inet1.StillExecuting

DoEvents

Wend

End Sub

  前面已經(jīng)提到,以這種方法返回的信息包含了搜索的結(jié)果網(wǎng)頁,同直接搜索的區(qū)別就是由于這樣返回的就是源代碼,暫時存儲到一個臨時變量中,這樣一來,你既可以將返回的信息直接存儲到一個文件中,另一種方法,這就是我們下面要提到的對代碼的優(yōu)化處理。

  什么叫對代碼的優(yōu)化處理呢?因?yàn)榉祷氐慕Y(jié)果中包含許多其他沒有什么用處的修飾,比如表格、banner、menta等等信息,而這些信息并不是我們需要的,去掉這些信息,只保留對我們來說有用的結(jié)果,這就是優(yōu)化。那么怎樣優(yōu)化呢?分析HTML語法您就會看到,許多信息都是包含在一些關(guān)鍵詞之間。舉個例子:對于插入的圖片來說,都是用”<img src=” 來開頭,用往后遇到的第一個”>”來結(jié)尾,這樣一來就清楚了,只要把代碼中所有的滿足以上條件的語句刪掉,這樣代碼中就不會出現(xiàn)直接圖片信息,我們參考以下的一段代碼:

Public Function picFilter(downCode)'定義一個過濾圖片信息的過程

Dim pStart As Long, pStop As Long

Dim pString1 As String, pString2 As String

pString1 = "<img"

pString2 = ">" '分別將兩個關(guān)鍵詞定義

pStart = InStr(downCode, pString1)'找到第一個圖片信息的起始位置

If pStart <> 0 Then '如果代碼中有圖片信息的話

pStop = InStr(pStart, downCode, pString2) + 1 '從上面找的起始部位開始找到第一個用于結(jié)束圖片信息的”>”

Do While pStart <> 0 '只要仍舊有圖片信息

Mid(downCode, pStart, pStop - pStart) = Space(pStop - pStart) '將代碼中的圖片信息用空格代替,實(shí)現(xiàn)刪除效果

pStart = InStr(pStop, downCode, pString1)'重復(fù)上面的過程,刪除其他的圖片信息

If pStart = 0 Then Exit Do '沒有圖片信息后,退出循環(huán)

pStop = InStr(pStart, downCode, pString2, 1) + 1

Loop

picFilter=downCode '將處理過后的代碼返回過程函數(shù)

End Function

接下來只要使用

lastResult=picFilter lastResult

就實(shí)現(xiàn)了對臨時變量中搜索結(jié)果代碼的圖片信息去除工作,以此類推,很容易去掉諸如”<font”、”<b”等信息。

  上面所說的是一種方法,但我們知道HTML語法中關(guān)鍵詞很多,如果都用以上的條件過濾的話,會使程序的效率大大降低,運(yùn)行速度也會減慢很多。有沒有更好的方法?有,如果是有心人的話,您就會發(fā)現(xiàn)不同的搜索引擎返回的結(jié)果有其獨(dú)特的編排方式,我們?nèi)耘f以雅虎為例,你只要察看其返回的結(jié)果源代碼就會發(fā)現(xiàn):每一條信息的鏈接和主題部分排列都是以“<LI>”開始,以“<A>”結(jié)束,而在“<A>” 和接下來的第一個“<”之間的部分是該主題的簡單描述,這樣我們可以用下面的代碼來將雅虎搜索結(jié)果代碼中的有用信息提煉起來:

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 = "<LI>"

sString2 = "</A>"

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) '從第一條主題信息的結(jié)束部位開始查找該主題的簡單描述

sStart = sStop + 4

sStop = InStr(sStart, downCode, sString3) '取得該主題描述部分的結(jié)束位置

If sStop = sStart Then '判斷只有主題而沒有描述的信息

string2 = ""

ElseIf sStop <> sStart Then

string2 = Mid(downCode, sStart, sStop - sStart - 1) '取出主題描述部分

End If

lastString = lastString + "<p>" + string1 + string2 '將提煉的結(jié)果存放在臨時變量中

sStart = InStr(sStop, downCode, sString1)'重新定位下一條信息的起始位置

Loop'循環(huán)

yahooFilter = lastString'

End Function


經(jīng)過了上面復(fù)雜的提煉,然后將提煉的結(jié)果寫到一個網(wǎng)頁文件中,然后調(diào)用瀏覽器顯示,會出現(xiàn)整整齊齊的結(jié)果,象圖二一樣:

  返回頭來我們看一下現(xiàn)在比較流行的搜索軟件,比如 SearchX98、Crazysearch、Inforian Quest 99,無論他們說明寫的再好,也跳不出上面所說的原理,但他們各自有自己的一些獨(dú)特之處,比如SearchX98 能夠連續(xù)搜索多個引擎,其實(shí)就是發(fā)出一條搜索指令后,程序本身連續(xù)在各個搜索引擎發(fā)出搜索指令,將返回的結(jié)果經(jīng)過簡單的處理生成一個頁面,其他的內(nèi)容搜索更是最簡單的直接發(fā)出搜索指令而已。而對于 Crazysearch,你只要打開注冊表,就會發(fā)現(xiàn)其中文搜索只能搜索中文雅虎,英文只能搜索Excite,但號稱注冊版本能夠搜索1000條記錄,其實(shí)您只要分析一下雅虎的搜索代碼就會發(fā)現(xiàn),其中有一個關(guān)鍵詞是 “n=”,代表一次搜索返回的結(jié)果數(shù)目;另外一個是“b=”,代表從第幾條記錄開始顯示,就這兩個關(guān)鍵詞起到了這么重大的作用,但Crazysearch的獨(dú)特之處在于返回的搜索結(jié)果以表格方式排列,直觀醒目。最后要推薦的是Inforian Quest 99,盡管其原理也超脫不了以上的范圍(您只要打開其目錄下的site子目錄中的文件就清楚了),但我還是極力推薦,因?yàn)闊o論是從站點(diǎn)的數(shù)量,搜索范圍的廣泛,搜索的速度,結(jié)果的詳細(xì),沒有能過超過Inforian Quset 99的,而且要差很多。