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

原文[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

 

---

时间: 2024-07-29 05:07:56

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

asp.net中mvc使用ajax提交参数的匹配问题解决探讨

本文为大家介绍下使用javaScript解决asp.net中mvc使用ajax提交参数的匹配问题,遇到类似情况的朋友可以参考下,希望对大家有所帮助   想到在asp.net的mvc中如果使用ajax向服务端传递参数时如果参数是一个类或者是个数组(或List集合)以及更复杂的对象时,服务端总是会发 生取不到值的情况,当然网上也有很多解决的例子,但都是在服务端想办法来解决的(比如将json转换为字符串,再在服务端反序列化为一个对象),为何不能 在客户端就把这个问题搞定. 其实问题没那么复杂,那是因为

ASP.NET MVC中的AJAX应用_实用技巧

一.ASP.NET MVC中的AJAX应用 首先,在ASP.NET MVC中使用自带的ajax功能,必须要导入2个js文件(顺序不能颠倒): ASP.NET MVC提供了2个常用的ajax辅助方法. Ajax.ActionLink 该辅助方法用于在页面上生成具有ajax功能的超链接. 在该辅助方法中有一个AjaxOptions类型的参数,它包括如下属性: Confirm:在发送ajax请求前,弹出确认对话框,该属性就是设置对话框中的提示消息HttpMethod:用于设置请求的类型:Get|Pos

c# webBrowser 获取Ajax信息 .

原文:c# webBrowser 获取Ajax信息 . c#中 webbrowser控件对Ajax的执行,没有任何的响应,难于判断Ajax是否已经执行完毕,我GG了一下午,找到一个方法,介绍一下: 假如在页面中有个<div id=result></div>是通过Ajax来改变值,当webBrowser1.StatusText == "完成"后,获取一下这个div HtmlElement target = webBrowser1.Document.GetEleme

asp.net 的前台用$.ajax调用ashx返回json数据问题

问题描述 asp.net的前台用$.ajax调用ashx返回,如果把ajax的dataType改为'"text",alert(msg)显示{"id":"111","c1":"aa","c2":"bb"},dataType改为"json",alert(msg)不显示,alert(msg[0])显示{.用varobj=eval("("

ASP.NET与JQUERY的AJAX文件上传 视频课件+源码Demo

 以前的一个上传文字教程,有很多朋友反映只能在本地上传文件,传到服务器端后,上传不了,这次的Demo完全解决了上次的问题. ASP.NET与JQUERY的AJAX文件上传 视频课件+源码Demo 下面视频 如果你看不太清楚,请点击播放器的全屏按钮进行观看!     视频课件+源码Demo下载地址: ASP.NET与JQUERY的AJAX文件上传.rar

asp.net上传execl文件后,在页面上加载显示

 本篇文章主要是对asp.net上传execl文件后,在页面上加载显示(示例代码)进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助  代码如下:     #region 上传Execl文件     protected void Button1_Click(object sender, EventArgs e)     {         if (FileUpload1.HasFile)         {             string NewFileName = string.E

asp.net中利用Jquery+Ajax+Json实现无刷新分页的实例代码

 本篇文章主要是对asp.net中利用Jquery+Ajax+Json实现无刷新分页的实例代码进行了介绍,需要的朋友可以过来参考下,需要对大家有所帮助  代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="AjaxJson.aspx.cs" Inherits="AjaxJson" %> <!DOCTYPE html PUBLIC &quo

asp.net 使用模板页Master后,子页面打开新页面,获取不了返回值

问题描述 asp.net 使用模板页Master后,子页面打开新页面,获取不了返回值 内容页: var url = "SelectContractNo1.aspx?PersonId=" + ticks; var aim=window.showModalDialog(url) 返回值页面: setTimeout(function(){window.returnValue='" + aaa + "'; self.close();}, 100); aim 不能获得返回值

sqlserver-求一个asp.net 的运用jquery ajax先数据库 添加数据的实例

问题描述 求一个asp.net 的运用jquery ajax先数据库 添加数据的实例 我在做一个asp.net技术做的问卷调查页面,需要把每一项的文本都添加到sqlserver数据库,大概20个选项,每个选项平均有100个字左右 我想问一下 这么大的数据量用jquery ajax 真的可以吗? 如果可以,请各位大神做个用jquery ajax做一个向数据库添加的实例给我,要注释齐全,代码规范的,谢谢! 解决方案 ajax和普通表单提交一样,你数据量大要使用post提交,没有什么ajax不可以的.