隨筆-65  評(píng)論-68  文章-4  trackbacks-0
          制作自己的網(wǎng)絡(luò)搜索軟件
          大家都知道,獲得信息是我們上網(wǎng)的很大一個(gè)目的,而獲得信息對(duì)于大多數(shù)人來(lái)說(shuō)要通過(guò)網(wǎng)上的搜索引擎來(lái)搜索自己所需要的信息,而搜索軟件通過(guò)向搜索站點(diǎn)發(fā)出特殊搜索字串命令(各個(gè)站點(diǎn)的格式不一樣),然后用軟件對(duì)結(jié)果進(jìn)行處理后顯示出來(lái)。原理簡(jiǎn)單,可是效果卻是顯著的,能夠迅速而方便的搜索到各個(gè)站點(diǎn)的信息。下面我就通過(guò)介紹使用 vb制作自己的搜索軟件和剖析現(xiàn)在流行的搜索軟件程序來(lái)介紹這些內(nèi)容:
            我們都知道vb是最簡(jiǎn)單方便的編程語(yǔ)言,利用vb編寫(xiě)一個(gè)小小的搜索軟件用不了多少行語(yǔ)句。第一步當(dāng)然要安裝一個(gè)vb5.0或者6.0 的運(yùn)行環(huán)境。啟動(dòng)vb以后,首先創(chuàng)建了一個(gè)窗體,然后要對(duì)運(yùn)行環(huán)境進(jìn)行一下設(shè)置:具體來(lái)說(shuō)呢,就是添加上必要的控件,一般來(lái)說(shuō),如果您安裝了IE4.0以上的瀏覽器,windows的 system目錄中就會(huì)有SHDOCVW.DLL的文件,我們通過(guò)點(diǎn)擊菜單中“工程”-“部件”,在彈出的對(duì)話框中找到有一欄寫(xiě)著”microsoft internet controls”的選項(xiàng),這個(gè)選項(xiàng)其實(shí)就是上面提到的SHDOCVW.DLL 文件的描述。利用這個(gè)文件我們可以初始化一個(gè)瀏覽器的實(shí)例。當(dāng)您選中這個(gè)選項(xiàng)后,會(huì)發(fā)現(xiàn)工具欄中多了一個(gè)形狀如同地球的按鈕,這就是剛才選中的瀏覽器控件,我們雙擊這個(gè)圖標(biāo)按鈕在窗體上生成一個(gè)webbrowser1 的部件,接下來(lái)我們就使用這個(gè)部件來(lái)顯示查詢的結(jié)果。

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

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

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

          Private Sub Command1_Click()

          Dim url As String

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

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

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

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

          End Sub

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

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

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

          Private Sub Inet1_StateChanged(ByVal State As Integer)

          Select Case State

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

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

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

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

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

          Wend

          Case 11

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

          End Select

          End Sub

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

          `
          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ā)出請(qǐng)求

          While Inet1.StillExecuting

          DoEvents

          Wend

          End Sub

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

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

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

          Dim pStart As Long, pStop As Long

          Dim pString1 As String, pString2 As String

          pString1 = "<img"

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

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

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

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

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

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

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

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

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

          Loop

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

          End Function

          接下來(lái)只要使用

          lastResult=picFilter lastResult

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

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

          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é)束部位開(kāi)始查找該主題的簡(jiǎn)單描述

          sStart = sStop + 4

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

          If sStop = sStart Then '判斷只有主題而沒(méi)有描述的信息

          string2 = ""

          ElseIf sStop <> sStart Then

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

          End If

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

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

          Loop'循環(huán)

          yahooFilter = lastString'

          End Function


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

            返回頭來(lái)我們看一下現(xiàn)在比較流行的搜索軟件,比如 SearchX98、Crazysearch、Inforian Quest 99,無(wú)論他們說(shuō)明寫(xiě)的再好,也跳不出上面所說(shuō)的原理,但他們各自有自己的一些獨(dú)特之處,比如SearchX98 能夠連續(xù)搜索多個(gè)引擎,其實(shí)就是發(fā)出一條搜索指令后,程序本身連續(xù)在各個(gè)搜索引擎發(fā)出搜索指令,將返回的結(jié)果經(jīng)過(guò)簡(jiǎn)單的處理生成一個(gè)頁(yè)面,其他的內(nèi)容搜索更是最簡(jiǎn)單的直接發(fā)出搜索指令而已。而對(duì)于 Crazysearch,你只要打開(kāi)注冊(cè)表,就會(huì)發(fā)現(xiàn)其中文搜索只能搜索中文雅虎,英文只能搜索Excite,但號(hào)稱注冊(cè)版本能夠搜索1000條記錄,其實(shí)您只要分析一下雅虎的搜索代碼就會(huì)發(fā)現(xiàn),其中有一個(gè)關(guān)鍵詞是 “n=”,代表一次搜索返回的結(jié)果數(shù)目;另外一個(gè)是“b=”,代表從第幾條記錄開(kāi)始顯示,就這兩個(gè)關(guān)鍵詞起到了這么重大的作用,但Crazysearch的獨(dú)特之處在于返回的搜索結(jié)果以表格方式排列,直觀醒目。最后要推薦的是Inforian Quest 99,盡管其原理也超脫不了以上的范圍(您只要打開(kāi)其目錄下的site子目錄中的文件就清楚了),但我還是極力推薦,因?yàn)闊o(wú)論是從站點(diǎn)的數(shù)量,搜索范圍的廣泛,搜索的速度,結(jié)果的詳細(xì),沒(méi)有能過(guò)超過(guò)Inforian Quset 99的,而且要差很多。當(dāng)然基于對(duì)國(guó)產(chǎn)軟件的支持,我們還是可以對(duì)上面的兩個(gè)軟件寄予厚望。同是由于本人水平有限,難免有疏漏之處,敬請(qǐng)大家指正。
          posted on 2005-05-08 13:58 小爽 閱讀(650) 評(píng)論(1)  編輯  收藏 所屬分類: 我的經(jīng)驗(yàn)

          評(píng)論:
          # re: 制作自己的網(wǎng)絡(luò)搜索軟件 2006-05-26 19:24 | Wilson
          有沒(méi)有搞錯(cuò),明明是.NET,怎么說(shuō)是JAVA?  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 隆子县| 靖边县| 和政县| 葫芦岛市| 萨嘎县| 利川市| 涿州市| 海口市| 兰考县| 阜康市| 桂东县| 安宁市| 卓尼县| 棋牌| 天镇县| 桂阳县| 凤山县| 宜州市| 丰城市| 双鸭山市| 台州市| 闵行区| 游戏| 甘洛县| 綦江县| 钦州市| 慈溪市| 兖州市| 湖州市| 武威市| 谢通门县| 贵州省| 栾城县| 潍坊市| 赫章县| 关岭| 桓台县| 曲松县| 襄垣县| 乌拉特中旗| 峨边|