在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
最近有个小程序需要采集网页源代码,但有的网页中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 }
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 delegate void happy(); public Form1() //设定timer private void Form1_Load(object sender, EventArgs e)
//委托执行函数 public void UpdateTxtMethod() //此处不用DocumentText是因为它获取中文可能产生乱码 richTextBox1.Text = aa; }
//timer事件 public void theout(object source, System.Timers.ElapsedEventArgs e)
//按下按钮 private void button1_Click(object sender, EventArgs e) webBrowser1.Navigate(richTextBox1.Text); }
|
请发表评论