使用VBA抓取实时数据

2024-04-28

我想从中抓取实时数据https://iboard.ssi.com.vn/bang-gia/hose 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 过滤以获得列表中较小的结果)

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

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

找到所需的请求后,请返回Headers选项卡并查看选项卡的末尾,您会发现请求有效负载请求正文部分。您可以点击view source获取用于复制粘贴的纯文本版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用VBA抓取实时数据 的相关文章

随机推荐