excel网页数据抓取vba(“收集和处理VBA信息”教程的第八个“VBA和HTML文档”)
优采云 发布时间: 2021-12-10 03:02excel网页数据抓取vba(“收集和处理VBA信息”教程的第八个“VBA和HTML文档”)
《采集和处理VBA信息》教程第八题《VBA与HTML文档》,第七节《HTML DOM中的对象事件和关联》太无聊了。希望想了解这个领域的朋友可以参考我的教程。
今天我们开始学习第九题《使用IE捕捉网络数据》。
在我们的网络爬虫部分讲解了XMLHTTP方法之后,我们利用两个主题的进度来讲解一些与VBA不太相关的网络知识。这两个话题对于我们重新认识网络爬虫数据非常重要。虽然我的解释不全面,但是对于我经常提倡的VBA定位来说已经足够了。此外,学习是一个不断积累和进步的过程。你需要掌握的是一些基本的理论,然后把它们应用到自己身上。实际上,这才是关键。从这个话题,我们继续从网上学习。本主题是使用IE捕获网络数据。事实上,我们使用控件来完成我们的工作。
第一部分使用IE方法提取网页数据的基础
为了获取网页的数据,我们可以创建IE控件或者webbrowser控件,结合htmlfile对象的方法和属性,模拟浏览器的操作来获取浏览器页面的数据。
这种方法可以模拟大多数浏览器操作。浏览器能看到的数据可以用代码获取,但是有个致命的缺点:除了烦人的弹窗,兼容性确实是个很麻烦的问题。在我自己的实践中,我觉得这个方法不是很稳定(只是一种感觉)。
1 IE模型的创建
在我们的实际工作中,我们会遇到网站和web相关的问题,比如:如何下载web数据?网页之间的通讯是如何实现的,是否可以控制等等。如果你是用VB/VBA/scripts或者其他支持AUTOMATION的语言编程,有一个方法值得了解,就是掌握对象模型:处理网页作为对象来控制,这种方法需要了解IE的自动化对象)或IE控件(Microsoft Internet Controls),以及标准的文档对象模型(Document)。前两个题目我已经做了很多相关的知识,这里就不详细解释了。
我给出以下代码:
Set ie = CreateObject("In;)'创建一个对象
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("In;)'创建一个对象
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 headers不完整,那么通过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'获取身体对象
设置 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
设置 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集合,这是“最让人迷惑”的集合。各个层级的文档和节点都有这个Sets,顾名思义,没有分层,但是使用起来也很方便:
设置 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.my
5)获取文档对象的getElementsByName集合,可以使用如下方法:
设置 mydivs=doc。getElementsByName("div")'获取所有DIV标签,注意还是一个集合
6) 文档对象的FORMS集合,因为大部分网页数据提交都是通过FORM标签提交的:
设置 myForms=doc.Forms'获取所有 FORM 标签
Set frmX=myForms.item(0)'第一个FORM
FORM标签节点所代表的对象就是很多朋友关心的内容——在网页对象中,它可以向服务器发送数据,让服务器刷新网页(其实就是服务器根据某种格式协议),并且我们可以更改网页 FORM 被视为远程函数调用接口。FORM标签中ACTION指向的URL地址就是函数入口,FORM标签中的每个INPUT标签节点就是函数的参数。当 FORM.Submit 方法发出时,该函数被远程调用。是的,在服务器端,比如ASP,PHP就是老老实实的找FORM的参数,不管是用GET还是POST:
'相当于用户在页面上按下了FORM的发送按钮
上面我已经列出了一般的获取网页数据的方法,没有特殊的使用要求。可以根据自己的习惯使用。本专题后面的内容就是利用这些知识点灵活解决实际问题。
本节知识点:
如何提交表格?怎么下载图片的地址?如何获取表的数据?
积木式编程的内涵:
在我的系列丛书中,我一直在强调“积木”的编程思想。这也是学习使用VBA的主要方法,尤其是专业人士。其主要内涵:
1 不要自己输入所有代码。您要做的就是将构建块放在正确的位置,然后修改代码。一定要复制,从你的构建块库中复制,然后修改代码,并利用你的时间进行有效的思考。
2 建立自己的“积木库”。平时在学习的过程中,把自己觉得有用的代码拼凑起来,多积累一些,用到的时候随时可以拿到。您的构建块库中的数据越多,您的编程想法就越广泛。
VBA 应用程序的定义
VBA是使用Office实现个人小型办公自动化的有效手段(工具)。这是我对VBA应用的定义。在取代OFFICE的新办公软件到来之前,谁能做到数据处理的极致才是王道。其中,技能的巅峰非VBA莫属!
记得20年前刚开始学VBA的时候,当时资料很少,只能自己看源码自己弄明白。这真的很难。二十年过去了。为了不让正在学习VBA的朋友重复我之前的经验,我根据自己多年的VBA实际使用经验,推出了6个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 的旅行者。