[C#][ASP.net] 透过WebBrowser 取得AJAX 后的网页

原文[C#][ASP.net] 透过WebBrowser 取得AJAX 后的网页

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

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

 

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

我是ASP.net 专案..

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

 

2012-08-28_184816

 

这时候我建立一隻 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 来叫用不然会遇到

 

2012-08-28_185759

2012-08-28_190045

 

之后我呼叫端:

 

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

 

---

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: vb.net的webbrowser事件包括以下几种: 1. DocumentCompleted:当WebBrowser控件完成文档的加载时发生。 2. Navigating:在WebBrowser控件开始导航到新文档之前发生。 3. Navigated:在WebBrowser控件完成导航时发生。 4. ProgressChanged:在WebBrowser控件下载文档时发生。 5. NewWindow:当WebBrowser控件需要创建新窗口时发生。 6. FileDownload:在WebBrowser控件下载文件时发生。 7. DocumentTitleChanged:当WebBrowser控件的文档标题发生变化时发生。 8. StatusTextChanged:当WebBrowser控件的状态文本发生变化时发生。 以上就是vb.net的webbrowser事件。 ### 回答2: VB.NET中的WebBrowser控件是一个非常有用的工具,可以用于在应用程序中嵌入Web浏览器。WebBrowser控件可以让用户通过应用程序访问Web,从而实现在同一窗口中同时使用Web和本地应用程序功能的便利性。WebBrowser控件既可以用于WinForms应用程序,也可以用于WPF应用程序,这就使得它成为许多应用程序开发者的首选控件。 在使用WebBrowser控件时,常常需要对一些事件进行响应。下面就列举了一些常见的WebBrowser事件及其用法。 1. DocumentCompleted事件: 该事件在WebBrowser控件所加载的文档完成加载后触发,一般用户在WebBrowser控件加载完毕后再进行一些操作。 2. Navigated事件: 该事件在WebBrowser控件开始导航到新页面时触发,可以获取新页面的URL等相关信息。 3. NewWindow事件: 该事件在WebBrowser控件要打开一个新窗口时触发,可以通过该事件来阻止打开新的窗口或者手动弹出一个新窗口。 4. ProgressChanged事件: 该事件在WebBrowser控件加载文档时显示加载进度,默认情况下在地址栏中也会显示加载的进度,可以用该事件用代码获取进度。 5. BeforeNavigate2事件: 该事件在WebBrowser控件开始导航到新页面时触发,可以阻止WebBrowser控件导航到某个网址。 6. NavigateError事件: 该事件在WebBrowser控件导航到新页面失败时触发,可以检测导航失败时的错误信息。 在使用WebBrowser控件时,不同的应用场景需要对不同的事件进行响应。通过对WebBrowser事件的理解,可以更好地掌握WebBrowser控件的使用方法,让我们的应用程序更加完善和优秀。 ### 回答3: vb.net中的WebBrowser控件是一种强大的工具,可以用来在窗体上嵌入浏览器。WebBrowser控件支持多种事件,这些事件可以使用户在浏览网页时获得更好的体验,也可以让程序员通过事件来控制浏览器的行为和判断浏览器的状态。 WebBrowser控件的常用事件包括: 1. Navigating:在开始导航前发生。可以用来拦截导航请求,处理一些额外的操作,比如修改URL或者取消导航请求。 2. Navigated:在导航完成时发生。此事件仅在文档已经完成加载并呈现后才会触发。可以在此事件中获取或修改文档属性。 3. DocumentCompleted:在文档完全加载之后发生。可以在此事件中获取或修改文档属性或者执行一些脚本。 4. ProgressChanged:在浏览器下载文档时发生。可以用此事件在用户界面上显示进度条或者其他信息。 5. NewWindow:在导航请求需要在新窗口中打开时发生。可以用此事件拦截请求,将网页在当前窗口中打开或打开新窗口。 6. BeforeNavigate2:在开始导航前发生。比Navigating事件更早发生。 7. BeforeScriptExecute:在WebBrowser控件执行JavaScript脚本之前发生。可以在此事件中拦截JavaScript脚本,处理一些额外的操作。 除了以上常用事件外,WebBrowser控件还有其他事件,如TitleChanged、StatusTextChanged等。这些事件可以帮助我们更好的了解和控制WebBrowser控件的行为。通过使用WebBrowser控件的事件,我们可以开发出具有扩展性和自定义性的Web应用程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值