|
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
复制代码
- Sub 蛇口集装箱码头有限公司()
- On Error Resume Next
- With CreateObject("internetexplorer.application")
- .Visible = True
- .Navigate "http" & "://iport.sctcn.com/portal/page/portal/PG_IPort/Tab_OI?p_parametertype=ContainerInfo&p_parametervalue=OOLU7530910"
- t1 = Timer
- Do Until Timer > t1 + 6
- DoEvents
- Loop
- Do Until .ReadyState = 4
- DoEvents
- Loop
- Set r = .document.frames("loginOI").document.getElementById("criteriaForm").document.getElementById("div1")
- Debug.Print r.innerText
- Set r = Nothing
- .Quit
- End With
- End Sub
复制代码
|
|