使用VBA

时间:2017-11-10 01:31:02

标签: html vba internet-explorer web-scraping

我正在使用VBA代码(在MS Access中,但无论VBA平台如何都应该出现这个问题)来抓取特定数据的特定网页:

Option Compare Database
Option Explicit

' Requires references to    "Microsoft Internet Controls"
' Requires references to    "Microsoft HTML Object Library"

Private mFound As Boolean

Private Sub cmdGetFromIE(BaseURL as string)
    Const SND_ALIAS_SYSTEMEXCLAMATION = 8531
    Dim SW As SHDocVw.ShellWindows
    Dim IE As SHDocVw.InternetExplorer
    Dim CtrA As Long
    Dim TStart As Single
    Dim Doc As MSHTML.HTMLDocument
    Dim IncElement As MSHTML.IHTMLElement, TitleElement As MSHTML.IHTMLElement, UserElement As MSHTML.IHTMLElement

    ' ...

    Set SW = New SHDocVw.ShellWindows
    If SW.Count > 0 Then
        For CtrA = 0 To SW.Count - 1
            Set IE = SW.Item(CtrA)
            If Left(IE.LocationURL, Len(BaseURL)) = BaseURL Then
                TStart = Timer
                IE.Refresh
                Do Until (IE.ReadyState = READYSTATE_COMPLETE And Not IE.Busy) Or Timer > TStart + 30
                    DoEvents ' Sleep 1 ' Sleep Windows API call procedure  to sleep 1s
                    Debug.Print IE.LocationName, IE.LocationURL, IE.ReadyState, IE.Busy
                Loop
                If IE.ReadyState = READYSTATE_COMPLETE And Not IE.Busy Then
                    Set Doc = IE.Document
                    Set IncElement = Doc.getElementsByClassName("history-item__title ng-binding").Item
                    Set TitleElement = Doc.getElementsByClassName("history-item__details ng-binding").Item
                    Set UserElement = Doc.getElementsByClassName("person-summary__full-name_link font-size-xxl ng-binding").Item
                    Debug.Print CtrA & ";" & Val(Right(IncElement.innerText, 12)) & ";" & TitleElement.innerText & ";" & UserElement.innerText
                    ' Do stuff with the data...
                End If
            End If
        Next
        ' Do more stuff with the data...
    Else
        ' ... Do 'No IE open' stuff...
    End If
End Sub

我的问题是,如果我打开Navigation Page A,并从那里导航到Data Page B 1,则会从该页面返回正确的数据,但如果我然后导航回Navigation Page A然后导航到Data Page B 2,它是相同的形式,但包含不同的数据,此代码返回Data Page B 2的{​​{1}}的部分或全部相同数据,尽管数据页是刷新。

我甚至可以导航到Data Page B 1,然后在新标签页中打开Navigation Page A,然后返回Data Page B 1标签,然后再打开Navigation Page A另一个新标签,我仍然遇到问题,我从Data Page B 2获得部分或全部Data Page B 1数据。

Data Page B 2似乎是一个Angular-JS填充的库存表单,根据URL的数据部分有不同的数据,但这无关紧要,我想要页面的数据,因为它就在我运行的那一刻该程序,但是我是否有我的代码执行Data Page B,我仍然有这个问题。

如果我尝试IE.Refresh,我会在Set Doc = New MSHTML.HTMLDocument:Set Doc = Doc.createDocumentFromUrl(IE.LocationURL, "")收到“权限被拒绝”错误。

如何为每个IE标签抓取Doc.getElementsByClassName以获取正确的当前数据?

编辑:

我甚至不一定要使用IE来加载页面,我只需要从IE获取 URL ,如果还有另一种方法可以通过VBA加载和解析结果HTML DOM将起作用,我愿意接受它。

0 个答案:

没有答案