vba xmlhttp 抓取网页(利用IE抓取网络数据教程中第八个专题与HTML文档)

优采云 发布时间: 2022-03-03 08:02

  vba xmlhttp 抓取网页(利用IE抓取网络数据教程中第八个专题与HTML文档)

  《VBA信息获取与处理》教程第八题“VBA与HTML文档”第七节“HTML DOM的对象事件与关联”太无聊了。希望想掌握这方面知识的朋友可以参考我的教程。. 今天我们开始学习“使用IE捕获网络数据”的第九个话题。

  在我们的网页抓取部分,在讲解了XMLHTTP方法之后,我们利用两个题目的进度,讲解了一些与VBA不太相关的网络知识。这两个话题对于我们重新认识网络抓取数据具有重要意义。,虽然我的解释不能包罗万象,但是对于我经常提倡的VBA定位来说已经足够了。此外,学习是一个不断积累和进步的过程。你需要掌握的是一些基本的理论,然后把它们应用到自己身上。在实践中,这是关键。从这个话题开始,我们继续我们对网络爬虫的研究。本主题是使用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的发送按钮

  上面我列出了获取网页数据的一般方法,使用上没有特殊要求。您可以根据自己的习惯使用它们。本题后面的内容就是灵活运用这些知识点解决实际问题。

  

  回到本节的知识点:

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

  

  块编程思想的内涵:

  在我的系列书中,我一直在强调“积木”的编程思想,这也是学习使用VBA的主要方法,尤其是对于专业人士来说,采用这种方案是很有必要的。其主要内涵:

  1 不要自己输入所有代码。你要做的就是把块放在正确的地方,然后修复代码,一定要复制它,从你的构建块库中复制它,然后修复代码并利用时间来有效地思考。

  2 建立自己的“块库”。平时在学习的过程中,把自己觉得有用的代码放在一起,多积累,随时用。您在构建块库中拥有的信息越多,您的编程思想就会越广泛。

  

  VBA的应用定义

  VBA是利用Office实现个人小型办公自动化的有效手段(工具)。这是我对 VBA 的应用程序定义。在取代OFFICE的新办公软件出现之前,谁能在数据处理上做到极致,谁就是王者。技巧的巅峰莫过于VBA!

  记得20年前第一次学VBA的时候,当时资料很少,只能看源码搞清楚,真的很难。20年过去了,为了不让学VBA的朋友重复我之前的经历,我结合自己多年的VBA实践经验,推出了六篇VBA专题教程:

  第一组:VBA代码解法是对VBA中各个知识点的讲解。总共147课,涵盖了初学者必备的大部分VBA知识点;

  第二套:VBA数据库解决方案 数据库是专业的数据处理工具。教程中详细介绍了使用ADO连接ACCDB和EXCEL的方法和示例操作,适合中级学习。

  第三套:VBA数组和字典解决方案数组和字典是VBA的精髓,字典是提高VBA代码水平的有效手段,值得深入研究,是初级和中级人员学习的一种手段改进代码。

  第四套:VBA代码解法视频是给初学者的视频讲解,可以快速上手,更快掌握这个技能。这套教程是第一套教程的视频讲解,听元音比较容易。

  第五套:VBA中类的解释与利用这是一门进阶课程,讲解类的虚无和肉身的程度。虽然类的使用较少,但认真学习可以促进自身VBA理论的提高。对这套课程的领悟,主要是读者的领悟,对一种佛教哲学的领悟。

  第六套教程:《VBA信息获取与处理》,这是一个高级教程,涵盖范围更广,实用性更强,面向中高级人员。教程共有20个主题,包括:跨应用信息获取、随机信息的使用、邮件发送、VBA上网数据抓取、VBA延时操作、剪贴板应用、Split功能扩展、工作表信息等应用交互、FSO的使用对象,获取工作表和文件夹信息,获取图形信息,自定义工作表信息等功能。

  您可以按照1→3→2→6→5或4→3→2→6→5的顺序根据以上信息逐步深入学习。教程提供讲解并提供大量积木,如有需要可以微信:NZ9668

  

  学习VBA是一个过程,也需要体验一下枯燥的感觉

  如太白诗云:百鸟高飞,孤云独闲。相见不厌,唯有敬亭山。学习的过程也是修心的过程,修心平和。在码字的世界里,心静,心情好,身体自然就好。当心平静时,它是正义的。心中没有那么多的邪见邪见,也没有那么多的妄想。利益他人就是利益自己。这些教程也是为了帮助你起航,帮助我。我上面的教程是我经验的传递。

  “水无争,万物皆好。” 学习也是如此,知道自己需要什么,不蜷缩在世界的一小块认为自己是天堂的地方,以及自欺欺人的言论直到年老。努力提高自己,以充满活力的精神把握现在,这就是进步。越有意义的事情,就越难。意愿决定一切,智慧决定成败。无论遇到什么,都是风景。看不起纠纷,看不起得失。不管是满的还是小的,都不愁茶;不管是浓还是淡,都有自己值得品尝的味道。感受真实的时间,静下心来,多了解,积福报。与其天天闹着玩,不如天天过日子。在杀鸡更严重的后疫情世界,储备知识,尤其是新知识,为自己生存。学习时是渺小而无声的,使用时是巨大而汹涌的。

  每一次收获都是成长的记录。怎么可能没有证据?正是这种执着,让晨曦绽放出灿烂的光芒。最后,给致力于VBA学习的朋友一句话,让大家感受一下枯燥而执着的学习过程:

  乌云掠过,暗语无声,

  只有微风,惊动了梦中的莺。

  看星星,疏散北斗七星,

  钦奈将与过去的鹅一起去。

  陌生人,昏暗的灯光,

  忍着长亭。

  多少VBA人,

  在漆黑的夜里,静静地寻找梦想,期待黎明。

  多么不合理!

  回到学习和使用VBA的经历,很感慨。我想用这些话与大家分享我多年实际工作经验的成果。我想把这些有用的东西分享给真正需要使用 VBA 的旅友。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线