排行
数据库百科
核心案例
行业报告
月度解读
大事记
产业图谱
中国数据库
向量数据库
时序数据库
实时数据库
搜索引擎
空间数据库
图数据库
数据仓库
大调查
2021年报告
2022年报告
年度数据库
2020年openGauss
2021年TiDB
2022年PolarDB
2023年OceanBase
首页
资讯
活动
大会
学习
课程中心
推荐优质内容、热门课程
学习路径
预设学习计划、达成学习目标
知识图谱
综合了解技术体系知识点
课程库
快速筛选、搜索相关课程
视频学习
专业视频分享技术知识
电子文档
快速搜索阅览技术文档
文档
问答
服务
智能助手小墨
关于数据库相关的问题,您都可以问我
数据库巡检平台
脚本采集百余项,在线智能分析总结
SQLRUN
在线数据库即时SQL运行平台
数据库实训平台
实操环境、开箱即用、一键连接
数据库管理服务
汇聚顶级数据库专家,具备多数据库运维能力
数据库百科
核心案例
行业报告
月度解读
大事记
产业图谱
我的订单
登录后可立即获得以下权益
免费培训课程
收藏优质文章
疑难问题解答
下载专业文档
签到免费抽奖
提升成长等级
立即登录
登录
注册
登录
注册
首页
资讯
活动
大会
课程
文档
排行
问答
我的订单
首页
专家团队
智能助手
在线工具
SQLRUN
在线数据库即时SQL运行平台
数据库在线实训平台
实操环境、开箱即用、一键连接
AWR分析
上传AWR报告,查看分析结果
SQL格式化
快速格式化绝大多数SQL语句
SQL审核
审核编写规范,提升执行效率
PLSQL解密
解密超4000字符的PL/SQL语句
OraC函数
查询Oracle C 函数的详细描述
智能助手小墨
关于数据库相关的问题,您都可以问我
精选案例
新闻资讯
云市场
登录后可立即获得以下权益
免费培训课程
收藏优质文章
疑难问题解答
下载专业文档
签到免费抽奖
提升成长等级
立即登录
登录
注册
登录
注册
首页
专家团队
智能助手
精选案例
新闻资讯
云市场
微信扫码
复制链接
新浪微博
分享数说
采集到收藏夹
分享到数说
首页
/
IE法提取网页数据
IE法提取网页数据
VBA语言専攻
2022-04-16
108
【分享成果,随喜正能量】我们不良的行为、不善的念头、不好的言语,都属于我们内心的暴力,要想获得平和,我们需要自我修习,学会控制情绪,学会内观反省并接近善良。。
《VBA信息获取与处理》教程是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪贴板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。是非常抽象的,更具研究的价值。
教程共两册,八十四讲。今日的内容是专题九“利用IE抓取网络数据”: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的发送按键
上面我罗列了获取网页数据的一般的方法,并没有什么特别的使用要求,大家可以根据自己的习惯来利用,这个专题之后的内容就是灵活运用这些知识点来解决实际问题了。
本节知识点回向:
如何提交表单?如何下载图片的地址?如何获得表的数据?
【分享成果,随喜正能量】得意之时淡然,失意之时坦然,顺风顺水的时候需要一种内敛和沉稳,遭遇逆境和挑战的时候,要有一份举重若轻、生命昂扬的生命展望,就算匍匐于岁月尘埃,也要仰望生命的星辰灿烂。
。
我20多年的VBA实践经验,全部浓缩在下面的各个教程中,教程学习顺序
:
vba
ie
文章转载自
VBA语言専攻
,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
领墨值
有奖问卷
意见反馈
客服小墨