WebBrowser + HtmlPraser 抓取ajax网页的源代码

来源:互联网 发布:翻墙有哪些软件推荐 编辑:程序博客网 时间:2024/05/01 07:24

之前做项目要从一个网页中抓取某些特定信息 最初是打算直接用java+HtmlPraser做出来的 结果要抓取的那部分怎么都出不来 研究了一下那个网页的源代码之后 得出结论是那个网页是用ajax技术隐藏了部分信息 要有用户浏览该页面的时候才会把这部分信息显示出来 好了 然后我又想找一找有没有一些可以模拟浏览的开源项目 结果找不到.  万分无奈下 只好转战c#平台.


经高人指点 c#中WebBrowser这个控件就起到一个模拟浏览器的作用 而且使用非常简单.  

     新建一个窗体应用程序 往窗体添加一个WebBrowser控件 在该控件的属性url设置你要解析的网页url 必须填写

     然后双击控件 你会转到一个

 private void web_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
函数里面

查看函数解析就知道 这个函数在控件加载完网页之后才执行

也就是说你要对网页的信息获取要写在这个函数里面

一开始我也是把处理代码直接写在这个函数里面 但发觉信息是抓到 但只是很少一部分

后来一百度 发现是因为这个控件其实设计得有些缺点 很多时候含有动态加载的网页还没完全打开 

web_DocumentCompleted()这个函数就会开始执行 导致控件显示的页面源代码与实际页面源代码不一致


解决方法是有的 虽然也不算完全解决 但能提高打开类似ajax网页的完成度

方法是

private void web_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)        {            if (web0.ReadyState == WebBrowserReadyState.Complete)            {             }}

添加一个判断 这个判断可以更好地保证控件在加载了大部分目标网页信息后才执行下面的代码

原理不是很明白 但实验证明抓取目标数据的量的确增加了.


所以想捕捉到更多数据 可以使用定时器隔一段时间就对网页进行一次解析 提高抓取数据量.

简单来说就是 控件timer 和 WebBrowser的Navigate方法的结合使用.