ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何使用VBA获取禁止跨域访问的框架页面的数据

如何使用VBA获取禁止跨域访问的框架页面的数据

作者:绿色风 分类: 时间:2022-08-17 浏览:142
楼主
xmyjk
Q:如何获取http://iport.sctcn.com/portal/page/portal/PG_IPort/Tab_OI?p_parametertype=ContainerInfo&p_parametervalue=OOLU7530910,框架内的页面数据,如图,

 

A:框架页面是运用**页技术,用脚本写出来的,没有实际的URL,无法用之前的帖子所讲的方法绕过框架页面禁止访问的做法。
如果直接访问该框架页面,会出现,禁止跨域访问的提示。
大家可以使用如下程序试看看,试图访问框架内数据,系统是不允许的。

拒绝示例.zip
  1. Public flag '设置标记
  2. Sub t()
  3. Dim t As Single, dm

  4.     flag = False
  5.     UserForm1.Show 0 '显示窗体
  6.     UserForm1.WebBrowser1.Navigate "http://iport.sctcn.com/portal/page/portal/PG_IPort/Tab_OI?p_parametertype=ContainerInfo&p_parametervalue=OOLU7530910" '激活网页
  7.     Do Until UserForm1.WebBrowser1.Busy = False And UserForm1.WebBrowser1.ReadyState = READYSTATE_COMPLETE '一下均是等待加载框架页面加载完毕
  8.         DoEvents
  9.     Loop
  10.     Do Until flag = True
  11.         DoEvents
  12.     Loop
  13.     t = Timer
  14.     Do Until Timer = t + 1
  15.         DoEvents
  16.     Loop
  17.     Set dm = UserForm1.WebBrowser1.Document.frames(0).Document '直接访问框架内页面,将被禁止。
  18. End Sub
将提示如图,这是由于微软禁止跨域访问造成的。为了安全性的考虑。

 

引用Edanmo's OLE inte**ces & functions 是国外一个高手Edanmo写的OLELIB.TLB,作为框架的容器。
解压缩附件OLELIB.zip,放在C:\WINDOWS\system32里面就可以了。具体代码如下:
  1. Option Explicit
  2. Public flag As Boolean
  3. Sub t()
  4.     Dim getf As WebBrowser, dm As Object, tb As Object, t As Single
  5.     flag = False
  6.     UserForm1.cf = 0
  7.     UserForm1.Show 0
  8.     UserForm1.WebBrowser1.navigate "http://iport.sctcn.com/portal/page/portal/PG_IPort/Tab_OI?p_parametertype=ContainerInfo&p_parametervalue=OOLU7530910" '激活网页
  9.     Do Until UserForm1.WebBrowser1.Busy = False And UserForm1.WebBrowser1.readyState = READYSTATE_COMPLETE '待加载完毕
  10.         DoEvents
  11.     Loop
  12.     Do Until flag = True
  13.         DoEvents
  14.     Loop
  15.     t = Timer
  16.     Do Until Timer = t + 1
  17.         DoEvents
  18.     Loop
  19.     Set getf = getFrames(UserForm1.WebBrowser1) '把框架页面用容器进行剥离
  20.     Set dm = getf.document '提取文档体
  21.     Set tb = dm.all("tableInfo2") '获取数据表
  22.     MsgBox tb.Rows(5).Cells(4).innerText '提取所需数据
  23. End Sub

  24. Function getFrames(ByVal WB As WebBrowser) As Object '剥离页面框架的函数
  25.     Dim pContainer As olelib.IOleContainer
  26.     Dim pEnumerator As olelib.IEnumUnknown
  27.     Dim pUnk As olelib.IUnknown
  28.     Dim pBrowser As WebBrowser

  29.     Set pContainer = WB.document '取得主页面文档
  30.     If pContainer.EnumObjects(OLECONTF_EMBEDDINGS, pEnumerator) = 0 Then '历遍主页面文档框架
  31.         Set pContainer = Nothing
  32.         Do While pEnumerator.Next(1, pUnk) = 0
  33.             Set pBrowser = pUnk
  34.             If pBrowser.LocationURL Like "http://iport.sctcn.com/oi/action?SSOToken=*&ParameterType=ContainerInfo&ParameterValue=OOLU7530910&LocaleCode=zhs&moduleName=oi&logout=&loginUrl=" Then   '可以在这里加条件判断得到指定的frame,基本可以根据url或者innerHTML中的某个关键字符
  35.                 Set getFrames = pBrowser '提取框架
  36.                 Exit Function
  37.             End If
  38.         Loop
  39.         Set pEnumerator = Nothing
  40.     End If
  41. End Function
窗体里面的代码如下:
  1. Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
  2. If pDisp Is WebBrowser1 Then '页面含框架页面加载完毕,pDisp返回的是webbrowser自身
  3.    flag = True
  4. End If
  5. End Sub

OLELIB.zip
wa1.rar
2楼
亡者天下
禁止跨越访问是什么意思啊?

谢谢!
3楼
xmyjk
可以参阅:http://blog.sina.com.cn/s/blog_4adf2a990100uxaj.html
4楼
千年一梦遥
先抱回家,再慢慢研究.
5楼
老糊涂
学习

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap