1 引言
隨著WWW的發展,搜尋引擎所提供的搜尋和導航服務已經成為互連網上非常重要的網路服務,它的特點是能夠協助我們很快找到所需的網站或資料。而某些情況下,我們瀏覽網站時關注的是幾個特定網站上的一類資訊與資料,需要綜合這類資訊進行資料採礦,來進一步分析和使用;或者只是想從幾個網站上採集特定的資訊,並在進行分類和統一格式後,存入本機資料庫,在自己網站上發布,從而提高資訊及時性,減少工作量。
本文討論利用.Net技術、資料庫技術,設計Web網站資訊的採集系統,並以某人才網站招聘資訊的採集為例,說明實現過程。
2 資訊採集系統的設計
2.1 採集系統設計的思路
首先,要採集指定網站的資訊,必須瞭解資訊的瀏覽方式,並記錄相應的訪問路徑。大多數網站採用動態網頁技術(ASP、PHP等)構建,通過參數傳遞來檢索資料庫,輸出對應資訊的。例如人才招聘網的通常以單位名稱作為資訊的起點連結,開啟對應的網頁後,獲得單位具體招聘崗位連結,才能獲得詳細的招聘資訊。
第二,採集所獲的資訊必須存入本機資料庫,需要對幾個目標網站上的資訊進行比較與分析,得到統一的資料模型,並設計相應的資料表,便於將來對不同網站採集來的資訊統一進行結構化。
第三,考慮到可能會對網站進行多次採集,要避免重複的資訊存入自己的資料庫內,同時重複處理已經存在的資訊也會降低採集系統的工作效率。因此可以在記錄每條資訊的同時,記錄其對應的URL或相關ID,便於驗證鏈結接是否已經訪問過。
2.2 相關的技術
1)請求/響應模型
Web 應用程式是基於HTTP協議的用戶端/伺服器請求響應機制的資訊交換,當我們在瀏覽器輸入一個網址,需要經過建立串連、發送請求、發送響應、關閉串連4個步驟,才能獲得網頁資訊。
在.Net架構的命名空間System.Net中提供了兩個類WebRequest和WebResponse,分別用來發送用戶端請求和擷取伺服器返回的響應。
2)Regex
Regex提供了功能強大、靈活而又高效的方法來處理文本。Regex的模式比對可以快速地分析大量的文本以找到特定的字元模式;提取、編輯、替換或刪除文本子字串;或將提取的字串添加到集合。
在.Net的命名空間System.Text.RegularExpressions提供Regex類構建Regex,同時還提供了相應的方法完成對字串的匹配和過濾。
3)ADO.Net
採集系統得到的資料最終都要存入本機資料庫,在.NET架構中提供了資料庫訪問技術ADO.NET。它屏蔽了各類資料來源之間的差異,以統一的介面進行訪問,由一組訪問各類資料來源的類構成。為提高訪問效率,還為SQL Server提供了專用類,SqlConnection、SqlCommand、SqlDataReader、Dataset、SqlDataAdapter等,完成對SQL Server資料庫的訪問與資料處理。
2.3 演算法描述
要完成資訊的採集,首先要能夠在頁面中過濾出我們所需要的連結起點,然後系統類比人工點擊流程來讀取資訊。
1)根據訪問路徑建立一個C#內建的REGEX類的對象,該類是用來進行Regex的匹配文本類。
2)通過WebRequest發送請求,WebResponse接取返回的響應,再通過StreamReader讀取返回的響應,形成包含網頁所有源碼的字串。
3)對該字串用Regex進行匹配,得到MatchCollection集合,存放了所有我們需要進一步讀取的目標連結。
4)遍曆集合的成員,訪問成員連結所指向的頁面,由StreamReader讀取資訊後,使用Regex提取頁面資訊。如果該頁是訪問路徑的終點,讀取相應的資訊後,結構化所有資料存入資料庫;若只是擷取下一級連結,則轉1)。
3 人才招聘資訊採集系統的實現
1)讀取招聘單位列表資訊
開啟web_url指定的網站頁面,並通過StreamReader對象讀取網頁原始碼存入字串all_code中,便於Regex提取。
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,用它建立Regex對象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 { …//使用Regex過濾,讀取崗位招聘人數、有效時間、學曆要求等
…//資訊存入本機資料庫相關表中}
}
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步讀取超鏈內容前進行判斷,則可以提高再次採集時的工作效率。