摘要:互聯網的迅速發展,使如何采集和利用Web信息越來越受關注。該文提出了基于Web的信息采集系統的設計方案,并利用.Net技術與數據庫技術,實現了對特定網站信息的采集與處理。
關鍵詞:信息檢索;正則表達式;ADO.NET
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)16-21263-02
Design and Implementation of Information Collection System Based on Web
ZHAO Xiao-feng
(Department of Information Engineering,Wuxi Institute of Commerce,Wuxi 214153,China)
Abstract: With the rapid development of Internet, collecting and exploiting Web information is extensively addressed. This paper aims at implementing the collection and processing of the particular website, using .Net technology and database technology on the ground of scheme of web information collection.
Key words:information retrieval;regular expression;ADO.NET
1 引言
隨著WWW的發展,搜索引擎所提供的搜索和導航服務已經成為互聯網上非常重要的網絡服務,它的特點是能夠幫助我們很快找到所需的網站或資料。而某些情況下,我們瀏覽網站時關注的是幾個特定網站上的一類信息與數據,需要綜合這類信息進行數據挖掘,來進一步分析和使用;或者只是想從幾個網站上采集特定的信息,并在進行分類和統一格式后,存入本地數據庫,在自己網站上發布,從而提高信息及時性,減少工作量。
本文討論利用.Net技術、數據庫技術,設計Web網站信息的采集系統,并以某人才網站招聘信息的采集為例,說明實現過程。
2 信息采集系統的設計
2.1 采集系統設計的思路
首先,要采集指定網站的信息,必須了解信息的瀏覽方式,并記錄相應的訪問路徑。大多數網站采用動態網頁技術(ASP、PHP等)構建,通過參數傳遞來檢索數據庫,輸出對應信息的。例如人才招聘網的通常以單位名稱作為信息的起點鏈接,打開對應的網頁后,獲得單位具體招聘崗位鏈接,才能獲得詳細的招聘信息。
第二,采集所獲的信息必須存入本地數據庫,需要對幾個目標網站上的信息進行比較與分析,得到統一的數據模型,并設計相應的數據表,便于將來對不同網站采集來的信息統一進行結構化。
第三,考慮到可能會對網站進行多次采集,要避免重復的信息存入自己的數據庫內,同時重復處理已經存在的信息也會降低采集系統的工作效率。因此可以在記錄每條信息的同時,記錄其對應的URL或相關ID,便于驗證鏈接是否已經訪問過。
2.2 相關的技術
1)請求/響應模型
Web 應用是基于HTTP協議的客戶端/服務器請求響應機制的信息交換,當我們在瀏覽器輸入一個網址,需要經過建立連接、發送請求、發送響應、關閉連接4個步驟,才能獲得網頁信息。
在.Net框架的命名空間System.Net中提供了兩個類WebRequest和WebResponse,分別用來發送客戶端請求和獲取服務器返回的響應。
2)正則表達式
正則表達式提供了功能強大、靈活而又高效的方法來處理文本。正則表達式的模式匹配可以快速地分析大量的文本以找到特定的字符模式;提取、編輯、替換或刪除文本子字符串;或將提取的字符串添加到集合。
在.Net的命名空間System.Text.RegularExpressions提供Regex類構建正則表達式,同時還提供了相應的方法完成對字符串的匹配和過濾。
3)ADO.Net
采集系統得到的數據最終都要存入本地數據庫,在.NET框架中提供了數據庫訪問技術ADO.NET。它屏蔽了各類數據源之間的差異,以統一的接口進行訪問,由一組訪問各類數據源的類構成。為提高訪問效率,還為SQL Server提供了專用類,SqlConnection、SqlCommand、SqlDataReader、Dataset、SqlDataAdapter等,完成對SQL Server數據庫的訪問與數據處理。
2.3 算法描述
要完成信息的采集,首先要能夠在頁面中過濾出我們所需要的鏈接起點,然后系統模擬人工點擊流程來讀取信息。
1)根據訪問路徑創建一個C#自帶的REGEX類的對象,該類是用來進行正則表達式的匹配文本類。
2)通過WebRequest發送請求,WebResponse接取返回的響應,再通過StreamReader讀取返回的響應,形成包含網頁所有源碼的字符串。
3)對該字符串用正則表達式進行匹配,得到MatchCollection集合,存放了所有我們需要進一步讀取的目標鏈接。
4)遍歷集合的成員,訪問成員鏈接所指向的頁面,由StreamReader讀取信息后,使用正則表達式提取頁面信息。如果該頁是訪問路徑的終點,讀取相應的信息后,結構化所有數據存入數據庫;若只是獲取下一級鏈接,則轉1)。
3 人才招聘信息采集系統的實現
1)讀取招聘單位列表信息
打開web_url指定的網站頁面,并通過StreamReader對象讀取網頁源代碼存入字符串all_code中,便于正則表達式提取。
HttpWebRequest all_codeRequest = (HttpWebRequest)WebRequest.Create(web_url);
WebResponse all_codeResponse = all_codeRequest.GetResponse();
StreamReader the_Reader = new StreamReader(all_codeResponse.GetResponseStream(), System.Text.Encoding.Default);
string all_code = the_Reader.ReadToEnd();
the_Reader.Close();
2)提取招聘單位的超鏈列表
創建表達式字符串p,用它創建正則表達式對象re,并使用re.Matches方法返回all_code字符串所有匹配的超鏈集合hy。
string p = @\".+\";
Regex re = new Regex(p, RegexOptions.IgnoreCase);
MatchCollection hy = re.Matches(all_code);
for (int i = 0; i < hy.Count; i++)
{
….//讀取單位信息
…//獲得每個招聘單位發布的崗位鏈接集合gw
for(int j=0;j { …//使用正則表達式過濾,讀取崗位招聘人數、有效時間、學歷要求等 …//信息存入本地數據庫相關表中} } 3)信息存入本地數據庫 為將信息存入本地數據庫對應的表,在SQL Server中設計了一個存儲過程InsertJobs,用來解決相應的數據插入問題。其中webid中存放ID是目標網站用于區分崗位的標識,InsertJobs根據其檢查該崗位是否需要插入數據庫,保證數據不重復。 SqlCommand cmd = new SqlCommand(\"InsertJobs\", con); cmd.CommandType = CommandType.StoredProcedure; try { cmd.Parameters.AddWithValue(\"@companyname\", companyname); ……//招聘崗位信息 cmd.Parameters.Add(\"@webid\", SqlDbType.BigInt, 8); //記錄崗位ID cmd.Parameters[\"@webid\"].Value = Convert.ToInt64(jid); cmd.ExecuteNonQuery(); } catch (Exception){continue;} 4 結束語 利用該設計方案,我們成功地對某人才網的信息進行了采集;其實,只需適當修改,就可用于采集其他特定網站的信息。由于針對特定的網站進行信息采集,并不需要像搜索爬蟲一樣對整個網站進行掃描,所以采集的速度比較快。要避免再次采集時對已采集信息的重復提取,可以在數據庫中存放已掃描的鏈接,在2.3算法第4步讀取超鏈內容前進行判斷,則可以提高再次采集時的工作效率。 參考文獻: [1] 張帆,李琳娜,楊炳儒.基于Web的智能信息采集及處理系統設計與實現[J].計算機工程,2007,33(18). [2] 徐遠超,劉江華,劉麗珍,等.基于Web的網絡爬蟲的設計與實現[J].微計算機信息,2007(21). [3] 呂鐵強,于滿泉,孟慶發.基于網頁分塊的個性化信息采集的研究與設計[J].微電子學與計算機,2005,22(10).