ASP.NET 抓取网页内容-WebBrowser 的 Navigated、DocumentCompleted 使用及区别

作者:vkvi 来源:ITPOW(原创) 日期:2013-2-22

有些服务器禁止了 WebRequest、WebClient 抓取网页,这时可用 WebBrowser 控件。

触发顺序

先触发 Navigated、再触发 DocumentCompleted。

  • Navigated 表示开始加载文档(不是指开始访问网页服务器);
  • DocumentCompleted 表示文档加载完毕。

哪个能获取 WebBrowser 的 Document、DocumentText 和 DocumentStream 属性?

根据微软的说法,都能够获取。但根据我的测试,如果网页复杂,比如 iframe 多、HTML 长,那么只有在 DocumentCompleted 且 WebBrowser 的 ReadyState 为 Complete(即整个网页加载完)时,才能够获取完整的 HTML。

如何获取 gb2312 编码的网页 HTML?

因为 .NET 是 UTF-8 的,所以对 gb2312 编码的网页,用 DocumentText 取出来是乱码,我再试了,根据 Encoding 对 DocumentText 转换编码,仍然是乱码,用下面的方式解决:

网页有 iframe 框架,是否会多次触发?

会,两个事件都会,通过事件参数 e.Url 可以判断是主网页触发的还是 iframe 触发的。

网页有 iframe 框架,每次触发 Navigated、DocumentCompleted 时,其 DocumentText 是主网页的,还是 iframe 框架网页的?

主网页的。

网页无 iframe 时事件是如何触发的? 

  • Navigated
  • DocumentCompleted(Complete)

其中 Complete 表示当前 WebBrowser 的 ReadyState。

网页有 iframe 时事件是如何触发的?

  • Navigated(主网页触发)
  • Navigated(框架网页 1 触发) -> DocumentCompleted(Interactive)(框架网页 1 触发)
  • Navigated(框架网页 2 触发) -> DocumentCompleted(Interactive)(框架网页 2 触发)
  • DocumentCompleted(Complete)(主网页触发)

其中 Interactive、Complete 表示当前 WebBrowser 的 ReadyState。

可以看出:框架网页触发时,DocumentCompleted 的 ReadyState 为 Interactive;整个网页加载完成触发时,ReadyState 为 Complete。

相关阅读

相关文章