?? 122.htm
字號:
<p>制作自己的網絡搜索軟件 </p>
<p> </p>
<p> 大家都知道,獲得信息是我們上網的很大一個目的,而獲得信息對于大多數人來說要通過網上的搜索引擎來搜索自己所需要的信息,而搜索軟件通過向搜索站點發出特殊搜索字串命令(各個站點的格式不一樣),然后用軟件對結果進行處理后顯示出來。原理簡單,可是效果卻是顯著的,能夠迅速而方便的搜索到各個站點的信息。下面我就通過介紹使用 vb制作自己的搜索軟件和剖析現在流行的搜索軟件程序來介紹這些內容: </p>
<p> 我們都知道vb是最簡單方便的編程語言,利用vb編寫一個小小的搜索軟件用不了多少行語句。第一步當然要安裝一個vb5.0或者6.0 的運行環境。啟動vb以后,首先創建了一個窗體,然后要對運行環境進行一下設置:具體來說呢,就是添加上必要的控件,一般來說,如果您安裝了IE4.0以上的瀏覽器,windows的 system目錄中就會有SHDOCVW.DLL的文件,我們通過點擊菜單中“工程”-“部件”,在彈出的對話框中找到有一欄寫著”microsoft internet controls”的選項,這個選項其實就是上面提到的SHDOCVW.DLL 文件的描述。利用這個文件我們可以初始化一個瀏覽器的實例。當您選中這個選項后,會發現工具欄中多了一個形狀如同地球的按鈕,這就是剛才選中的瀏覽器控件,我們雙擊這個圖標按鈕在窗體上生成一個webbrowser1 的部件,接下來我們就使用這個部件來顯示查詢的結果。</p>
<p></p>
<p> 接下來我們在窗體上放上一個文本框和一個按鈕,其實就這幾個部件已經可以算是一個最小的搜索程序基本結構了。我們現在來所一說網絡搜索的原理:上面已經提到是通過向搜索站點發出特殊搜索字串命令(各個站點的格式不一樣),然后用軟件對結果進行處理后顯示出來,但如何發出搜索字符串、發出怎樣的字符串還需要有一定的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值…</p>
<p></p>
<p> 對于http協議,其中包括重要的幾種傳送數據的方法,其中比較常用的有GET和POST方法,對于使用GET方法進行傳送數據的網站來說,使用上面的形式百發百中,都能夠通過一條查詢語句返回所需要查詢的內容網頁,但對于使用 POST方法的網站,有可能返回不了查詢結果網頁,不過從我的經驗看,一般來說是能夠成功的。</p>
<p></p>
<p> 知道了如何向服務器發送查詢語句,下面我們就從程序的角度來寫:假若窗體上有一個文本框Text1、一個標簽Label1、一個瀏覽器Webbrowser1、一個按鈕Command11,其中文本框用于輸入關鍵詞,瀏覽器用于顯示查詢結果網頁,按鈕用于發出請求語句,那么點擊Command1的程序語句可以這樣寫:</p>
<p></p>
<p>Private Sub Command1_Click()</p>
<p></p>
<p>Dim url As String</p>
<p></p>
<p>On Error Resume Next '出錯后繼續</p>
<p></p>
<p>If Text1.Text = "" Then MsgBox "請先輸入關鍵字": Exit Sub '防止不輸入關鍵詞</p>
<p></p>
<p>url = "http://search.chinese.yahoo.com/search/gb?p=" +Text1.Text '將關鍵詞放入查詢語句中</p>
<p></p>
<p>Webbrowser1.Navigate url'調用瀏覽器顯示查詢結果</p>
<p></p>
<p>End Sub</p>
<p></p>
<p> 雅虎的查詢語句比較簡單,而對于比較復雜網站的查詢語句一定要注意的是各個關鍵參數之間一定要用“&”來隔開。雖然你只是學會了這一招,但已經足夠利用網上的資源來編寫你的第一個程序了,因為網上所有類型的表單都能表示了,無論是查詢股票、軟件、書籍、圖片,都不外乎這種模式。只要你將查詢網頁調入 Frontpage、Dreamwaver等所見即所得的網頁編輯軟件中,便會毫無遮攔的展現在你的面前,利用這些鏈接,再加上一個好的界面,當然可以制作自己的搜索工具軟件了,不過要注意的是,有些表單的傳送路徑的是相對路徑,這時要加上網站的地址鏈接。</p>
<p> 可能有人要說,這么簡單,誰不知道,不是為了賺稿費吧?錯。剛才的方法比起直接訪問搜索站點的確能節省不少上網的時間,但并沒有將程序的優勢全部發揮出來,我們現在繼續講另外一種檢索網頁的方法:首先介紹一個控件Microsoft Internet Transfer(這個控件在安裝vb或者某些程序的時候會自動安裝),這個控件允許建立與其他計算機的鏈接,并傳送文件。它使兩個Internet規則 HTTP和FTP的使用變得容易。當正常訪問一個網頁時,Internent Transfer用GET命令訪問網絡瀏覽器的一個文件。例如,如果打開了URL http://www.cpcw.com/index.htm,瀏覽器將建立與地址在www.cpcw.com的機器的鏈接,并傳送命令GET/index.htm。HTML 將通過鏈接以普通文本的方式返回,因為返回的內容只是所要的網頁的源文件,節省了很多用于傳送顯示網頁中圖像的時間,速度要快了許多,但最重要的是我們可以很方便地使用自己的邏輯對凡會的源文件進行正確地分析和格式化,重新整理網頁的查詢結果。</p>
<p></p>
<p> 我們還用剛才的窗體,只是要在菜單中選擇“工程“-”部件“,在彈出的對話框中找到一項是:Microsoft Internet Transfer Control,選中后,在工具欄中您就會發現增添了一個顯示有地球和計算機的小按鈕,雙擊這個按鈕會在窗體上加入一個 Internet Transfer實例Inet1,完成了這些步驟后,窗體應如圖一所示。現在準備在實例工程中加入代碼。</p>
<p></p>
<p> Internet Transfer控件有一個事件StateChanged。這個事件的目的是當不同的操作發生時通知用戶程序。例如:控件在與網絡服務器鏈接時是一種狀態,檢索HTML是另一種狀態。當前的狀態用事件過程的State 參數來表示。在示例程序的StateChanged事件中輸入如下代碼:</p>
<p></p>
<p>Private Sub Inet1_StateChanged(ByVal State As Integer)</p>
<p></p>
<p>Select Case State</p>
<p></p>
<p>Case 12 '表明網絡連接檢索正常</p>
<p></p>
<p>stemp=Inet1.GetChunk(1024) '使用GetChunk方法從緩沖區中一次提取1024個字節的回應文本,并存放在stemp臨時變量中</p>
<p></p>
<p>While stemp<>””'當仍然返回信息時</p>
<p></p>
<p>LastResult=LastResult+stemp'將整個網頁的源文件代碼放入LastResult變量中</p>
<p></p>
<p>stemp=Inet1.GetChunk(1024)'循環</p>
<p></p>
<p>Wend</p>
<p></p>
<p>Case 11</p>
<p></p>
<p>MsgBox "未返回搜索結果"</p>
<p></p>
<p>End Select</p>
<p></p>
<p>End Sub</p>
<p></p>
<p>盡管StateChanged事件包含了這個示例程序代碼的主要部分,我們仍然需要在Command1的Click事件中加入代碼,以初始化這個請求。下面就是這段代碼:</p>
<p></p>
<p>`</p>
<p></p>
<p>Private Sub Command1_Click()</p>
<p></p>
<p>url = "http://search.chinese.yahoo.com/search/gb?p=" +Text1.Text</p>
<p></p>
<p>Inet1.protocol=icHTTP'指明控件協議類型</p>
<p></p>
<p>Inet1.Execute CStr(url),”GET /” '發出請求</p>
<p></p>
<p>While Inet1.StillExecuting</p>
<p></p>
<p>DoEvents</p>
<p></p>
<p>Wend</p>
<p></p>
<p>End Sub</p>
<p></p>
<p> 前面已經提到,以這種方法返回的信息包含了搜索的結果網頁,同直接搜索的區別就是由于這樣返回的就是源代碼,暫時存儲到一個臨時變量中,這樣一來,你既可以將返回的信息直接存儲到一個文件中,另一種方法,這就是我們下面要提到的對代碼的優化處理。</p>
<p></p>
<p> 什么叫對代碼的優化處理呢?因為返回的結果中包含許多其他沒有什么用處的修飾,比如表格、banner、menta等等信息,而這些信息并不是我們需要的,去掉這些信息,只保留對我們來說有用的結果,這就是優化。那么怎樣優化呢?分析HTML語法您就會看到,許多信息都是包含在一些關鍵詞之間。舉個例子:對于插入的圖片來說,都是用”<img src=” 來開頭,用往后遇到的第一個”>”來結尾,這樣一來就清楚了,只要把代碼中所有的滿足以上條件的語句刪掉,這樣代碼中就不會出現直接圖片信息,我們參考以下的一段代碼:</p>
<p></p>
<p>Public Function picFilter(downCode)'定義一個過濾圖片信息的過程</p>
<p></p>
<p>Dim pStart As Long, pStop As Long</p>
<p></p>
<p>Dim pString1 As String, pString2 As String</p>
<p></p>
<p>pString1 = "<img"</p>
<p></p>
<p>pString2 = ">" '分別將兩個關鍵詞定義</p>
<p></p>
<p>pStart = InStr(downCode, pString1)'找到第一個圖片信息的起始位置</p>
<p></p>
<p>If pStart <> 0 Then '如果代碼中有圖片信息的話</p>
<p></p>
<p>pStop = InStr(pStart, downCode, pString2) + 1 '從上面找的起始部位開始找到第一個用于結束圖片信息的”>”</p>
<p></p>
<p>Do While pStart <> 0 '只要仍舊有圖片信息</p>
<p></p>
<p>Mid(downCode, pStart, pStop - pStart) = Space(pStop - pStart) '將代碼中的圖片信息用空格代替,實現刪除效果</p>
<p></p>
<p>pStart = InStr(pStop, downCode, pString1)'重復上面的過程,刪除其他的圖片信息</p>
<p></p>
<p>If pStart = 0 Then Exit Do '沒有圖片信息后,退出循環</p>
<p></p>
<p>pStop = InStr(pStart, downCode, pString2, 1) + 1</p>
<p></p>
<p>Loop</p>
<p></p>
<p>picFilter=downCode '將處理過后的代碼返回過程函數</p>
<p></p>
<p>End Function</p>
<p></p>
<p>接下來只要使用</p>
<p></p>
<p>lastResult=picFilter lastResult</p>
<p></p>
<p>就實現了對臨時變量中搜索結果代碼的圖片信息去除工作,以此類推,很容易去掉諸如”<font”、”<b”等信息。</p>
<p></p>
<p> 上面所說的是一種方法,但我們知道HTML語法中關鍵詞很多,如果都用以上的條件過濾的話,會使程序的效率大大降低,運行速度也會減慢很多。有沒有更好的方法?有,如果是有心人的話,您就會發現不同的搜索引擎返回的結果有其獨特的編排方式,我們仍舊以雅虎為例,你只要察看其返回的結果源代碼就會發現:每一條信息的鏈接和主題部分排列都是以“<LI>”開始,以“<A>”結束,而在“<A>” 和接下來的第一個“<”之間的部分是該主題的簡單描述,這樣我們可以用下面的代碼來將雅虎搜索結果代碼中的有用信息提煉起來:</p>
<p></p>
<p>Public Function yahooFilter(downCode)</p>
<p></p>
<p>Dim sString1 As String, sString2 As String, sString3 As String</p>
<p></p>
<p>Dim sStart As Long, sStop As Long</p>
<p></p>
<p>Dim string1 As String, string2 As String, lastString as string</p>
<p></p>
<p>sString1 = "<LI>"</p>
<p></p>
<p>sString2 = "</A>"</p>
<p></p>
<p>sString3 = "<"</p>
<p></p>
<p>sStart = InStr(downCode, sString1)'取得第一條主題信息的起始位置</p>
<p></p>
<p>Do While sStart <> 0</p>
<p></p>
<p>sStop = InStr(sStart, downCode, sString2)</p>
<p></p>
<p>string1 = Mid(downCode, sStart + 4, sStop - sStart) '將第一條主題信息存放在string1變量中</p>
<p></p>
<p>sStart = InStr(sStop, downCode, sString1) '從第一條主題信息的結束部位開始查找該主題的簡單描述</p>
<p></p>
<p>sStart = sStop + 4</p>
<p></p>
<p>sStop = InStr(sStart, downCode, sString3) '取得該主題描述部分的結束位置</p>
<p></p>
<p>If sStop = sStart Then '判斷只有主題而沒有描述的信息</p>
<p></p>
<p>string2 = ""</p>
<p></p>
<p>ElseIf sStop <> sStart Then</p>
<p></p>
<p>string2 = Mid(downCode, sStart, sStop - sStart - 1) '取出主題描述部分</p>
<p></p>
<p>End If</p>
<p></p>
<p>lastString = lastString + "<p>" + string1 + string2 '將提煉的結果存放在臨時變量中</p>
<p></p>
<p>sStart = InStr(sStop, downCode, sString1)'重新定位下一條信息的起始位置</p>
<p></p>
<p>Loop'循環</p>
<p></p>
<p>yahooFilter = lastString'</p>
<p></p>
<p>End Function</p>
<p></p>
<p></p>
<p>經過了上面復雜的提煉,然后將提煉的結果寫到一個網頁文件中,然后調用瀏覽器顯示,會出現整整齊齊的結果,象圖二一樣:</p>
<p></p>
<p> 返回頭來我們看一下現在比較流行的搜索軟件,比如 SearchX98、Crazysearch、Inforian Quest 99,無論他們說明寫的再好,也跳不出上面所說的原理,但他們各自有自己的一些獨特之處,比如SearchX98 能夠連續搜索多個引擎,其實就是發出一條搜索指令后,程序本身連續在各個搜索引擎發出搜索指令,將返回的結果經過簡單的處理生成一個頁面,其他的內容搜索更是最簡單的直接發出搜索指令而已。而對于 Crazysearch,你只要打開注冊表,就會發現其中文搜索只能搜索中文雅虎,英文只能搜索Excite,但號稱注冊版本能夠搜索1000條記錄,其實您只要分析一下雅虎的搜索代碼就會發現,其中有一個關鍵詞是 “n=”,代表一次搜索返回的結果數目;另外一個是“b=”,代表從第幾條記錄開始顯示,就這兩個關鍵詞起到了這么重大的作用,但Crazysearch的獨特之處在于返回的搜索結果以表格方式排列,直觀醒目。最后要推薦的是Inforian Quest 99,盡管其原理也超脫不了以上的范圍(您只要打開其目錄下的site子目錄中的文件就清楚了),但我還是極力推薦,因為無論是從站點的數量,搜索范圍的廣泛,搜索的速度,結果的詳細,沒有能過超過Inforian Quset 99的,而且要差很多。當然基于對國產軟件的支持,我們還是可以對上面的兩個軟件寄予厚望。同是由于本人水平有限,難免有疏漏之處,敬請大家指正。</p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -