程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 巧用C#webbrowser以及Application.DoEvents()實現采集動態網頁的爬蟲機器人

巧用C#webbrowser以及Application.DoEvents()實現采集動態網頁的爬蟲機器人

編輯:C#入門知識

從事網絡數據抓取采集從本科畢設算起已有一年多的時間,最開始是針對靜態網頁,寫正則表達式,從網絡上抓取信息。但是隨著工作的深入,
發現很多網頁單單用正則表達式並不能完成抓取工作,比如很多網頁的下一頁鏈接是由JavaScript函數生成的比如
<li><a href="#" onclick="javascript:gotoPage(2)">2</a></li>這樣的網頁,即便你用正則表達式,提取到了href也無法獲得下一頁鏈接。
另外 如果url中還有“#”字段的,用httpresponse,httprequest獲取的網頁源碼流與你在浏覽器中所看到的頁面視圖也是不同的,因此單單用正則表達式,則處理起還有js腳本的動態網頁就顯得力不從心了。
怎麼辦?

可以采用DOM+正則+浏覽器組件來解決上面的問題。

DOM (Document Object Model),是一個接口標准,該接口是將html網頁解析成為樹的格式,關於DOM的教程,請見:http://www.w3.org/DOM/  雖然上面講的是JavaScript的 DOM 接口函數,但是由於DOM是一個接口標准,其他語言實現的DOM接口也是大同小異的。

正則表達式:在完成文本匹配方面有著不可或缺的作用,這個powerful的工具,DOM是無法取代的。

浏覽器組件: 包含解釋JS語句的功能,有了浏覽器組件的幫忙,我們的工作會更加省力(另外:園子裡有網友建議什麼Xpath,webrequest等等,沒有用過,如果有人在這方面比較熟悉不妨交流下)

本功能采用VS2008 C# Winform 平台

在此平台下調用正則要在程序的頭部加入聲明:

using System.Text.RegularExpressions;

調用DOM組件,需要在工程的引用中加入Microsoft.mshtml

浏覽器組件用的是webbrowser

 

首先我們要在程序中構造一個簡單的浏覽器,要有一個combobox列表框(顯示當前網頁的URL),前進和後退按鈕,控制浏覽器刷新視圖 實現代碼如下:

 

\\程序中實現簡易浏覽器的前進和後退功能  private void btnGo_Click(object sender, EventArgs e)
        {
            string url = comboBox1.Text.Trim();

            webBrowser1.Navigate(url);
        }

 private void btnBack_Click(object sender, EventArgs e)
        {
            webBrowser1.GoBack();
        }

 

光有前進和後退還不夠,我們希望當浏覽器視圖刷新後,combobox裡面的URL也跟著刷新,所以要再給浏覽器添加一個Navigated事件,更新combobox顯示的文本。代碼如下:

 

 private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            comboBox1.Text = webBrowser1.Url.ToString();
        }

 

 這還不夠,當你實現上述代碼時你會發現,你點擊webbrowser裡面的鏈接時,會在本地IE中顯示新網頁,所以我們還需要添加一個NewWindow事件代碼如下

 

\\webbrowser NewWindow private void webBrowser1_NewWindow(object sender, CancelEventArgs e)
        {
            e.Cancel = true;
            if (webBrowser1.Document.ActiveElement != null)
            {
                webBrowser1.Navigate(webBrowser1.Document.ActiveElement.GetAttribute("
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved