我想从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(红圈)方便阅读)
找到所需的请求后,返回 header 选项卡并查看选项卡末尾,您将找到请求有效负载部分,即请求 body 。您可以点击查看源代码
来获取用于复制粘贴的纯文本版本。
关于javascript - 使用VBA抓取实时数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69157796/