【问题标题】:Retrieve webpage including AJAX content检索包含 AJAX 内容的网页
【发布时间】:2017-09-19 21:04:38
【问题描述】:

我使用 VBA 从 ASX 网站 (www.asx.com.au) 检索股票价格已经有一段时间了,但是,我的脚本不再有效,因为网站已经更新,现在使用 javascripts 来构建内容。

因此,下面显示的脚本现在返回部分而不是页面内容。

VBA(漂亮的标准):

With CreateObject("WINHTTP.WinHTTPRequest.5.1")
    .Open "GET", strURL, False
    .send
    http.body.innerHTML = .responseText
End With

.responseText 包含以下内容:

<SCRIPT>
    var urlArray = window.location.hash.split('/');
    if (urlArray != null) {
      var var1 = urlArray[1];
      window.location = "http://www.asx.com.au/asx/research/companyInfo.do?by=asxCode&asxCode=" + var1;
    }
</SCRIPT>

如何像在浏览器中查看网页一样检索网页?我唯一没有尝试过的是创建一个可以从中获取 HTML 的浏览器对象。

【问题讨论】:

    标签: json vba excel web-scraping xmlhttprequest


    【解决方案1】:

    http://www.asx.com.au 网站有一个可用的 API。我在 Chrome 中为其中一家公司打开了一个页面 - AMC 通过链接 http://www.asx.com.au/asx/share-price-research/company/AMC,然后打开开发人员工具窗口 (F12)、网络选项卡,并在页面加载后检查列表中的 XHR在我点击每个部分之后。我发现了几个以 JSON 格式返回数据的 URL:

    要查看呈现数据的结构,可以将响应内容复制并粘贴到任何 JSON 查看器(例如,此在线工具 http://jsonviewer.stack.hu)。

    您可以使用下面的 VBA 代码来解析来自 URL https://www.asx.com.au/asx/1/share/AMC/prices 的响应并输出结果。 JSON.bas模块导入VBA项目进行JSON处理。

    Option Explicit
    
    Sub Test_query_ASX()
    
        Const Transposed = False ' Output option
    
        Dim sCode As String
        Dim sInterval As String
        Dim sCount As String
        Dim sJSONString As String
        Dim vJSON As Variant
        Dim sState As String
        Dim aRows()
        Dim aHeader()
    
        sCode = "AMC"
        sInterval = "daily"
        sCount = "10"
    
        ' Get JSON via API
        With CreateObject("MSXML2.XMLHTTP")
            .Open "GET", "https://www.asx.com.au/asx/1/share/" & sCode & "/prices?interval=" & sInterval & "&count=" & sCount, False
            .Send
            sJSONString = .ResponseText
        End With
        ' Parse JSON response
        JSON.Parse sJSONString, vJSON, sState
        If sState = "Error" Then
            MsgBox "Invalid JSON"
            Exit Sub
        End If
        ' Pick core data
        vJSON = vJSON("data")
        ' Convert each data set to array
        JSON.ToArray vJSON, aRows, aHeader
        ' Output array to worksheet
        With ThisWorkbook.Sheets(1)
            .Cells.Delete
            If Transposed Then
                Output2DArray .Cells(1, 1), WorksheetFunction.Transpose(aHeader)
                Output2DArray .Cells(1, 2), WorksheetFunction.Transpose(aRows)
            Else
                OutputArray .Cells(1, 1), aHeader
                Output2DArray .Cells(2, 1), aRows
            End If
            .Columns.AutoFit
        End With
        MsgBox "Completed"
    
    End Sub
    
    Sub OutputArray(oDstRng As Range, aCells As Variant)
    
        With oDstRng
            .Parent.Select
            With .Resize(1, UBound(aCells) - LBound(aCells) + 1)
                .NumberFormat = "@"
                .Value = aCells
            End With
        End With
    
    End Sub
    
    Sub Output2DArray(oDstRng As Range, aCells As Variant)
    
        With oDstRng
            .Parent.Select
            With .Resize( _
                    UBound(aCells, 1) - LBound(aCells, 1) + 1, _
                    UBound(aCells, 2) - LBound(aCells, 2) + 1)
                .NumberFormat = "@"
                .Value = aCells
            End With
        End With
    
    End Sub
    

    运行Sub Test_query_ASX() 处理数据。对我来说,Sheet1 上的输出如下:

    通过该示例,您可以通过列出的 URL 从 JSON 响应中提取所需的数据。顺便说一句,类似的方法适用于in other answers

    更新

    在网站上进行一些更改后,需要使用https://www.asx.com.au/asx/...而不是http://www.asx.com.au/b2c-api/...,所以我修复了上述所有网址。

    【讨论】:

    • 谢谢@omegastripes!今天我会试一试,然后回复你。 (在电脑和棚子之间来回穿梭,为我女儿搭建娃娃床)。干杯!
    • 你的解决方案就像一个魅力,@omegastripes。由于我只需要从 JSON 文本返回值的最后收盘价,因此可以使用字符串函数轻松完成。最有价值的是您对确定如何通过各种脚本和 API 生成 HTML 的洞察力,这对于未来的应用程序具有相当大的价值。为此,我万分感激!谢谢一百万。
    • 进行更多挖掘后,我发现asx.com.au/b2c-api/1/share/AMC/prices 返回前一天或更早的价格历史记录。要以标准延迟价格信息(20 分钟)恢复实时数据,请使用asx.com.au/b2c-api/1/share/AMC/?fields=primary_share
    • @omegastripes 我试图检查 XHR,但后来发生了变化吗?该 api 仍然有效,但也许他们的页面现在隐藏了此信息?
    • Nevermind 由于某种原因在网络而不是 XHR 下找到了它们
    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多