javascript - 使用VBA抓取实时数据

标签 javascript html json vba web-scraping

我想从https://iboard.ssi.com.vn/bang-gia/hose抓取实时数据使用 VBA。

我的代码如下;但它不会返回其中包含数据的 html 文件。我寻找但也找不到 JSON 数据的链接。

Sub Get_ssi_data()
       
    Dim xmlhttp As Object
    Set xmlhttp = CreateObject("MSXML2.XMLHTTP")
    
    xmlhttp.Open "GET", "https://iboard.ssi.com.vn/bang-gia/hose"
    xmlhttp.send
    
    Debug.Print xmlhttp.responseText
      
End Sub

您能否建议如何才能获得实时数据?

最佳答案

目前尚不清楚您要查找数据的哪一部分,但我假设您需要主表。

对端点调用多个 API https://gateway-iboard.ssi.com.vn/graphql ,使用不同的请求正文来获取特定信息。

从 DevTools 中,主表的请求正文如下:

{"operationName":"stockRealtimes","variables":{"exchange":"hose"},"query":"query stockRealtimes($exchange: String) {\n  stockRealtimes(exchange: $exchange) {\n    stockNo\n    ceiling\n    floor\n    refPrice\n    stockSymbol\n    stockType\n    exchange\n    matchedPrice\n    matchedVolume\n    priceChange\n    priceChangePercent\n    highest\n    avgPrice\n    lowest\n    nmTotalTradedQty\n    best1Bid\n    best1BidVol\n    best2Bid\n    best2BidVol\n    best3Bid\n    best3BidVol\n    best4Bid\n    best4BidVol\n    best5Bid\n    best5BidVol\n    best6Bid\n    best6BidVol\n    best7Bid\n    best7BidVol\n    best8Bid\n    best8BidVol\n    best9Bid\n    best9BidVol\n    best10Bid\n    best10BidVol\n    best1Offer\n    best1OfferVol\n    best2Offer\n    best2OfferVol\n    best3Offer\n    best3OfferVol\n    best4Offer\n    best4OfferVol\n    best5Offer\n    best5OfferVol\n    best6Offer\n    best6OfferVol\n    best7Offer\n    best7OfferVol\n    best8Offer\n    best8OfferVol\n    best9Offer\n    best9OfferVol\n    best10Offer\n    best10OfferVol\n    buyForeignQtty\n    buyForeignValue\n    sellForeignQtty\n    sellForeignValue\n    caStatus\n    tradingStatus\n    currentBidQty\n    currentOfferQty\n    remainForeignQtty\n    session\n    __typename\n  }\n}\n"}

因此,您需要将上述请求正文发送到端点,该端点将为您提供一个包含主表原始数据的 JSON 响应,然后您需要自行处理它们以获得您想要的内容。

Private Sub Get_ssi_data()
           
    Dim xmlhttp As Object
    Set xmlhttp = CreateObject("MSXML2.XMLHTTP")
    
    Dim reqBody As String
    reqBody = "{""operationName"":""stockRealtimes"",""variables"":{""exchange"":""hose""},""query"":""query stockRealtimes($exchange: String) {\n  stockRealtimes(exchange: $exchange) {\n    stockNo\n    ceiling\n    floor\n    refPrice\n    stockSymbol\n    stockType\n    exchange\n    matchedPrice\n    matchedVolume\n    priceChange\n    priceChangePercent\n    highest\n    avgPrice\n    lowest\n    nmTotalTradedQty\n    best1Bid\n    best1BidVol\n    best2Bid\n    best2BidVol\n    best3Bid\n    " & _
                "best3BidVol\n    best4Bid\n    best4BidVol\n    best5Bid\n    best5BidVol\n    best6Bid\n    best6BidVol\n    best7Bid\n    best7BidVol\n    best8Bid\n    best8BidVol\n    best9Bid\n    best9BidVol\n    best10Bid\n    best10BidVol\n    best1Offer\n    best1OfferVol\n    best2Offer\n    best2OfferVol\n    best3Offer\n    best3OfferVol\n    best4Offer\n    best4OfferVol\n    best5Offer\n    best5OfferVol\n    best6Offer\n    best6OfferVol\n    best7Offer\n    best7OfferVol\n    best8Offer\n    best8OfferVol\n    best9Offer\n    best9OfferVol\n   best10Offer\n    best10OfferVol\n    buyForeignQtty\n    buyForeignValue\n    sellForeignQtty\n    sellForeignValue\n    caStatus\n    tradingStatus\n    currentBidQty\n    currentOfferQty\n    remainForeignQtty\n    session\n    __typename\n  }\n}\n""}"
    
    xmlhttp.Open "POST", "https://gateway-iboard.ssi.com.vn/graphql", False
    xmlhttp.setRequestHeader "Content-Type", "application/json"
    xmlhttp.send reqBody
    'xmlhttp.send (reqBody) 'For Excel 2013 (Credit to SIM in comment)

    Debug.Print xmlhttp.responseText

End Sub

编辑 - 查找请求正文

在 Chrome Devtools 的“网络”选项卡下,您将看到该网站向 graphql 发出了多个请求(通过 Fetch/XHR 过滤以在列表中获得较小的结果)

enter image description here

因为它们都调用相同的端点,这使得识别正确的表变得困难,所以我单击每个请求并查看其“响应”选项卡(即 JSON 字符串)。

下面可以看到,我发现了返回主表数据的请求(JSON字符串一般都是一长行,可以点击Pretty Print(红圈)方便阅读)

enter image description here

找到所需的请求后,返回 header 选项卡并查看选项卡末尾,您将找到请求有效负载部分,即请求 body 。您可以点击查看源代码来获取用于复制粘贴的纯文本版本。

enter image description here

关于javascript - 使用VBA抓取实时数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69157796/

相关文章:

javascript - ES6 类中的访问器组合

javascript - 实时追踪路线 Maps api V3

ios - 获取 JSON 值到数组

javascript - 将嵌套对象传递给 POST 请求

javascript - JavaScript 字符串中多个子字符串的计数

JavaScript 函数调用语法

javascript - 父子悬停未按预期工作

javascript - 单击链接后防止子菜单折叠(Bootstrap 3.1.1)

C# - 使用 HTML Agility 提取特定的 div 类文本

javascript - 在 d3.js 中从 Rails 访问 JSON 信息