最近有个小程序需要采集网页源代码,但有的网页中JS脚本又会生成额外的代码,比如http://www.cnblogs.com/lidabo/p/4169396.html

红框部分便是另外加载的代码。

此处可以看到web前端是有 "操作系统" 几个字的,但查看网页源代码之后却搜不到这几个字

C#有个webbrowser控件可以等网页加载完之后获取浏览器上所有的网页源代码(也包括额外被JS加载进来的代码)

【第一次】试验

WebBrowser webBrowser1 = new WebBrowser();

private void button1_Click(object sender, EventArgs e)
{

  webBrowser1.Navigate("http://www.cnblogs.com/lidabo/p/4169396.html");

  //加载完毕后触发事件webBrowser1_DocumentCompleted
  webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

}

private void webBrowser1_DocumentCompleted(object sender, EventArgs e)//这个就是当网页载入完毕后要进行的操作
{

  //将webBrowser显示的代码传入richTextBox以便调试

  richTextBox1.Text = webBrowser1.DocumentText;

}

结果:webbrowser加载完这个页面之后,richTextBox1.Text获取的代码里面找不到  "操作系统"  几个字 , 获取的代码有1063行

网页在加载的过程中,webBrowser1_DocumentCompleted可能会触发一次以上,且相同网页可能触发次数不尽相同

有的网页会多次触发webBrowser1_DocumentCompleted,腾讯网http://www.qq.com触发了4次

【第二次】试验

public int i;//设置全局变量i

private void webBrowser1_DocumentCompleted(object sender, EventArgs e)
{

  i++;//以便观察这个事件被触发了多少次

  richTextBox1.Text = webBrowser1.DocumentText;

}

结果:最后  i  的值为 1,richTextBox1.Text获取的代码里面依然找不到  "操作系统"  几个字 , 获取的代码有1063行

按理来说不应该只触发一次、

【第三次】试验

private void webBrowser1_DocumentCompleted(object sender, EventArgs e)
{

  MessageBox.Show("111");//这个得迅速点掉确定才看到触发了多少次messagebox

  richTextBox1.Text = webBrowser1.DocumentText;

}

结果:迅速点掉messagebox的“确定”后又出现了一次messagebox,即一共两次触发了webBrowser1_DocumentCompleted事件

实验触发二次webBrowser1_DocumentCompleted事件,里面可以找到"操作系统"几个字,代码共有2095行,这次应该全部获取完毕了

加入没有迅速点掉messagebox,可能这个等待过程中,网页可能被webbrowser真的完全加载完毕从而不再触发webBrowser1_DocumentCompleted事件

为什么

【第二次】实验只触发一次webBrowser1_DocumentCompleted事件,而且获取的代码还不完全

【第三次】实验加入了messagebox(然后迅速点掉)能触发一次以上的webBrowser1_DocumentCompleted事件,获取代码完全

【第三次】实验加入了messagebox(没有迅速点掉)只能触发一次webBrowser1_DocumentCompleted事件,获取代码完全

我没弄明白

***********************************************************************************************************

那么换个思路。在第一次进入webBrowser1_DocumentCompleted事件之时开启一个timer时钟,间隔5秒,5秒之后获取一次webbrowser的代码

只触发一次时钟时间,由于时钟是另外的线程,要调用webbrowser需要用到委托

//实例化timer

System.Timers.Timer t = new System.Timers.Timer();

//定义委托变量
public happy updateTxt_ok;

public delegate void happy();

public Form1()
{
  InitializeComponent();

  //设定timer
  t.Interval = 5000; //定时,单位ms
  t.Enabled = true; //回调函数允许执行
  t.AutoReset = false; //回调函数循环执行
  t.Elapsed += new System.Timers.ElapsedEventHandler(theout); //到达时间的时候执行事件; 
  t.Stop();
}

private void Form1_Load(object sender, EventArgs e)
{
  updateTxt_ok = new happy(UpdateTxtMethod);
}

//委托执行函数

public void UpdateTxtMethod()
{

  //此处不用DocumentText是因为它获取中文可能产生乱码
  Encoding encoding = Encoding.GetEncoding(webBrowser1.Document.Encoding);
  StreamReader stream = new StreamReader(webBrowser1.DocumentStream, encoding);
  string aa = stream.ReadToEnd();

  richTextBox1.Text = aa;
  stream.Close();

}

//timer事件

public void theout(object source, System.Timers.ElapsedEventArgs e)
{
  this.BeginInvoke(updateTxt_ok);//委托执行updateTxt_ok
}

//按下按钮

private void button1_Click(object sender, EventArgs e)
{

  webBrowser1.Navigate(richTextBox1.Text);
  webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

}

private void webBrowser1_DocumentCompleted(object sender, EventArgs e)//这个就是当网页载入完毕后要进行的操作
{
  t.start();//开启时钟
}

结果:获取完整源代码,共有2095行

但不能保证其他网页也是延迟5秒就能加载完,有的服务器很卡,需要调整时间

c#如何判断webbrowser已经加载完毕的更多相关文章

  1. Js判断CSS文件加载完毕的实例教程

    要判断这个 CSS 文件是否加载完毕,各个浏览器的做法差异比较大,这次要说IE浏览器做的不错,我们可以直接通过onload方法来处理CSS加载完成以后的处理: 代码如下 复制代码 // 代码节选至se ...

  2. 【转】JS判断SWF,JPG加载完毕、兼容(Activex,plugIn)所有浏览器

    JS判断SWF,JPG加载完毕.兼容(Activex,plugIn)所有浏览器 这里主要说下监听SWF的加载. 网上流传已久的监听方法,只能在IE(Activex插件下)下实现.在使用plugin的浏 ...

  3. axios(封装使用、拦截特定请求、判断所有请求加载完毕)

    博客地址:https://ainyi.com/71 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 Node.js 中使用 vue2.0之后,就不再对 vue-resource 更新 ...

  4. js 判断iframe是否加载完毕

      js 判断iframe是否加载完毕 CreationTime--2018年9月13日15点30分 Author:Marydon 1.javascript实现 window.onload = fun ...

  5. jQuery load() 判断 iframe 是否加载完毕

    判断 iframe 是否加载完毕  方法.jQuery load() var frm = document.getElementById('myiframe'); $(frm).load(functi ...

  6. js判断网页是否加载完毕 包括图片

    <script type="text/javascript" language="JavaScript"> //: 判断网页是否加载完成 docum ...

  7. JavaScript在A页面判断B页面加载完毕(iframe load)

    今天遇到一个需求,在A页面上判断B页面是否加载完毕(B页面是第三方页面),加载完毕时隐藏loading动画... 而平时我们一般做的事是在B页面上判断B页面是否加载完毕,进行操作. if(docume ...

  8. 用js判断页面是否加载完毕

    用document.onreadystatechange的方法来监听状态改变, 然后用document.readyState == "complete"判断是否加载完成 docum ...

  9. javaScript & jquery完美判断图片是否加载完毕

    好久没写东西了,正好最近因为工作需要,写了一个瀑布流异步加载的程序. 今天就不谈瀑布流,来谈一下关于load的问题. ----------------------------------------- ...

随机推荐

  1. 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)

    相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...

  2. MVC CodeFirst简单的创建数据库(非常详细的步骤)

       最近在学习MVC的开发,相信有过开发经验的人初学一个新的框架时候的想法跟我一样最关心的就是这个框架如何架构,每个架构如何分工,以及最最关键的就是如何与数据库通信,再下来才是学习基础的页面设计啊等 ...

  3. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  4. [干货来袭]MSSQL Server on Linux预览版安装教程(先帮大家踩坑)

    前言 昨天晚上微软爸爸开了全国开发者大会,会上的内容,我就不多说了,园子里面很多.. 我们唐总裁在今年曾今透漏过SQL Server love Linux,果不其然,这次开发者大会上就推出了MSSQL ...

  5. 你所能用到的BMP格式介绍

    原理篇: 一.编码的意义. 让我们从一个简单的问题开始,-2&-255(中间的操作符表示and的意思)的结果是多少,这个很简单的问题,但是能够写出解答过程的人并不 多.这个看起来和图片格式没有 ...

  6. 如何理解MySQL中auto_increment?

    1.auto_increment用于主键自动增长.比如从1开始增长,当把第一条数据删除,再插入第二条数据时,主键值为2,不是1.

  7. ORACLE中STATUS为INACTIVE但是SERVER为SHARED状态的会话浅析

    我们知道当ORACLE数据库启用共享服务器模式时,通过共享服务器模式连接到数据库的会话是有一些特征的.在v$session里面,其SERVER的状态一般为SHARED和NONE, 为SHARED时,表 ...

  8. jmeter之线程组的使用

    线程组 在使用jmeter性能测试时,我们都得先添加个线程组,右键testplan-->添加-->Threads-->线程组.在线程组下执行. 问题:为了能够让jmeter在做性能测 ...

  9. Python3中的字符串函数学习总结

    这篇文章主要介绍了Python3中的字符串函数学习总结,本文讲解了格式化类方法.查找 & 替换类方法.拆分 & 组合类方法等内容,需要的朋友可以参考下. Sequence Types ...

  10. Xamarin技术文档------VS多平台开发

    此技术业余时间研究,仅供大家学习参考,不涉及深入研究,有一定开发基础的人员,应该都能较快上手. 一.简介 Xamarin始创于2011年,旨在使移动开发变得难以置信地迅捷和简单.Xamarin的产品简 ...