ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: new4w

[讨论] VBA网页取数据的若干问题总结

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-8-13 14:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:网页交互
七、此方法的优、缺点
一、优点之一,自动对js代码等网页语言解析,缺点是慢。


基本上可以这样说,他的优点就是他的缺点,他的优点是他会对网页语言进行解析和运算,所以产生了一个问题,速度慢,当然之所以用这个技术方法,也是因为他对网页语言进行解析和运算,这样很多js代码就能得到恰当解析,方便数据下载,而用其他方法,基本是绕过js代码解析的,直接不经过浏览器运算,获取想要的数据,所以其他方法会快,但是要找到大量js代码产生的数据,似乎是一件麻烦事情。

二、缺点:内存消耗过大,有时候直至内存耗尽而崩溃。

但是这个问题似乎有解决方法,但是这个方法,目前本人暂时还没有理解和掌握,现将解决方法的文章链接列出,如果有朋友看后能够解决这个问题,麻烦详细跟我说下,这个问题很困扰我
http://blog.csdn.net/icbyboy/article/details/8519756?reload



补充内容 (2013-10-3 09:38):
还有个很麻烦的问题,就是对加载完成的判断,这个相当麻烦,尤其是很多js引用还有框架结构,致使很多代码用来做加载完成判断,搞的代码又臭又长,而且相当不稳定,十分难以解决

补充内容 (2014-1-2 12:24):
这个内存消耗过大,直至崩溃已经解决,原因是前面一直将webbroswer控件插入到表格中,而不是窗体,具体见14楼

TA的精华主题

TA的得分主题

发表于 2013-8-15 10:55 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-8-15 11:57 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-9-13 10:11 | 显示全部楼层
八、webbroswer方法缺点的一些解决方法
经过最近一段时间的学习和实践,针对11楼提到的2个问题,我已经成功的解决了第二个问题,内存崩溃,第一个问题的解决方法,似乎就要根据网页情况,选择不同的网页数据获取方法了,再现有的几个方法中,根据问题选择最合适的方法。所以第一个问题其实不是问题的问题,这个将作为一个延展,我会随着学习,再开一个单独帖子。

现在说下第二个问题,内存崩溃的解决方法:
我遇到这个问题的原因是,我将webbroswer控件画到了工作表中,sheets(1)中,随着运行,内存崩溃,程序自动关闭,或者提示程序出现问题。
我的解决方法是:将webbroswer控件放到窗体上,通过新建一个窗体,把webbroswer控件划到窗体上,然后写代码到窗体,最后在代码结束位置加上
Set WebBrowser1 = Nothing


QQ截图20130913095812.png
傲游截图20130913095905.png
QQ截图20130913100009.png

TA的精华主题

TA的得分主题

发表于 2013-9-13 10:53 | 显示全部楼层
webbroswer方法——可以说是属于淘汰的方法
360软件小助手截图20130913105056.jpg

TA的精华主题

TA的得分主题

发表于 2013-9-13 10:57 | 显示全部楼层
webbroswer方法,淘汰的方法,不宜在这此浪费学习时间

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-9-13 11:14 | 显示全部楼层
以下内容是对9楼内容的更正或者补充:
六、一些网页操作注意细节
1、click无反应
通常原因为没有定位到正确的位置,click的发生,是因为存在链接,所以一定要定位到链接的元素上,注意不是定位到链接上,是定位到链接的元素上,比如<ul id=googl>
<li id=book>
<a id=baidu title="百 度" href="http://www.baidu.com/index.php?tn=monline_5_dg" sid="8">百 度
</a>
</li>
</ul>
你click是click的A元素,不是href,代码就是getelementbyid("baidu").click,而不是getelementbyid("baidu").href.click,更不是getelementbyid("googl"),再click,否则就失效了。


2、获取网页数据,在循环时,尽量先判断,再执行;
如果先执行,再判断可能会出现执行的第一步网页还没有加载好,而执行的第二步网页此时正好加载好,这里就存在出现漏洞的机会


3、注意每一次点击后,都要加入代码判断点击后网页是否加载完毕,否则容易出现问题,这里判断的方法推荐用1楼中的对加载完毕的判断方法。


4、涉及循环的时候,尽量加入doevents 这个语句,可以防止程序陷入假死状态


5、为了防止webbrowser控件,经常弹出脚本错误,首选在ie浏览器里面设置好,显示每个脚本错误,去掉勾选,然后在程序中加入代码 webbrowser.silent=ture


6、现在某些网页出现了动态加载页面内容:
QQ截图20130913110330.png
这样的网页当你不滚动滚动条时,窗口以下的页面位置不加载内容,当你滚动条往下滚动后,页面内容会根据滚动条的位置陆续加载,这样的网页对数据提取存在问题,比如你获得的某段代码的数组实际是10,但是结果会是4,或者5,这样你提取肯定是残缺的,不过这样的网页一般有个特征,动态加载的部分是页面中的一部分,所以确定非动态加载内容C相对于网页的位置,然后控制网页滚动条滚动到C处,此时B处由于滚动条滚动超过了B处,所以B会自动加载内容,但是可能没有加载完,但是此时C的位置相对网页来说是发生了变化的,然后再获取C的位置,再让滚动条滚动到C处,直到滚动条再次滚动,C的位置也不会发生变化了,就证明动态加载内容加载完成。
实现的代码是:
sub downms()
  t = mubiao
  WebBrowser1.Document.parentWindow.scrollBy 0, mubiao   '滚动条滚动到目标代码处
  DoEvents
Loop Until mubiao = t
。。。
end sub

Function mubiao() As Long
Do
   DoEvents   
   mubiao = WebBrowser1.Document.getelementsbyclassname("c元素代码")(0).getBoundingClientRect("c元素代码").Top
End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-9-13 11:23 | 显示全部楼层
引子玄 发表于 2013-9-13 10:53
webbroswer方法——可以说是属于淘汰的方法

或许吧,不过这个方法对我现在的问题解决来说相当好,而且请教过这方面的高人,他说用webbroswer方法比较适合我的问题,很多网页存在着盗链,很多网页用js代码编写,但是有时候所需要的操作需要登录用户名,这个方法好处是万能,缺点是效率不高,现在基本完成了对这个方法的学习,下面会陆续学习其他网页抓取技术

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-3 09:26 | 显示全部楼层
引子玄 发表于 2013-9-13 10:57
webbroswer方法,淘汰的方法,不宜在这此浪费学习时间

我看你的截图中,有很多做网页抓取的必须资料,能否发一份共享下?{:soso_e113:}

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-3 09:46 | 显示全部楼层
本帖最后由 new4w 于 2013-10-3 09:47 编辑

九、webbrowser方法升级版---IE法
因为webbrowser方法,存在一些小问题,我个人理解的不方便地方有:需要设置窗体、设置窗体按钮、而且缺少很多辅助功能,比如网页设置等,还有就是可视与非可视等,将控制窗体控件升级成单独控制IE浏览器,算是一种比较好的升级,但是网页的编写方法和内容其实跟webbrowser方法是一样的,只是ie方法需要在代码前面创建ie对象,然后将原来webbrowser1的内容更改为ie的实例化对象。

代码前创建ie对象:
Set iea = CreateObject("InternetExplorer.Application")  '创建对象

这里注意最好加入一段代码: iea.Visible = True   '使IE页面可见,做完这一步,在VBA之外可以看到一个新的IE,false就是不可见

然后下面代码还用前面的webbrowser内容,将webbrowser1改为iea,ie法学会了。

但是ie法跟webbrowser方法有着相似的问题,就是11楼中提到的速度慢,效率低,而且跟webbrowser方法一样,还有个非常麻烦的问题就是对网页加载完成的判断,这个判断十分麻烦,尤其当你遇到网页中需要加载js的,还有框架结构,加载外调js成功的判断非常棘手,即使这次调试解决了问题,但是下一次运行,仍然可能有问题,所以真正好用的解决方法是脱离webbroswer方法和ie方法,用XMLHTTP方法,直接从需要下载数据的目标网页下载数据,这样对加载完毕的判断十分容易,只需要判断当前网页的状态就可以完成,而且获取数据也相当简单,去掉了大量不需要的代码,也不需要经过浏览器解析代码,完美的解决了11楼中所说的问题。

不过这个方法要求我们对网页的了解更深一步,后面我会结合我对这种方法的学习和了解,进一步更新帖子

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 05:28 , Processed in 0.053917 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表