整理一下最近做的幾個項目。總結幾個用到的知識點和關鍵部分代碼,以供大家學習交流。
1、爬蟲抓取網頁內容信息。可以用System.Net.WebRequest、webclient等類來處理。
2、對於某些動態網頁,生成頁面信心由javascript動態生成鏈接信息的。也可以進行分析傳值的方式,在post的時候將參數帶進去(大多數網站的參數是有規則的)。實在不行也可以使用webbrowser控件,模擬點擊。或傳值。
以http://www.aslan.com.cn/Code.aspx網站為例。
部分代碼如下:
//使用webbrowser訪問指定網頁。address為網頁地址
private void Navigate(WebBrowser web,String address)
{
if (String.IsNullOrEmpty(address)) return;
if (address.Equals("about:blank")) return;
if (!address.StartsWith("http://")) address = "http://" + address;
try
{
web.Navigate(new Uri(address));
}
catch (System.UriFormatException)
{
return;
}
}
由於要抓取網頁內容及在加載完畢后提交參數所以需要驗證加載完畢即DocumentCompleted。而在實際使用過程當中,發現在一個頁面的加載過程中可能會有多次DocumentCompleted,所以在這里采用+1、-1的方式來判斷是否加載完畢。
首先在formload中綁定網頁加載完畢事件。
並且定義標示count
然后在每次導航后給標示+1
在每次DocumentCompleted中給count-1,最后當count=0時即表示頁面加載完畢。可以進行對頁面信息的處理等操作了。
private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { count = count - 1; string eventTarget = "dg_Code$ctl24$ctl"; if (0 == count && isComplete == false && j<=10) { eventTarget = eventTarget + getPage(j); if (!isLastPage(webBrowser1)) { InvokeScriptMethod(webBrowser1, eventTarget, ""); } else { MessageBox.Show("抓取完畢"); } postComplete = true; j++; } else if (postComplete == true) { dealWithByDOM(webBrowser1); postComplete = false; } else if (0 == count && isComplete) { System.Windows.Forms.HtmlDocument htdoc = webBrowser1.Document; for (int i = 0; i < htdoc.All.Count; i++) { if (htdoc.All[i].Name == "btn_search") { htdoc.All[i].InvokeMember("click");//引發”CLICK”事件 isComplete = false; break; } } } }
剩下的就是對html的分析,如何在茫茫多的html代碼中找到我們需要的信息呢?在這里我是通過HtmlAgilityPack類來處理html內容提取的。
其中HtimlAgilityPack類是codeplex上的提供的一個類,下載地址http://htmlagilitypack.codeplex.com/用來處理html文件還是非常不錯的(個人感覺挺好用)
以上就是該程序的部分實現代碼。最后效果圖如下:(不過不到萬不得已最好不要使用webbrowser的方式做爬蟲,它的速度太慢了,我要抓取的信息只有286頁,可是花了我將近10分鍾的時間)
下面是程序運行效果圖:(為了展示方便,左邊為webBrowser控件導航到目標網站的結果,右邊dataGridview為抓取后經過提取的所需信息。)