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

---

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

  1. ASP.net通过WebBrowser取得AJAX后的网页

    今天  Shih-Min 问我说,假设网页一开始是AJAX 会载入一些资料,但是透过WebClient 去抓 抓到都是JavaScript 跟 AJAX 的原始码,有办法可以抓到AJAX 取完值之后的 ...

  2. 通过WebBrowser取得AJAX后的网页

    通常情况下通过WebBrowser的文档加载完成事件DocumentCompleted中进行判断 if (_WebBrowder.ReadyState == WebBrowserReadyState. ...

  3. WebBrowser处理AJAX生成的网页内容!

    WebBrowser处理AJAX生成的网页内容! 等待网页执行完毕(AJAX执行后). 使用webBrowser1.Document.Body.OuterHtml可以获取到AJAX产生的网页内容.

  4. asp.net DropDownList无刷新ajax二级联动实现详细过程

    只适合新手制作DropDownList无刷新ajax二级联动效果: 数据库实现,添加两表如图:表1,pingpai,表2,type,具体数据库实现看自己的理解: //页面主要代码: <asp:S ...

  5. asp.net web api2.0 ajax跨域解决方案

    asp.net web api2.0 ajax跨域解决方案 Web Api的优缺点就不说了,直接说怎么跨域,我搜了一下,主要是有两种.  一,ASP.NET Web API支持JSONP,分两种 1, ...

  6. ASP.NET前台table通过Ajax获取绑定后台查询的json数据

    上一篇<ASP.NET前台html页面AJAX提交数据后台ashx页面接收数据>写了前台提交数据后台保存到数据库,数据处理以后用户肯定要查询.接下来就写一个前台table通过ajax  J ...

  7. ASP.NET MVC学习之Ajax(完结)

    一.前言 通过上面的一番学习,大家一定收获不少.但是总归会有一个结束的时候,但是这个结束也意味着新的开始. 如果你是从事ASP.NET开发,并且也使用了第三方控件,那么一定会觉得ASP.NET开发aj ...

  8. echo json数据给ajax后, 需要加上exit,防止往下执行,带上其他数据,到时ajax失败

    01返回json数据给ajax后需要加上exit.返回json数据前不能有其他输出 function apply(){ if(IS_POST){$info['status'] = 1; echo js ...

  9. ASP.NET Core 中的Ajax全局Antiforgery Token配置

    前言 本文基于官方文档 <在 ASP.NET Core 防止跨站点请求伪造 (XSRF/CSRF) 攻击>扩展另一种全局配置Antiforgery方法,适用于使用ASP.NET Core ...

随机推荐

  1. 【软件使用技巧】PL/SQL Developer实现双击table询

    二手plsql都知道,在表名默认双击[开展/关闭]. 习惯了MySql Workbench要么Sqlserver Management Studio无法适应其他管理工具. 直接在溶液: Tools - ...

  2. [Cocos2d-x]在Cocos2d-x 3.x如何通过版本号WebSocket连接server数据的传输

    WebSocket 首先新建一个空的目录,通过npm安装nodejs-websocket: npm install nodejs-websocket 新建app.js文件: var ws = requ ...

  3. 8.19! 今天我有18生日,点击阅读或顶部 尾随幸运的一天!生日知识!↓——【Badboy】

    话说得生疼.我已经想到了17那年,那是一年的时间!我在这里7.24我认为这是我的生日 结果到处宣传 ,首页疑问发现自己是错的生日 按照农历计勒把我羞辱. 不依照原农历7.24的  今天的国家今天的日历 ...

  4. VS2012 安装出错 :通道正在关闭

    从微软官网下的安装包iso,解压后安装时总是出现 3个错误,提示什么管道正在关闭,看了很多解决办法,挑了一个简单的:安装包有问题,重新下载一个,就好了(持续更新....)

  5. java假设去请求一个网页的数据

    我们能够通过在java程序中模拟浏览器一样,把数据抓下来,详细方法是在java程序中set header和cookie,以下是一个样例: public class NetConnection { pu ...

  6. SERVERCONFIG

    -- Create tablecreate table ERP_SERVERCONFIG( id NUMBER not null, servicename VARCHAR2(500), service ...

  7. cygwin的163镜像(转)

    国内的cygwin源镜像: 1.163源 http://mirrors.163.com/.help/cygwin.html 收录架构 x86 x86_64 收录版本 所有版本 更新时间 每天更新一次 ...

  8. (大数据工程师学习路径)第一步 Linux 基础入门----简单的文本处理

    介绍 这一节我们将介绍这几个命令tr(注意不是tar),col,join,paste.实际这一节是上一节关于能实现管道操作的命令的延续,所以我们依然将结合管道来熟悉这些命令的使用. 一.常用的文本处理 ...

  9. hdu4705 Y 简单树形DP 2013多校训练第十场 J题

    题意:求一棵树中不在一条链中的三个点的对数. 转化一下,用总对数减去在一条链上的三点对数即可. 考虑经过根节点,然后可能是不同的子树中各选一个:或者是子树中选一个,然后当前节点为根的子树以外的节点选一 ...

  10. RSA JS 加密解密DEMO

    <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script&g ...