【问题标题】:VBA scrape HTML from URL with JavaScript elementsVBA 使用 JavaScript 元素从 URL 中抓取 HTML
【发布时间】:2019-07-02 21:42:07
【问题描述】:

使用以下代码

Sub Test()
'Must have the Microsoft HTML Object Library reference enabled
Dim oHtml As HTMLDocument
Dim oElement As Object
Dim link As String

Set oHtml = New HTMLDocument

With CreateObject("WINHTTP.WinHTTPRequest.5.1")
    .Open "GET", "https://www.afklcargo.com/WW/en/local/app/index.jsp#/tntdetails/074-26126063", False
    .Send
    oHtml.Body.innerHTML = .responseText
End With

End Sub

我无法获取实际的 HTML,我相信是因为该网站使用了 Javascript?我该如何规避这个问题,以便获得我的价值?

【问题讨论】:

    标签: excel vba web-scraping


    【解决方案1】:

    它是通过另一个 xhr 调用动态添加的,您可以在浏览器的网络选项卡中找到它。因此,将您的网址更改为该网址,然后使用 json 解析器来解析响应。

    使用 json 解析器,例如 jsonconverter.bas 来处理响应。在名为 JsonConverter 的标准模块中安装该链接中的代码后,转到 VBE > 工具 > 参考 > 添加对 Microsoft Scripting Runtime 的引用。

    您从作为 unix 时间戳返回的 json 中提取您的值。

    1561791600000  >  2019-06-29T07:00:00.000Z
    

    json 响应实际上包含有关跟踪的所有信息。您可以探索它here


    Option Explicit
    
    Public Sub Test()
        Dim json As Object
    
        With CreateObject("WINHTTP.WinHTTPRequest.5.1")
            .Open "GET", "https://www.afklcargo.com/resources/tnt/singleAwbDetails?awbId=074-26126063", False
            .send
            Set json = JsonConverter.ParseJson(.responseText)
            Debug.Print json("booking")(1)("arrivalDateLong")("local")
        End With
    End Sub
    

    两个函数,由 Schmidt 和 Navion 提供,用于将直接从 here 复制的戳记转换为日期时间。

    Function Epoch2Date(ByVal E As Currency, Optional msFrac) As Date
        Const Estart As Double = #1/1/1970#
        msFrac = 0
        If E > 10000000000@ Then E = E * 0.001: msFrac = E - Int(E)
        Epoch2Date = Estart + (E - msFrac) / 86400
    End Function
    
    Function Epoch2DateS(ByVal epochstamp$) As Date
        Epoch2DateS = CVDate(CDbl(DateSerial(1970, 1, 1)) + Int(Val(epochstamp$) / 1000#) / 86400)
    End Function
    

    注意

    使用 json 解析器是可靠且推荐的方式,但您也可以使用正则表达式或split 函数来获取值。

    【讨论】:

    • 您是如何在代码中获取此 URL 的?主帖中的 URL 与您的不同。请您为我们解释一下这一点吗?
    • @YasserKhalil 打开 Chrome /FF - 输入原始网址并加载页面。然后按 F12 并转到网络选项卡 > 按 F5 刷新页面。在网络选项卡中过滤 XHR。你会在那里看到它。见this
    • 非常感谢。另一点:UDF Epoch2DateS 我得到它来转换unix时间戳(1561791600000)..但是第一个UDF'Epoch2Date'呢。这个 UDF 是否与主题相关?你能给我举例说明如何使用这个 Epoch2Date UDF 吗?
    • 这两个函数做同样的事情,即你将 unix 时间戳传递给它们并返回一个日期时间。这只是为了展示几种不同的方式。
    猜你喜欢
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2021-03-25
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多