zoukankan      html  css  js  c++  java
  • ASP.net通过WebBrowser取得AJAX后的网页

    今天  Shih-Min 问我说,假设网页一开始是AJAX 会载入一些资料,但是透过WebClient 去抓

    抓到都是JavaScript 跟 AJAX 的原始码,有办法可以抓到AJAX 取完值之后的资料吗?!

    这需求,如果写爬虫可能也会有这需求..我的作法是这样..

    我是ASP.net 专案..

    建立一个Class 记得要加入 System.Windows.Forms


     

    这时候我建立一只 Class 叫做 WebBrowserCrawler

    using System.Threading;
    using System.Windows.Forms;
     
    namespace GetAfterAJAXPage
    {
     
     
     
        public class WebBrowserCrawler
        {
            // WebBrowser
            private WebBrowser _WebBrowder;
     
            //最后结果
            private string _Result { get; set; }
     
            //网址
            private string _Path { get; set; }
     
          
            /// <summary>
            /// 对外公开的Method
            /// </summary> www.it165.net
            /// <param name="url">URL Path</param>
            /// <returns></returns>
            public string GetReult(string url)
            {
     
                _Path = url;
     
     
                var mThread = new Thread(FatchDataToResult);
                //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);
                mThread.Start();
                mThread.Join();
     
                return _Result;
     
            }
     
            /// <summary>
            /// Call _WebBrowder 抓取资料
            /// For thread Call
            /// </summary>
            private void FatchDataToResult()
            {
                
                _WebBrowder = new WebBrowser();
     
                _WebBrowder.DocumentCompleted += _WebBrowder_DocumentCompleted;
                _WebBrowder.Navigate(_Path);
     
     
                //处理目前在讯息伫列中的所有 Windows 讯息。
                //如果在程式码中呼叫 DoEvents,您的应用程式就可以处理其他事件。例如,如果您的表单将资料加入 ListBox 并将 DoEvents 加入程式码中,则当另一个视窗拖到您的表单上时,该表单将重新绘製。
                //如果您从程式码移除 DoEvents,您的表单将不会重新绘製,直到按钮按一下的事件处理常式执行完毕。
                while (_WebBrowder.ReadyState != WebBrowserReadyState.Complete)
                {
                    Application.DoEvents();
                }
     
                _WebBrowder.Dispose();
     
            }
     
            //结束后回填
            void _WebBrowder_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                _Result = (sender as WebBrowser).Document.Body.InnerHtml;
                
            }
     
     
        }
     
     
    }

    为什要这样写 通过Thread 来叫用不然会遇到


     


     

    之后我呼叫端:
     

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


    其中我是将取得后的资料写入到sample.txt 中… 

  • 相关阅读:
    springboot springcloud zuul 过滤器
    springboot springcloud eureka 熔断器
    javaweb servlet filter
    maven nexus 搭建私服(二)
    springboot springcloud zuul 网关入门
    springboot springcloud 配置中心
    springboot springcloud eureka 入门
    java rabbitmq
    java jvm调优
    maven nexus 搭建私服(一)
  • 原文地址:https://www.cnblogs.com/wangchuang/p/3618883.html
Copyright © 2011-2022 走看看