我们的网抓部分在讲解了XMLHTTP方法后,利用两个专题的进度进行了一些和VBA关系不是很大的有关网络知识的讲解,这两个专题对付我们重新认识网抓数据有着非常主要的意义,虽然我的讲解还不能面面俱到,但对付我常常倡导的VBA定位来说,是足够的,再者,学习是个不断积累提高的过程,要节制的是一些基本的理论,然后把这些运用到自己的实际中去,这才是关键。从这个专题开始我们连续网抓的学习。这个专题是利用IE抓取网络数据。实在便是利用控件来完成我们的事情。
第一节 利用IE法提取网页数据根本
为了获取网页的数据,我们可以通过创建IE控件或webbrowser控件,结合htmlfile工具的方法和属性,仿照浏览器操作,获取浏览器页面的数据。
这种方法可以仿照大部分的浏览器操作。浏览器能看到的数据就能用代码获取,但是有个致命的缺陷:撤除各种弹窗相称烦人外,兼容性也确实是个很伤脑筋的问题。在我自己的实践中觉得这种方法不是很稳定(仅仅是觉得)。

我们在实际事情中碰着网站和网页干系问题,例如:如何下载网页数据?网页之间的通讯是怎么实现的、它们能不能被掌握等等。如果你是用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 " https://baijiahao.baidu.com" '建立一个空缺页
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的发送按键
上面我罗列了获取网页数据的一样平常的方法,并没有什么特殊的利用哀求,大家可以根据自己的习气来利用,这个专题之后的内容便是灵巧利用这些知识点来办理实际问题了。
本节知识点回向:
如何提交表单?如何下载图片的地址?如何得到表的数据?
积木编程的思路内涵:
在我的系列书本中一贯在强调"搭积木"的编程思路,这也是学习利用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信息获取与处理》,这是一部高等教程,涉及范围更广,实用性更强,面向中高等职员。教程共二十个专题,包括:跨运用程序信息得到、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪切板运用、Split函数扩展、事情表信息与其他运用交互,FSO工具的利用、事情表及文件夹信息的获取、图形信息的获取以及定制事情表信息函数等等内容。
大家可以根据以上资料1→3→2→6→5或者是4→3→2→6→5的顺序逐渐深入的逐渐学习。教程供应讲解的同时供应了大量的积木,如须要可以WeChat: NZ9668
学习VBA是个过程,也须要经历一种呆板的觉得
如太白诗云:众鸟高飞尽,孤云独去闲。相看两不厌,只有敬亭山。学习的过程也是修心的过程,修一个沉着的心。在代码的天下中,心沉着了,心情好了,身体自然而然就好。心静则正,内心里没有那么多邪知邪见,也就没有那么多企图。利人便是利己。这些教程也是为帮助大家起航,助上我自己之力,我的上述教程是我多的履历的通报,
"水善利万物而不争",绵绵密密,微则无声,巨则彭湃。学习亦如此,知道什么是自己所须要的,不要蜷缩在一小块自认为天国的天下里,待到晚年时再去做自欺欺人的辞吐。要努力提高自己,用一颗充满活气的心灵,把握现在,这才是进取。越是故意义的事情,困难会越多。愿力决定始终,聪慧决定成败。不管碰着什么,都是风景。看淡纷争,看轻得失落。茶,满也好,少也好,不要计较;浓也好,淡也好,个中自有值得品的味道。去感悟真实的韶光,静下心,多学习,积累福报。而不是每天混日子,也不是每天熬日子。在后疫情更加严厉的存量残杀天下中,为自己的生存进行知识的储备,特殊是新知识的储备。学习时微而无声,利用时则巨则彭湃。
每一分收成都是发展的记录,怎无凭,正是这种执着,造诣了朝霞的残酷。末了将一阙词送给致力于VBA学习的朋友,让大家感想熏染一下学习过程的呆板与执着:
浮云掠过,暗语无声,
唯有清风,惊了梦中啼莺。
望星,疏移北斗,
奈将往事雁同行。
阡陌人,昏灯明暗,
忍顾长亭。
多少VBA人,
暗夜中,悄声寻梦,盼却天明。
怎无凭!
回向学习利用VBA的历历往事,不胜感慨,谨以这些笔墨给大家,分享我多年事情实际履历的成果,随喜这些有用的东西,给确实须要利用VBA的同路人。
分享成果,随喜正能量