VBA使用JavaScript元素从URL抓取HTML

时间:2019-07-02 21:42:07

标签: excel vba web-scraping

使用以下代码

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吗?我该如何规避这一点,以便获得价值?

enter image description here

1 个答案:

答案 0 :(得分:3)

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

使用json解析器(例如jsonconverter.bas)来处理响应。在该链接中的代码安装到名为JsonConverter的标准模块中之后,请转到VBE>工具>引用>添加对Microsoft脚本运行时的引用。

您从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

N.B。

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