hello年夜家好,我是健康百科网网小航来为年夜家解答以上题目,网页数据收集方式,操纵IE法提取网页数据根本良多人还不知道,此刻让我们一路来看看吧!
"VBA信息获得与处置"教程中第八个专题"VBA与HTML文档"的第七节"HTML DOM的对象事务及联系关系"太死板了,但愿想把握这方面常识的伴侣能参考我的教程进修。我们今天 起头第九个专题的进修"操纵IE抓取收集数据"。
我们的网抓部门在讲授了XMLHTTP方式后,操纵两个专题的进度进行了一些和VBA关系不是很年夜的有关收集常识的讲授,这两个专题对我们从头熟悉网抓数占有着很是主要的意义,固然我的讲授还不克不及四平八稳,但对我常常提倡的VBA定位来讲,是足够的,再者,进修是个不竭堆集进步的进程,要把握的是一些根基的理论,然后把这些利用到本身的现实中去,这才是关头。从这个专题起头我们继续网抓的进修。这个专题是操纵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的利用法式外打开一个完全的网页了,直到网页完全加载我们的操纵才能向下进行。
我们批改一下上面的那段打开空网页的代码:
Sub mynz()
Set ie = CreateObject("InternetExplorer.Application") '建立对象
ie.Visible = True '使IE页面可见,做完这一步,在VBA以外可以看到一个新的IE
ie.navigate " https://baijiahao.百度.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时网页的数据才是有用的数据。
当网页加载终了,剩下的工作就是从网页中抓取数据了,数据的抓取首要是操纵控件对象的属性和方式。
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是操纵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的同路人。
分享功效,随喜正能量
本文就为年夜家讲授到这里,但愿对年夜家有所帮忙。