excel抓取网页数据(《VBA信息获取与处理》套教程(一) )
优采云 发布时间: 2022-04-20 05:06excel抓取网页数据(《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网页加载
让我们修复上面打开一个空网页的代码:
子 mynz()
Set ie = CreateObject("InternetExplorer.Application") '创建一个对象
ie.Visible = True '使IE页面可见,经过这一步,可以在VBA之外看到一个新的IE
ie.navigate " " '创建一个空白页面
Do Until .ReadyState = 4 '检查网页是否加载(4表示完全加载)
DoEvents '在循环中向系统返回工作权限,避免“软崩溃”
环形
结束子
在上面的代码中添加了几行:
Do Until .ReadyState = 4 '检查网页是否加载(4表示完全加载)
DoEvents '在循环中向系统返回工作权限,避免“软崩溃”
环形
这几行代码可以保证网页的加载完成,根据ie.ReadyState的返回值来判断。
readyState 中有 5 个状态:
状态含义描述
0 未初始化对象已创建,但尚未初始化(未调用open方法)
1 初始化对象已经建立,send方法还没有被调用
2 发送数据的send()方法已经调用,但当前状态和http头未知
3 数据传输过程中已经收到了一些数据,由于response和http header不完整,那么通过responseBody和responseText获取一些数据时会报错
4 收到数据后,可以通过responseBody和responseText获取完整的响应数据
通过上面的分析可以看出,只有当.ReadyState = 4时,网页的数据才是有效数据。
3 获取IE页面数据
当网页加载完毕后,剩下的工作就是从网页中抓取数据。数据抓取主要是利用控件对象的属性和方法。
1)使用Set doc = ie.Document 获取网页的文档对象
从表示网页内容的文档对象(Document)扩展而来的对象模型与之前的IE应用程序不是一个系统。
Documnet(文档)是一个文档对象模型,相当于OFFICE对象中的APPLICATION。获取到Document之后,无论是修改网页,读取还是写入网页,还是触发一个事件,一切都好说,每个URL对应一个Documnet(这是如果某一个Navigate to成功导航那个URL是完整的,所以需要先判断IE对象READSTATE才能判断该URL对应的Document是否打开)
2) 在Documnet下可以获得documentElement和body这两个节点。
您可以使用以下语句:
set xbody=doc.Body '获取正文对象
set xDoc=doc.documentElement '获取根节点
前面说过,body相当于被标记的对象,根节点相当于网页中被标记的元素对象。在 MHTML 类型库定义中,它们都属于 HTMLHtmlElement 类型的对象。我将这种类型的对象称为“节点”,但请注意,文档对象不是节点对象,它是 HTMLDocument 类型。根节点和正文节点的区别在于,根节点包括整个网页。在 HTML 的文档对象模型中,这种类型的对象有几个属性来获取内容:
object.innerHtml '对象内的 HTML 文本
Object.OuterHtml '对象中的 HTML 文本,包括对象本身的 HTML 标记
Object.innerText '对象内部的TEXT,不包括HTML标签
Object.OuterText '同上,包括对象本身的文本
所以,如果我们想抓取某个网站的所有HTML内容,代码可以这样写:
设置 doc=ie.Document
set xDoc=doc.documentElement '获取根节点
strX=xDoc.OuterHtml '获取所有HTML内容
3) 每个标签节点对象下,都有一个名为 ChildNodes 的集合,其中收录“该节点下的标签”,就像一个文件目录,根目录下的一个子目录。
我们可以看到 HTML 标签是文档的根节点,是 Document 的 Childnodes 集合的成员(Document 不是节点,它是另一种类型的对象,上层文档,但它可以有下层节点集合,就像一个磁盘可以有一个从属目录,但它本身不是一个目录),BODY是根节点的ChildNodes集合的成员,DIV和P节点是ChildNodes集合的两个成员BODY,也有自己的 Childnoes 系列。
我们要注意:在文档对象模型中,集合不同于OFFICE的集合。集合从 0 开始计数,count 属性是 Length 而不是 Count。
4)除了ChildNodes集合之外,Web文档对象中最常见的集合就是All集合,这是“最容易混淆”的集合。各级文档和节点都有这个集合。集合,顾名思义,是非分层的,但使用起来也很方便:
设置 doc=ie.Document
Set xCols=doc.All '获取文档中的所有节点集
Set xbCols=doc.body.All '获取body节点下的所有节点集
尽管任何标记的节点都有一个 ALL 集合,但我们仍然喜欢使用 DOCUMENT 的 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标签
设置 frmX=myForms.item(0) '第一个 FORM
FORM标签节点所代表的对象是很多朋友关心的内容——在网页对象中,它可以向服务器发送数据,使服务器刷新网页(实际上服务器按照一个一定的格式协议),我们可以将网页的数据发送到服务器。FORM被视为远程函数调用接口。FORM标签中ACTION指向的URL地址就是函数入口,FORM标签中的每个INPUT标签节点都是函数的参数。发出 FORM.Submit 方法时,将远程调用该函数。现在,在服务器端,比如ASP,PHP就是老老实实的找FORM的参数,不管你用GET还是POST:
frmX.submit '相当于用户在页面按下FORM的发送按钮
上面我列出了获取网页数据的一般方法,使用上没有特殊要求。您可以根据自己的习惯使用它们。本题后面的内容就是灵活运用这些知识点解决实际问题。
回到本节的知识点:
如何提交表格?如何下载图片的地址?如何获取表的数据?
【分享成果,用正能量欢欣鼓舞】骄傲的时候冷静,挫折的时候冷静,顺利的时候需要一种克制和冷静。当你遇到逆境和挑战时,一定要有一种轻松愉快、昂扬向上的人生观,即使你匍匐在岁月的尘埃中,也要仰望生命中璀璨的星辰。.
我20多年的VBA实践经验,全部浓缩在以下教程中,教程学习顺序: