[C#][ASP.net] 透過WebBrowser 取得AJAX 後的網頁

來源:互聯網
上載者:User

標籤:des   blog   http   java   使用   width   

原文[C#][ASP.net] 透過WebBrowser 取得AJAX 後的網頁

今天 Shih-Min 問我說,假設網頁一開始是AJAX 會載入一些資料,但是透過WebClient 去抓

抓到都是JavaScript 跟 AJAX 的原始碼,有辦法可以抓到AJAX 取完值之後的資料嗎?!

 

這需求,如果寫爬蟲可能也會有這需求..我的作法是這樣..

我是ASP.net 專案..

建立一個Class 記得要加入 System.Windows.Forms

 

 

這時候我建立一隻 Class 叫做 WebBrowserCrawler

 

 

using System.Threading2
using System.Windows.Forms2

namespace GetAfterAJAXPage
{



    public class WebBrowserCrawler
    {
        // WebBrowser
        private WebBrowser _WebBrowder2

        //最後結果
        private string _Result { get2 set2 }

        //網址
        private string _Path { get2 set2 }

      
        /// &lt2summary&gt2
        /// 對外公開的Method
        /// &lt2/summary&gt2
        /// &lt2param name="url"&gt2URL Path&lt2/param&gt2
        /// &lt2returns&gt2&lt2/returns&gt2
        public string GetReult(string url)
        {

            _Path = url2


            var mThread = new Thread(FatchDataToResult)2
            //Apartment 是處理序當中讓物件共用相同執行緒存取需求的邏輯容器。 同一 Apartment 內的所有物件都能收到 Apartment 內任何執行緒所發出的呼叫。 
            //.NET Framework 並不使用 Apartment;Managed 物件必須自行以安全執行緒 (Thread-Safe) 的方式運用一切共用資源。
            //因為 COM 類別使用 Apartment,所以 Common Language Runtime 在 COM Interop 的狀況下呼叫出 COM 物件時必須建立 Apartment 並且加以初始化。 
            //Managed 執行緒可以建立並且輸入只容許一個執行緒的單一執行緒 Apartment (STA),或者含有一個以上執行緒的多執行緒 Apartment (MTA)。 
            //只要把執行緒的 ApartmentState 屬性設定為其中一個 ApartmentState 列舉型別 (Enumeration),即可控制所建立的 Apartment 屬於哪種型別。 
            //因為特定執行緒一次只能初始化一個 COM Apartment,所以第一次呼叫 Unmanaged 程式碼之後就無法再變更 Apartment 型別。
            //From : http://msdn.microsoft.com/zh-tw/library/system.threading.apartmentstate.aspx
            mThread.SetApartmentState(ApartmentState.STA)2
            mThread.Start()2
            mThread.Join()2

            return _Result2

        }

        /// &lt2summary&gt2
        /// Call _WebBrowder 抓取資料
        /// For thread Call
        /// &lt2/summary&gt2
        private void FatchDataToResult()
        {
            
            _WebBrowder = new WebBrowser()2

            _WebBrowder.DocumentCompleted += _WebBrowder_DocumentCompleted2
            _WebBrowder.Navigate(_Path)2


            //處理目前在訊息佇列中的所有 Windows 訊息。
            //如果在程式碼中呼叫 DoEvents,您的應用程式就可以處理其他事件。例如,如果您的表單將資料加入 ListBox 並將 DoEvents 加入程式碼中,則當另一個視窗拖到您的表單上時,該表單將重新繪製。
            //如果您從程式碼移除 DoEvents,您的表單將不會重新繪製,直到按鈕按一下的事件處理常式執行完畢。
            while (_WebBrowder.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents()2
            }

            _WebBrowder.Dispose()2

        }

        //結束後回填
        void _WebBrowder_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            _Result = (sender as WebBrowser).Document.Body.InnerHtml2
            
        }


    }


}

 

為什要這樣寫 透過Thread 來叫用不然會遇到

 

 

之後我呼叫端:

 

WebBrowserCrawler  webBrowserCrawler=new WebBrowserCrawler()2
          File.WriteAllText(Server.MapPath("sample.txt"),webBrowserCrawler.GetReult(http://www.in2.cc/sample/waterfalllab.htm))2

 

其中我是將取得後的資料寫入到sample.txt 中&hellip2

 

其中測試網頁為http://www.in2.cc/sample/waterfalllab.htm

請注意 測試網頁為輔導級 請12歲以下兒童,請找父母陪同觀看

如果透過 WebClient 去取 只會看到 單純 Javascript call Ajax 程式碼,但是透過 此方法 取到資料

會是 他呼叫完 AJAX 後的資料,不過當然,是指說網頁開始就會呼叫的AJAX &hellip2

 

不過這並非百分之百,這會跟AJAX 的寫法有關&hellip2

 

---

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.