zoukankan      html  css  js  c++  java
  • c#如何判断webbrowser已经加载完毕

    最近有个小程序需要采集网页源代码,但有的网页中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();//开启时钟
    }

  • 相关阅读:
    Android NDK学习(1) 简介
    wmsys.wm_concat结果长度限制的问题
    onInterceptTouchEvent和onTouchEvent调用时序
    滑动到底部或顶部响应的ScrollView实现
    Android ViewPager使用详解
    android include标签的使用,在RelativeLayout中使用include标签需注意!!!!!
    Eclipse中如何在指定工程中搜索指定的字符串
    android:windowSoftInputMode属性详解
    cocos2d-x中关于touch事件的响应
    《从零开始学Swift》学习笔记(Day 6)——哎呀常量和变量都该什么时候用啊?
  • 原文地址:https://www.cnblogs.com/hehheai/p/6509806.html
Copyright © 2011-2022 走看看