excel抓取网页数据(《VBA信息获取与处理》套教程(一) )

优采云 发布时间: 2022-04-20 05:06

  excel抓取网页数据(《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实践经验,全部浓缩在以下教程中,教程学习顺序:

  

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线