巧用C#webbrowser以及Application.DoEvents实现采集动态网页的爬虫机器人

0
JavaScript Java C/C++ Go 数据采集 14093 次浏览
从事网络数据抓取采集已有很长的一段时间了,最开始是针对静态网页,写正则表达式,从网络上抓取信息。但是随着工作的深入,
发现很多网页单单用正则表达式并不能完成抓取工作,比如很多网页的下一页链接是由JavaScript函数生成的比如
<li><a href="#" onclick="javascript:gotoPage('2')">2</a></li>href
 url#httpresponse,httprequestjs
怎么办?

可以采用DOM+正则+浏览器组件来解决上面的问题。

DOM Document Object Model),是一个接口标准,该接口是将html网页解析成为树的格式,关于DOM的教程,请见:http://www.w3.org/DOM/  虽然上面讲的是JavaScript的 DOM 接口函数,但是由于DOM是一个接口标准,其他语言实现的DOM接口也是大同小异的。

正则表达式:在完成文本匹配方面有着不可或缺的作用,这个powerful的工具,DOM是无法取代的。

浏览器组件: 包含解释JS语句的功能,有了浏览器组件的帮忙,我们的工作会更加省力(另外:园子里有网友建议什么Xpath,webrequest等等,没有用过,如果有人在这方面比较熟悉不妨交流下)

本功能采用VS2008 C# Winform 平台

在此平台下调用正则要在程序的头部加入声明:

using System.Text.RegularExpressions;

调用DOM组件,需要在工程的引用中加入Microsoft.mshtml

浏览器组件用的是webbrowser

 

首先我们要在程序中构造一个简单的浏览器,要有一个combobox列表框(显示当前网页的URL),前进和后退按钮,控制浏览器刷新视图 实现代码如下:

 

程序中实现简易浏览器的前进和后退功能

复制代码

 private void btnGo_Click(object sender, EventArgs e)
        {
            
string url = comboBox1.Text.Trim();

            webBrowser1.Navigate(url);
        }

 
private void btnBack_Click(object sender, EventArgs e)
        {
            webBrowser1.GoBack();
        }

复制代码

 

光有前进和后退还不够,我们希望当浏览器视图刷新后,combobox里面的URL也跟着刷新,所以要再给浏览器添加一个Navigated事件,更新combobox显示的文本。代码如下:

 

 private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            comboBox1.Text 
= webBrowser1.Url.ToString();
        }

 

 这还不够,当你实现上述代码时你会发现,你点击webbrowser里面的链接时,会在本地IE中显示新网页,所以我们还需要添加一个NewWindow事件代码如下

 

webbrowser NewWindow

复制代码

private void webBrowser1_NewWindow(object sender, CancelEventArgs e)
        {
            e.Cancel 
= true;
            
if (webBrowser1.Document.ActiveElement != null)
            {
                webBrowser1.Navigate(webBrowser1.Document.ActiveElement.GetAttribute(
"href"));
                comboBox1.Text 
= webBrowser1.Document.ActiveElement.GetAttribute("href");
            }

        }

复制代码

 

 实现了如上代码,那么程序中就配置好了一个简易的IE浏览器了。剩下的问题就是如何设计爬虫逻辑,形成自动爬虫机器人了(这里声明一下:本篇博文仅提供一个自动爬虫机器人的框架性思路,至于如何捕获具体的网页信息块儿BOI(block of interest)还需要根据网页的具体情况配置不同的模板。

请尽量让自己的答案能够对别人有帮助

4个答案

默认排序 按投票排序