龙空技术网

IE法提取网页数据

VBA语言専攻 484

前言:

此时大家对“vba提取网页表单”都比较关心,小伙伴们都想要知道一些“vba提取网页表单”的相关知识。那么小编也在网络上收集了一些有关“vba提取网页表单””的相关知识,希望我们能喜欢,小伙伴们快快来了解一下吧!

【分享成果,随喜正能量】我们不良的行为、不善的念头、不好的言语,都属于我们内心的暴力,要想获得平和,我们需要自我修习,学会控制情绪,学会内观反省并接近善良。。

《VBA信息获取与处理》教程是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪贴板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。是非常抽象的,更具研究的价值。

教程共两册,八十四讲。今日的内容是专题九“利用IE抓取网络数据”:IE法提取网页数据

第一节 利用IE法提取网页数据基础

为了获取网页的数据,我们可以通过创建IE控件或webbrowser控件,结合htmlfile对象的方法和属性,模拟浏览器操作,获取浏览器页面的数据。

这种方法可以模拟大部分的浏览器操作。浏览器能看到的数据就能用代码获取,但是有个致命的缺点:除去各种弹窗相当烦人外,兼容性也确实是个很伤脑筋的问题。在我自己的实践中感觉这种方法不是很稳定(仅仅是感觉)。

1 IE模型的创建

我们在实际工作中遇到网站和网页相关问题,例如:如何下载网页数据?网页之间的通讯是怎么实现的、它们能不能被控制等等。如果你是用VB/VBA/脚本或其它支持自动化对象(AUTOMATION)的语言编程,有一个值得了解的方法是掌握对象模型:将网页视为对象来控制,这个方法需要了解的是IE的自动化对象(InternetExplorer.Application)或IE控件(Microsoft Internet Controls),以及标准的文档对象模型(Document)。相关的知识我在前两个专题中做了大量的讲解,这里就不再详细的说明了。

我给出下面的代码:

Set ie = CreateObject("InternetExplorer.Application") ’创建对象

ie.Visible = True ’使IE页面可见,做完这一步,在VBA之外可以看到一个新的IE

ie.navigate "about:blank" ’建立一个空白页

上面这几行代码的作用是创建一个IE应用程序对象,并打开一个空白的网页。这个网页独立于VBA的应用程序(WORD或EXCEL)之外,事实上,你必须自已关掉它,或者用ie.Quit下令退出——注意一下,单纯的关闭VBA或SET ie=nothing是不会退出这个网页的。我们经常用的是将第3行的字符串替换成一个网站的名字,或者替换成一个你主机中的文档名,也可以是一个图片名,都是可以的。和你在IE地址栏输入名称浏览这些文档是一样效果。

如果仅仅是创建了一个空的模型是没有任何利用的价值的,我们需要真正的网页,这时就需要我们在VBA的应用程序外打开一个完整的网页了,直到网页完全加载我们的操作才能向下进行。

2 IE网页页面的加载

我们修正一下上面的那段打开空网页的代码:

Sub mynz()

Set ie = CreateObject("InternetExplorer.Application") ’创建对象

ie.Visible = True ’使IE页面可见,做完这一步,在VBA之外可以看到一个新的IE

ie.navigate " ; ’建立一个空白页

Do Until .ReadyState = 4 '检查网页是否加载完毕(4表示完全加载)

DoEvents ‘循环中交回工作权限给系统,以免“软死机”

Loop

End sub

在上面的代码中增加了几行:

Do Until .ReadyState = 4 '检查网页是否加载完毕(4表示完全加载)

DoEvents ‘循环中交回工作权限给系统,以免“软死机”

Loop

这几行代码可以保证网页的加载完成,这是根据ie.ReadyState的返回值来判断的。

readyState一共有5中状态:

状态 含义 说明

0 未初始化 对象已建立,但是尚未初始化(尚未调用open方法)

1 初始化 对象已建立,尚未调用send方法

2 发送数据 send()方法已调用,但是当前的状态及http头未知

3 数据传送中 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误

4 数据接收完毕 此时可以通过通过responseBody和responseText获取完整的回应数据

通过以上的分析,我们可以看出,只用当.ReadyState = 4时网页的数据才是有效的数据。

3 IE页面数据的获得

当网页加载完毕,剩下的工作就是从网页中抓取数据了,数据的抓取主要是利用控件对象的属性和方法。

1)用Set doc = ie.Document 取得网页的文档对象

从文档对象(Document)以下展开的对象模型,它代表网页的内容,和前面那个IE的应用程序不是同一个体系.

Documnet(文档)是文档对象模型,相当于OFFICE对象中的APPLICATION,取得Document之后,不论修改网页还是读写网页,还是触发事件,一切都好说,每个URL都对应有一个Documnet(这是假如定成功导航Navigate到那个URL完成,因此之前要求确定IE对象READSTATE,以确定对应URL的Document打开了)

2) 在Documnet之下可以取得documentElement和body两个节点。

可以用下面的语句:

set xbody=doc.Body ‘取得body对象

set xDoc=doc. documentElement ‘取得根节点

body前面已经说过,相当于标记的对象,根节点相当于网页中的标记元素的对象,MHTML的类型库定义里,它们都属于HTMLHtmlElement类型的对象,下面我把这种类型的对象称为一个“节点”,不过要注意的是文档对象不是节点对象,它是HTMLDocument类型。根节点和body节点不同的是根节点包括整个网页,在HTML的文档对象模型中,这类对象有几种属性可以取得其中的内容:

对象.innerHtml ‘对象内部的HTML文本

对象.OuterHtml ‘对象中的HTML文本,包括对象本身的HTML标记在内

对象.innerText ‘对象内部的TEXT,不包括HTML标记

对象.OuterText ‘同上,包括对象本身的文本

所以,如果我们要抓取某个网站的所有HTML内容,代码可以这样写:

set doc=ie.Document

set xDoc=doc. documentElement ‘取得根节点

strX=xDoc.OuterHtml ‘取得所有的HTML内容

3) 每一个标记节点对象之下都有一个名为ChildNodes的集合,它包含了“直属于本节点下的标记”,就象是文件目录,根目录下的子目录.

我们可以看到:HTML标记是文档的根节点,是Document的Childnodes集合中的一个成员(Document不是节点,是另一种类型对象,上一级文档,但它可以有下级节点集合,正如磁盘可以有下级目录,但它本身不是目录),BODY是根节点的ChildNodes集合中的一个成员,而DIV和P两个节点则是BODY的ChildNodes集合中的两个成员,同样也有自己的Childnoes集合。

我们要注意:文档对象模型中,集合与OFFICE的集合有所不同,集合是从0开始计数的,计数属性是Length而不是Count。

4)除了ChildNodes集合,大家在网页文档对象中还常见到的就是很大气的一种集合:All集合,这是“最糊涂”的一种集合,文档和各级节点都带有这个集合,正如这个名字所示,它是不分层次的,但用起来也很方便:

Set doc=ie.Document

Set xCols=doc.All ’取得文档中的所有节点集合

Set xbCols=doc.body.All ’取得body节点下所有的节点集合

虽然任何标记节点都有ALL集合,但我们还是喜欢用DOCUMENT的ALL,原因无它,文档最大,一锅烩的ALL找起来也最合适。ALL查找是有条件的:如果这个标记没有ID,你无法查到它的名字。

不过,ALL集合有一个很方便的特性:ID可以挂到ALL集合之下:

strX=doc.All.mytag.innerhtml

5)获得文档对象的getElementsByName集合,可以利用下面的方法:

set mydivs=doc. getElementsByName(“div”) ‘取得所有DIV标记,注意还是集合

6) 文档对象的FORMS集合,因为大部分网页的数据提交都是通过FORM标记提交的:

Set myForms=doc.Forms ’取得所有的FORM标记

Set frmX=myForms.item(0) ’第1个FORM

FORM标记节点代表的对象是很多朋友关心的内容——在网页对象中,它可以发送数据到服务器,使服务器刷新网页(实际上是服务器按某个格式约定发回数据),我们可以把网页的FORM看成是一个远程的函数调用接口,FORM标记中的ACTION指向的URL地址就是函数入口,而FORM标记内的各个INPUT标记节点就是函数的参数,当发出FORM.Submit方法时,就是远程调用函数了,在服务器端,诸如ASP,PHP就是老老实实找FORM的参数,不管你是用GET还是POST:

frmX.submit ’相当于用户在页面上按下FORM的发送按键

上面我罗列了获取网页数据的一般的方法,并没有什么特别的使用要求,大家可以根据自己的习惯来利用,这个专题之后的内容就是灵活运用这些知识点来解决实际问题了。

本节知识点回向:

如何提交表单?如何下载图片的地址?如何获得表的数据?

【分享成果,随喜正能量】得意之时淡然,失意之时坦然,顺风顺水的时候需要一种内敛和沉稳,遭遇逆境和挑战的时候,要有一份举重若轻、生命昂扬的生命展望,就算匍匐于岁月尘埃,也要仰望生命的星辰灿烂。 ​​。

我20多年的VBA实践经验,全部浓缩在下面的各个教程中,教程学习顺序:

标签: #vba提取网页表单