Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 7913|回复: 3

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

[复制链接]
发表于 2012-4-5 17:18 | 显示全部楼层 |阅读模式
Q:如何获取http://iport.sctcn.com/portal/pa ... ervalue=OOLU7530910,框架内的页面数据,如图,


A:框架页面是运用**页技术,用脚本写出来的,没有实际的URL,无法用之前的帖子所讲的方法绕过框架页面禁止访问的做法。
如果直接访问该框架页面,会出现,禁止跨域访问的提示。
大家可以使用如下程序试看看,试图访问框架内数据,系统是不允许的。
  • Public flag '设置标记
  • Sub t()
  • Dim t As Single, dm
  •     flag = False
  •     UserForm1.Show 0 '显示窗体
  •     UserForm1.WebBrowser1.Navigate "http://iport.sctcn.com/portal/page/portal/PG_IPort/Tab_OI?p_parametertype=ContainerInfo&p_parametervalue=OOLU7530910" '激活网页
  •     Do Until UserForm1.WebBrowser1.Busy = False And UserForm1.WebBrowser1.ReadyState = READYSTATE_COMPLETE '一下均是等待加载框架页面加载完毕
  •         DoEvents
  •     Loop
  •     Do Until flag = True
  •         DoEvents
  •     Loop
  •     t = Timer
  •     Do Until Timer = t + 1
  •         DoEvents
  •     Loop
  •     Set dm = UserForm1.WebBrowser1.Document.frames(0).Document '直接访问框架内页面,将被禁止。
  • End Sub

复制代码
将提示如图,这是由于微软禁止跨域访问造成的。为了安全性的考虑。


引用Edanmo's OLE inte**ces & functions 是国外一个高手Edanmo写的OLELIB.TLB,作为框架的容器。
解压缩附件OLELIB.zip,放在C:\WINDOWS\system32里面就可以了。具体代码如下:
  • Option Explicit
  • Public flag As Boolean
  • Sub t()
  •     Dim getf As WebBrowser, dm As Object, tb As Object, t As Single
  •     flag = False
  •     UserForm1.cf = 0
  •     UserForm1.Show 0
  •     UserForm1.WebBrowser1.navigate "http://iport.sctcn.com/portal/page/portal/PG_IPort/Tab_OI?p_parametertype=ContainerInfo&p_parametervalue=OOLU7530910" '激活网页
  •     Do Until UserForm1.WebBrowser1.Busy = False And UserForm1.WebBrowser1.readyState = READYSTATE_COMPLETE '待加载完毕
  •         DoEvents
  •     Loop
  •     Do Until flag = True
  •         DoEvents
  •     Loop
  •     t = Timer
  •     Do Until Timer = t + 1
  •         DoEvents
  •     Loop
  •     Set getf = getFrames(UserForm1.WebBrowser1) '把框架页面用容器进行剥离
  •     Set dm = getf.document '提取文档体
  •     Set tb = dm.all("tableInfo2") '获取数据表
  •     MsgBox tb.Rows(5).Cells(4).innerText '提取所需数据
  • End Sub
  • Function getFrames(ByVal WB As WebBrowser) As Object '剥离页面框架的函数
  •     Dim pContainer As olelib.IOleContainer
  •     Dim pEnumerator As olelib.IEnumUnknown
  •     Dim pUnk As olelib.IUnknown
  •     Dim pBrowser As WebBrowser
  •     Set pContainer = WB.document '取得主页面文档
  •     If pContainer.EnumObjects(OLECONTF_EMBEDDINGS, pEnumerator) = 0 Then '历遍主页面文档框架
  •         Set pContainer = Nothing
  •         Do While pEnumerator.Next(1, pUnk) = 0
  •             Set pBrowser = pUnk
  •             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中的某个关键字符
  •                 Set getFrames = pBrowser '提取框架
  •                 Exit Function
  •             End If
  •         Loop
  •         Set pEnumerator = Nothing
  •     End If
  • End Function

复制代码
窗体里面的代码如下:
  • Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
  • If pDisp Is WebBrowser1 Then '页面含框架页面加载完毕,pDisp返回的是webbrowser自身
  •    flag = True
  • End If
  • End Sub

复制代码
最佳答案
2012-12-13 06:45
  1. Sub 蛇口集装箱码头有限公司()
  2.     On Error Resume Next
  3.     With CreateObject("internetexplorer.application")
  4.         .Visible = True
  5.         .Navigate "http" & "://iport.sctcn.com/portal/page/portal/PG_IPort/Tab_OI?p_parametertype=ContainerInfo&p_parametervalue=OOLU7530910"
  6.         t1 = Timer
  7.         Do Until Timer > t1 + 6
  8.             DoEvents
  9.         Loop
  10.         Do Until .ReadyState = 4
  11.             DoEvents
  12.         Loop
  13.         Set r = .document.frames("loginOI").document.getElementById("criteriaForm").document.getElementById("div1")
  14.         Debug.Print r.innerText
  15.         Set r = Nothing
  16.         .Quit
  17.     End With
  18. End Sub
复制代码
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2012-4-5 17:41 | 显示全部楼层
回复

使用道具 举报

发表于 2012-12-13 06:45 | 显示全部楼层    本楼为最佳答案   
  1. Sub 蛇口集装箱码头有限公司()
  2.     On Error Resume Next
  3.     With CreateObject("internetexplorer.application")
  4.         .Visible = True
  5.         .Navigate "http" & "://iport.sctcn.com/portal/page/portal/PG_IPort/Tab_OI?p_parametertype=ContainerInfo&p_parametervalue=OOLU7530910"
  6.         t1 = Timer
  7.         Do Until Timer > t1 + 6
  8.             DoEvents
  9.         Loop
  10.         Do Until .ReadyState = 4
  11.             DoEvents
  12.         Loop
  13.         Set r = .document.frames("loginOI").document.getElementById("criteriaForm").document.getElementById("div1")
  14.         Debug.Print r.innerText
  15.         Set r = Nothing
  16.         .Quit
  17.     End With
  18. End Sub
复制代码

评分

参与人数 1学分 +2 收起 理由
cutecpu + 2 学习了

查看全部评分

回复

使用道具 举报

发表于 2021-1-24 13:19 | 显示全部楼层
本帖最后由 zslyx 于 2021-1-24 23:25 编辑

试过了。非常极其以及特别的NB!解决了大问题!
就是WB.document 和 URL 没法设变量。只能设多几个function!
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-19 14:54 , Processed in 0.340010 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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