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 ...
随机推荐
- 取消Gridvie中button的焦点
Gridview中添加button,onclick方法使得 GridView的setOnItemClickListener方法无效. 解决方法: 设置Button的XML布局文件,也就是自定义的Ada ...
- AtCoder - 2705 Yes or No
Problem Statement You are participating in a quiz with N+M questions and Yes/No answers. It's known ...
- UVA 1514 Piece it together (二分图匹配)
[题目链接] Link [题目大意] 给你一些由一块黑块和两块白块组成的L形拼图,问你是否能够拼成给出的图 [题解] 我们将所有的黑块拆点,拆分为纵向和横向,和周围的白块连边, 如果能够得到完美匹配, ...
- [ZOJ3522]Hide and seek
题意:给一棵带边权的树,多次询问$(x,y,l)$表示如果加一条连接$x$和$y$的长为$l$的边,所有点到$x$和到$y$的最短路减少了多少 先把题目中的图放上来(雾 考虑用lct维护,先把路径提出 ...
- [Bug]CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temp
win7中安装asp.net的问题 编译器错误信息: CS0016: 未能写入输出文件问题解决办法 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地 ...
- CSS3:3D转换
几个突破口:(为了更简洁理解,先忽略兼容) 1.认识3D的坐标系 rotateX()-----------元素绕X轴旋转 rotateY() -----------元素绕Y轴旋转 rotateZ() ...
- Jmeter调用Webapi介绍
一.介绍 JMeter主要用于压力测试,使用Java编写,由Apache基金会管理 官方网站:http://jmeter.apache.org/index.html 下载地址: ...
- Mysql的共享锁和排他锁(转载)
mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流. 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能 ...
- Microsoft SQL Server 2008 R2
1概述 Microsoft SQL Server 2008 R2 提供完整的企业级技术与工具,帮助您以最低的总拥有成本获得最有价值的信息.您可以充分享受高性能,高可用性,高安全性,使用更多的高效管理与 ...
- linux下GPRS模块ppp拨号上网
---------------------------------------------------------------------------------------------------- ...