天天看点

WebBrowser控件网页数据抓取(I) - EXCEL VBA(22)

作者:银河统计工作室

运用WebBrowser控件打开Web页面,并提取页面数据成为当今数据收集的主要手段。EXCEL VBA网页数据抓取和处理基本过程如下:

  • 运用WebBrowser控件打开Web页面
  • 解析文档或字符串
  • 将抓取的网页数据按格式要求写入EXCEL表格
  • 通过EXCEL表格函数或EXCEL VBA编程进行数据数理

本文介绍开发一个简单的WebBrowser控件网页数据抓取工具来实现EXCEL VBA网页数据抓取的基本过程。

1、运用WebBrowser控件打开Web页面

I、建立窗体如下图

WebBrowser控件网页数据抓取(I) - EXCEL VBA(22)

窗体由控件解释:

  • CommandButton1:【打开网页】命令按钮;
  • CommandButton2:【网页数据抓取】命令按钮;
  • TextBox1:网址文本框(单行)
  • TextBox2:网页HTML文档文本框(多行)。设置Multiline属性为True、ScrollBars属性为2;
  • WebBrowser1:网页控件

II、打开Web页面

  • 打开窗体后运用窗体初始化事件Initialize加载指定网页
Private Sub UserForm_Initialize()
WebBrowser1.Navigate "http://www.galaxystatistics.com/excel/excelVBA2.html"
End Sub           
  • 打开窗体时运用CommandButton1【打开网页】命令按钮打开TextBox1网址文本框中指定的网页
Private Sub CommandButton1_Click()
WebBrowser1.Navigate TextBox1.Text
End Sub           
  • 网页加载成功后执行WebBrowser1的DocumentComplete事件,在TextBox2文本框显示网页HTML文档
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
Dim doc As Object
Set doc = WebBrowser1.Document
TextBox2.Text = doc.DocumentElement.innerHTML
TextBox2.SetFocus
End Sub           

通常,使用浏览器打开网页后,在页面点击鼠标右键,弹出菜单如此,

WebBrowser控件网页数据抓取(I) - EXCEL VBA(22)

点击【查看网页源代码(V)】,可以查看网页HTML文档。

本文案例网页为“http://www.galaxystatistics.com/excel/excelVBA2.html”,文档如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Excel Train</title>
<meta charset="utf-8"/>
<style>
.testTB{color:#ff0000;}
</style>

<script type="text/javascript">
function oSum(x,y) {
return x+y;
}
//无参数调用  
function alertNull(){  
alert("WebBrowser call!");  
}
//有参数调用  
function callWithPar(name, address) {  
alert("Name is " + name + "; address is " + address);  
}  
 </script>
</head>
<body scroll="yes" bgcolor="#E3F3F9" style="border:none">
<h4>表格一</h4>
<table id="myTB2" class="testTB" border=0 cellspacing=0 cellpadding=5 width="100%" style="border-top:2px solid #000000; border-bottom:2px solid #000000; width:50%;">
      <tr><th style="border-right:1px solid #000000;">产量</th><th style="border-right:1px solid #000000;">人数</th><th>累计人数</th></tr>
      <tr>
          <td style="border-top:1px solid #000000; border-right:1px solid #000000;">4</td>
          <td style="border-top:1px solid #000000; border-right:1px solid #000000;">8</td>
          <td style="border-top:1px solid #000000;">8</td>
      </tr>
      <tr>
          <td style="border-right:1px solid #000000;">5</td>
          <td style="border-right:1px solid #000000;">22</td>
          <td>30</td>
      </tr>
      <tr>
          <td style="border-right:1px solid #000000;">6</td>
          <td style="border-right:1px solid #000000;">42</td>
          <td>72</td>
      </tr>
      <tr>
          <td style="border-right:1px solid #000000;">7</td>
          <td style="border-right:1px solid #000000;">38</td>
          <td>110</td>
      </tr>
      <tr>
          <td style="border-right:1px solid #000000;">8</td>
          <td style="border-right:1px solid #000000;">17</td>
          <td>127</td></tr>
      <tr>
          <td style="border-right:1px solid #000000;">9</td>
          <td style="border-right:1px solid #000000;">3</td>
          <td>130</td>
      </tr>
      <tr>
          <td style="border-top:1px solid #000000; border-right:1px solid #000000;">合计</td>
          <td style="border-top:1px solid #000000; border-right:1px solid #000000;">130</td>
          <td style="border-top:1px solid #000000;">***</td>
      </tr>
  </table>
<p>
<h4>表格二</h4>
<table class="testTB" border=1 cellspacing=0 cellpadding=5 width="50%">
<tr><th>姓名</th><th>民族</th></tr>
<tr><td>张三</td><td>汉族</td></tr>
<tr><td>李四</td><td>回族</td></tr>
</table>
<form name="myFc">
<h4>表格三</h4>
<table>
<tr><th colspan=2 style="text-align:left; font-size:10pt; color:#a51020;">1、文本框</th></tr>
<tr><td>  姓名:</td><td><input id="myName" style="width:100px; color:#ff0000;" value="张三" onchange="alert(111)"/></td></tr>
<tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">2、单选按钮</th></tr>
<tr><td>  性别:</td><td><input type="radio" name="myGender" value="1" checked/>男 <input type="radio" name="myGender" value="0"/>女</td></tr>
<tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">3、复选框</th></tr>
<tr><td>  爱好:</td><td><input type="checkbox" name="myLike" value="1"/>篮球 <input type="checkbox" name="myLike" value="2"/>游泳 <input type="checkbox" name="myLike" 
value="3"/>跑步</td></tr>
<tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">4、下拉列表</th></tr>
<tr><td>  专业:</td><td><select id="myMajor">
    <option value="1">数学</option>
    <option value="2">统计学</option>
    <option value="3">寿险精算</option>
    <option value="4">R语言</option>
</select></td></tr>
<tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">5、多行文本</th></tr>
<tr><td>  简介:</td><td>
<textarea id="myIntroduction" style="width:300px; height:100px; color:#555555;">
WebBrowser控件是Internet Explorer的主窗口,它是作为一个ActiveX控件来包装的。用户可以使用WebBrowser控件打开任何IE能够显示的Web页面,并提取页面数据。如有自己的网站,可运用WebBrowser控件实现
EXCEL文档和服务器间数据交换
</textarea></td></tr>
<tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">6、DIV区块</th></tr>
<tr><td>  效果:</td><td>
<div id="myEffect" style="width:300px; height:50px; border:#aaaaaa 1px solid; dsiplay:inline;">
<b style="text-align:center; width:100%; padding-top:15px;">这是黑体效果</b>
</div></td></tr>
<tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">7、图片</th></tr>
<tr><td>  头像:</td><td><img src="http://studio.galaxystatistics.com/shiny/rSHIndex/pic/vba1.jpg" id="myImg" style="width:200px; height:260px; color:#ff0000;"/></td></tr>
<tr><th colspan=2 style="text-align:left; font-size:10pt; color:#e51020;">8、内崁iFrame框架</th></tr>
<tr><td>  框架:</td><td><iframe src="http://www.galaxystatistics.com/excel/excelVBA1.html" id="myIframe" style="width:380px; height:260px; color:#ff0000;"/></td></tr>
</table>
</form>
</body>
</html>           

2、解析HTML文档

WebBrowser控件网页数据抓取必须具备一定基础的网页编程知识。通常,网页数据抓取的对象为网页中的table标签,统计数据往往以表格形式来呈现。

I、通过table标签的id属性抓取表格数据

网页中任何标签都可以设定id属性做为唯一标识,对于设定id属性的HTML标签,可以用DOM文档模型的Document.getElementById获得该标签。

案例网页为“http://www.galaxystatistics.com/excel/excelVBA2.html”中第一个table标签为,

<h4>表格一</h4>
<table id="myTB2" class="testTB" border=0 cellspacing=0 cellpadding=5 width="100%">
 ...
  </table>           

这里table标签的id属性为id="myTB2",CommandButton2【网页数据抓取】命令按钮代码如下:

Private Sub CommandButton2_Click()
Dim tbRows As Integer
Dim tbCols As Integer
Dim i, j As Integer
'通过id属性获得table标签对象
Set doc = WebBrowser1.Document.getElementById("myTB2")
'获得表格行数
tbRows = doc.Rows.Length
'获得表格列数
tbCols = doc.Rows(0).Cells.Length
Sheet1.Cells.Clear
For i = 0 To tbRows - 1
    For j = 0 To tbCols - 1
'按行、列将表格数据写入EXCEL表格
        Sheet1.Cells(i + 1, j + 1) = doc.Rows(i).Cells(j).innerText
   Next j
Next i
End Sub           

II、通过table标签集合抓取表格数据

有时网页中要抓取的标签没设定id属性,这时可通过DOM文档模型的Document.getElementsByTagName获得该标签集合。CommandButton2【网页数据抓取】命令按钮代码如下:

Dim tables As Object
' 获取文档中所有的table集合
Set tables = WebBrowser1.Document.getElementsByTagName("table")
' 获取文档中第2个table对象
Set doc = tables(1)
Dim tbRows As Integer
Dim tbCols As Integer
Dim i, j As Integer
tbRows = doc.Rows.Length
tbCols = doc.Rows(0).Cells.Length
Sheet1.Cells.Clear
For i = 0 To tbRows - 1
  For j = 0 To tbCols - 1
    Sheet1.Cells(i + 1, j + 1) = doc.Rows(i).Cells(j).innerText
  Next j
Next i           

解析HTML文档是一个人机对话过程,开发者需要对HTML文档结构和EXCEL VBA编程有足够的经验。

这里介绍了网页table标签中数据抓取的方法,对于其它网页标签(div、textarea、img等),基本都可以有DOM的Document.getElementById和Document.getElementsByTagName方法获得抓取对象。至于不同网页标签的进一步解析,则需要对HTML文档结构有一定程度的了解。

本文代码使用InternetExplorer运行通过,如果使用Chrome浏览器或Firefox浏览器加载网页,HTML文档解析过程可能略有区别。

参考文章:

  • Web Browser控件与网页互动 - EXCEL VBA(21)

继续阅读