网页数据采集方法(利用IE法提取网页数据基础)
网页数据采集方法(利用IE法提取网页数据基础)
"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网页页面的加载
我们修正一下上面的那段打开空网页的代码:
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的同路人。
分享成果,随喜正能量
,
-
- 社区团购是生鲜电商的一种形式吗(社区团购成生鲜电商新战场)
-
2023-08-13 18:48:30
-
- 曾经沧海难为水全诗剖析(曾经沧海难为水)
-
2023-08-13 18:46:25
-
- 表情图 爆笑gif(搞笑GIF开心一刻四肢发达)
-
2023-08-13 18:44:20
-
- 湿气重怎么排湿气最快的方法(6个方法教你去除体内湿气)
-
2023-08-13 18:42:15
-
- 大闸蟹怎么弄才好吃又简单(大厨教你4个做法)
-
2023-08-13 18:40:10
-
- 手工玫瑰花的做法教程详细(剪几个圆片就能做了)
-
2023-08-13 18:38:05
-
- 周期函数的定义与意义(周期函数概念的解析)
-
2023-08-13 18:36:00
-
- 手表品牌前十名大牌logo(这些大牌手表的表盘上)
-
2023-08-13 18:33:55
-
- 雾外江山十五年创作(雾外江山十五年创作)
-
2023-08-13 18:31:50
-
- 笔记本底座散热器推荐(笔记本散热底座入手简单评测)
-
2023-08-13 18:29:46
-
- 一生必读名人传记(值得收藏的传记经典)
-
2023-08-13 03:47:35
-
- 康师傅都有什么茶饮料(19款茶饮料口碑报告)
-
2023-08-13 03:45:30
-
- 沉默是金张国荣(张国荣死亡之谜)
-
2023-08-13 03:43:26
-
- 播客人生所有教程(想录一期属于自己的播客)
-
2023-08-13 03:41:21
-
- 今天反华势力白激动一场(今天反华势力白激动一场)
-
2023-08-13 03:39:16
-
- 身份证正反面照可以随便拍吗(身份证照可以拍三次了)
-
2023-08-13 03:37:11
-
- 藏南重要的地方(有一个人们心中神话一样存在的雪域小江南)
-
2023-08-13 03:35:06
-
- 好先生惠灵顿牛排外国厨师(米其林三星主厨和惠灵顿牛排也火了)
-
2023-08-13 03:33:01
-
- 安利纽崔莱钙片的优缺点(10款钙片测评纽崔莱)
-
2023-08-13 03:30:56
-
- 伯克利音乐学院真的有这么好吗(被国内明星捧上神坛的)
-
2023-08-13 03:28:51