摘要:本文主要對當今較為流行的網絡編程技術網絡蜘蛛(web spider),結合校園網站實際環境進行一次嘗試與研究。使用C#語言進行設計與開發,在實際開發設計中通過解決其各類難題,進一步掌握其設計難點與要領,并對該技術有了進一步了解。
關鍵詞:網絡蜘蛛(web spider) 校園門戶 多線程
中圖分類號:P209 文獻標識碼:A文章編號:1674-098X(2012)3(c)-0000-00
在互聯網高速發展的今天,互聯網已經走進了千家萬戶,網絡上充斥著各種信息。如何高效、準確的獲取我們所需要的信息,成為我們越來越關心的問題。搜索引擎是解決這一問題的主要方法。搜索引擎通過一定的策略在網絡中搜集信息,并完成對信息的提取和組織工作,最終為用戶提供信息信息檢索服務。搜索引擎主要包含三部分功能,信息采集、信息分類、信息檢索。其中信息采集又叫網絡蜘蛛(web Spider),主要用來獲取網絡上的信息內容。搜索引擎中的所有數據都是通過它來獲得的。
在校園門戶網站中也會用到網絡蜘蛛技術。與搜素引擎不同,校園門戶網站中的網絡蜘蛛所選取信息的范圍僅限定在本局域網內部。信息量相對較少。通過網絡爬蟲技術,學校門戶網站可以實現網絡動態監視,對網絡中的不良信息進行及時篩查。也可以建立學校內部的網絡智能搜索引擎,或是校內網絡雷達。而這些都要依靠校園門戶網站的網絡蜘蛛技術。
1 網絡蜘蛛的搜索策略及c#開發環境介紹
1.1 通用的網絡蜘蛛爬行策略主要有兩種方式:
(1)深度優先策略:深度優先就是只考慮連接的層次關系,將鏈接看成樹形結構,深度優先搜索就是先訪問鏈接的一個分支,在回到鏈接樹的根節點訪問另一個分支。這種方式有點在于容易設計以及可以及時搜索到某個鏈接下足夠深度的鏈接,缺點是個別層次較高的鏈接不能夠及時被訪問,甚至訪問不到,信息更新不及時。
(2)寬度優先策略:寬度優先就是以接近起始點的程度依次擴展節點的逐層搜索,在對下一層的任意節點進行搜索之前,必須完成本層的所有節點。此方法實現相對簡單,缺點在于隨著抓取頁面逐漸增多,大量的無關頁面被下載,使得算法的效率變低。優點在于搜索的頁面質量較高。信息相對完整。
目前網絡蜘蛛技術中通常采用寬度優先策略,從一個局部中盡可能得到多的頁面。多數搜索引擎都采用寬度搜索技術,主要解決數據采集的及時性,和完整性問題。但信息采集量不能太多,否則將會影響采集效率。
1.2 C#開發環境
C#是微軟發布的開發平臺.NET中的旗艦,是一種優秀的編程語言,c#2.0開發環境中集成了多線程并發訪問及http頁面抓取技術。因此使我們網頁爬蟲技術可以使用c#語言進行開發。需要使用到System.Threading包,和System.Net包。
2 設計與實現
2.1 網絡蜘蛛工作流程
首次運行蜘蛛程序需要根據起始網頁,分析頁面的源文件,將頁面路徑(URL)放入隊列,把已處理過的頁面放入已完成隊列中。而后工作線程從待提取隊列中提取出新的URL進行分析。依次循環。
若系統不是首次運行,系統不用指定起始頁面,只需讀取保存在文本中的信息,然后繼續上次提取操作,從待抓取列表中取出連接繼續執行。
2.2 網頁消重
網絡爬蟲的爬行策略中的寬度優先策略是目前普遍采取的一種網頁檢索策略,優點是頁面檢索質量較高,但其弊端就是頁面重復檢索較多。如果信息檢索范圍加大,將嚴重影響信息的檢索效率。重復的頁面不僅浪費時間,而且會擠占磁盤空間。
目前較為流行的做法是使用布隆過濾器的方法來對網頁鏈接進行消重。在網絡蜘蛛系統中,一個地址是否被訪問過,最直接的方法就是將集合中全部的元素存在計算機中,當進入一個新元素時,將它與其他元素進行比較,優點是十分準確,缺點是時間較長。布隆過濾器一般用于大數據量的集合中判斷元素是否存在,其核心思想就是使用一個hash函數將一個url地址映射到位圖數組中某一位,如果該位已經存在則為1,表示該url已被占。
哈希算法如下:
private void CreateHashes(string str)
{
int hash1 = str.GetHashCode();
int hash2 = HashString(str);
hashKeys[0] = Math.Abs(hash1 % hashbits.Count);
if (numKeys > 1)
{
for (int i = 1; i < numKeys; i++)
{
hashKeys[i] = Math.Abs((hash1 + (i * hash2))
% hashbits.Count);
}
}
}
2.3 html解析
Html解析器是用來分析蜘蛛程序遇到的每一個頁面,提取其中的鏈接信息,是頁面下載的前提。解析器的作用是識別HTML語言的各種標記。具體代碼如下:
public string GetPageSource(string url)
{
Uri uri = new Uri(url);
HttpWebRequest MyReq = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse MyRes = (HttpWebResponse)MyReq.GetResponse();
MyReq.Method = \"Post\";
MyReq.KeepAlive = 1;
StreamReader reader = new StreamReader(MyRes.GetResponseStream(), System.Text.Encoding.GetEncoding(\"GB2312\"));
return reader.ReadToEnd();
}
上述代碼的主要作用是獲取頁面的HTML代碼,并將其轉化成字符串輸出。
2.4 多線程
多線程技術主要作用是同時開動多個線程一起工作,共同采集網絡中的數據信息。提高信息采集的效率。多線程的工作問題的難點就是線程結束是很難判斷。因為它總是在查找新的鏈接,因此系統容易進入死循環狀態。解決方法如下所示:
string url = \"\";
int times = 0;
while ( url == \"\" ) //要是沒有找到符合條件的記錄,則不斷地尋覓符合條件的記錄
{
url = getUrl.GetAUrl( …… ); //調用GetAUrl方法,試圖得到一個url值
if ( url == \"\" ) //要是沒有找到
{
times ++;//嘗試次數自增
continue; //進行下一次嘗試
}
if ( times > N ) //要是已經嘗試夠了次數,則退出進程
{
downloadThread[i].Abort; //退出進程
}
else//如果沒有嘗試夠次數
{
Times = 0; //嘗試次數歸零處理
}
//進行下一步針對得到的Url的處理
}
3 結語
本文主要真對在校園網站中建設網絡蜘蛛系統,原理結構均相對簡單,沒有涉及到信息分類檢索等問題。因此只對網絡爬蟲技術的檢索效率等問題進行了研究,該系統還有很多方面存在進一步研究與探討的空間,如在動態網站的圖片獲取,多線程的重復采集等問題上還有很多地方需要繼續研究。
參考文獻
[1] 李曉明,閆宏飛,王建民 搜索引擎_原理 技術與系統[M] 北京科學出版社,2004.
[2] 李剛,盧炎生 教育網 BBS 搜索引擎設計與實現[J] 微計算機信息,2006(6).