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 中…
ASP.net通过WebBrowser取得AJAX后的网页的更多相关文章
- [C#][ASP.net] 透过WebBrowser 取得AJAX 后的网页
原文[C#][ASP.net] 透过WebBrowser 取得AJAX 后的网页 今天 Shih-Min 问我说,假设网页一开始是AJAX 会载入一些资料,但是透过WebClient 去抓 抓到都是J ...
- 通过WebBrowser取得AJAX后的网页
通常情况下通过WebBrowser的文档加载完成事件DocumentCompleted中进行判断 if (_WebBrowder.ReadyState == WebBrowserReadyState. ...
- WebBrowser处理AJAX生成的网页内容!
WebBrowser处理AJAX生成的网页内容! 等待网页执行完毕(AJAX执行后). 使用webBrowser1.Document.Body.OuterHtml可以获取到AJAX产生的网页内容.
- asp.net DropDownList无刷新ajax二级联动实现详细过程
只适合新手制作DropDownList无刷新ajax二级联动效果: 数据库实现,添加两表如图:表1,pingpai,表2,type,具体数据库实现看自己的理解: //页面主要代码: <asp:S ...
- asp.net web api2.0 ajax跨域解决方案
asp.net web api2.0 ajax跨域解决方案 Web Api的优缺点就不说了,直接说怎么跨域,我搜了一下,主要是有两种. 一,ASP.NET Web API支持JSONP,分两种 1, ...
- ASP.NET前台table通过Ajax获取绑定后台查询的json数据
上一篇<ASP.NET前台html页面AJAX提交数据后台ashx页面接收数据>写了前台提交数据后台保存到数据库,数据处理以后用户肯定要查询.接下来就写一个前台table通过ajax J ...
- ASP.NET MVC学习之Ajax(完结)
一.前言 通过上面的一番学习,大家一定收获不少.但是总归会有一个结束的时候,但是这个结束也意味着新的开始. 如果你是从事ASP.NET开发,并且也使用了第三方控件,那么一定会觉得ASP.NET开发aj ...
- echo json数据给ajax后, 需要加上exit,防止往下执行,带上其他数据,到时ajax失败
01返回json数据给ajax后需要加上exit.返回json数据前不能有其他输出 function apply(){ if(IS_POST){$info['status'] = 1; echo js ...
- ASP.NET Core 中的Ajax全局Antiforgery Token配置
前言 本文基于官方文档 <在 ASP.NET Core 防止跨站点请求伪造 (XSRF/CSRF) 攻击>扩展另一种全局配置Antiforgery方法,适用于使用ASP.NET Core ...
随机推荐
- Oracle SQL*Loader commit point tips
http://www.dba-oracle.com/t_sql_loader_commit_frequency.htm - Question: Can I control the commit fr ...
- 软Raid5,LVM,3T大硬盘纠缠操作的问题
新服务器,4块3T大硬盘,软Raid5 组建 加上LVM分区各种一通操作... 悲催的是经过4天的软raid rebuild,最终状态给我FAIL了,当看到raid的state[ State : cl ...
- cnblogs的代码高亮
由于不喜欢cnblogs原来的代码高亮方案,于是自己瞎搞,外加看这位大神的blog以及BZOJ的代码高亮,终于是搞出来了...讲讲怎么弄吧. 当然对于了解css的大神可以无视以下文字…… 其实就是登上 ...
- POJ 1127 Jack Straws (计算几何)
[题目链接] http://poj.org/problem?id=1127 [题目大意] 在二维平面中,给出一些木棍的左右端点,当木棍相交或者间接相交时 我们判断其连通,给出一些询问,问某两个木棍是否 ...
- 【动态规划】Gym - 101147H - Commandos
裸dp,看代码. #include<cstdio> #include<algorithm> #include<cstring> using namespace st ...
- 【暴力】bzoj3713 [PA2014]Iloczyn
没什么好说的. #include<cstdio> using namespace std; typedef long long ll; ]; int main() { scanf(]=; ...
- centos7下解决python3和python2同时存在但是无法使用pip3的问题
一.首先,官网下载python3的所需版本. wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz 想下载到那个文件夹下就先进入到 ...
- apk打包
1.在导航栏中选择Builder->Generate Signed Apk 2.新建点击Creat new... 3.注意路径后面写apk的名字(这个名字将会显示在手机软件的下方)
- javascript快速入门14--DOM基础
DOM(Document Object Model)——文档对象模型 什么是DOM? Document Object Model (DOM)是HTML和XML文档的编程接口.它提供了上述文档的一种结构 ...
- 【Hadoop】HDFS原理、元数据管理
1.HDFS原理 2.元数据管理原理