使用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抓取实时数据 的相关文章

  • 查找第一个可滚动父级

    我遇到这种情况 需要将元素滚动到视口中 问题是我不知道哪个元素是可滚动的 例如 在纵向中 主体是可滚动的 而在横向中 它是另一个元素 还有更多情况会更改可滚动元素 现在的问题是 给定一个需要滚动到视口中的元素 找到其第一个可滚动父元素的最佳
  • 在 Graal.js 中使用 java 类

    使用 Graal js 如何将 java 类导入到 JS 脚本中 以下代码适用于 Nashorn JJS 但不适用于 Graal js 因为没有Java type 在graal中 我需要在某个时候调用truffle吗 var ArrayLi
  • 从Excel工作表中读取汉字? (总是返回“???”)

    如何从Excel单元格中读取汉字并将其写入文件 当我取值时 Worksheets ActiveCell Worksheet Name Cells 3 columnNumbers 0 value 它总是返回 Dim fileStream Fi
  • IE7 真的不支持indexOf javascript 吗? [复制]

    这个问题在这里已经有答案了 可能的重复 数组上的 indexOf 函数在使用 JavaScript 的 IE7 8 中不起作用 https stackoverflow com questions 11544983 indexof funct
  • React:在哪里扩展对象原型

    我使用创建了一个纯 React 应用程序创建反应应用程序 https github com facebookincubator create react app 我想延长String类并在一个或多个组件中使用它 例如 String prot
  • 接近堆限制的无效标记压缩分配失败 - JavaScript 堆内存不足

    我正在使用 Angular 7 2 当我进入ng serve 我面临以下问题 致命错误 接近堆限制的无效标记压缩分配失败 JavaScript 堆内存不足 这意味着什么 我该如何解决这个问题 完整的错误消息是 FATAL ERROR Ine
  • 如何在C#中使用默认浏览器打开带有锚点(#)的html文件

    我正在尝试在 C 中打开上下文帮助文件 当我没有指定锚点时 它工作得很好 Process Start C Help Help htm 但是当我指定锚点时 它不会打开 Process Start C Help Help htm Toc3420
  • Magnific Popup:来自span的源标题

    我想从锚标记内的隐藏标题字段中获取放大图像的标题 而不是从标题中获取 这是因为我的标题包含标记 HTML a href img zoom jpg img src img small jpg alt span class hide This
  • bash 脚本抱怨文件名太长

    所以我有一个脚本可以执行此操作 jq 是命令行 JSON 处理器 echo Getting LB Node IDs echo LB STATUS jq loadBalancer nodes id 最后一行的输出是 1 2 3 但是当我尝试将
  • 显示仅允许数字和小数点的输入?

    有什么方法可以定义一个
  • React:设置 State 或设置 Prop 而无需重新渲染

    Problem 目前 我有一个LoginForm具有 成功 处理函数的组件handleOnSuccess 然后将其链接到父组件onTokenUpdate由 令牌更新 处理函数定义的属性handleUpdateToken 问题是setStat
  • JavaFX:在 WebView img 标签中未加载本地图像

    以下是我的代码 一切安好 我可以加载远程页面 我可以放置 HTML 内容 但我的img标签显示一个X标志表示无法加载图像 Note 我的图像与类位于同一个包中JavaFX在 Smiley 文件夹中 我可以列出所有图像 这意味着路径没有问题
  • NSData 不接受有效的 base64 编码字符串

    我正在 iOS 7 客户端实现 JSON Web Token 身份验证 效果很好 我的应用程序接收令牌 并可以使用它们对我的服务器进行经过身份验证的调用 现在 我希望我的客户端代码检查令牌的过期日期 以便它知道何时重新进行身份验证 检查 J
  • JSON 从子对象获取父对象

    我怎样才能得到discount值如果品牌id 983 示例 JSON prods info rate 100 grocery brand A brand id 983 brand B
  • Android - 下载 JSON 数据并保存到共享首选项

    我正在从 PHP 服务读取 JSON 数据 每当该 JSON 的版本发生变化时 我想将其存储在 Android 上 用新数据替换旧数据 JSON 仅用于填充 Spinner 我的问题是 JSON 有 36KB 可以将其存储在共享首选项中有一
  • 通过 Javascript 填充 ReactJS HTML 表单

    我正在开发一个应用程序 在打开第 3 方网站后 我可以在浏览器上下文中运行我自己的 Javascript 作为一个基于reactjs构建并具有登录表单的示例网站 您可以参考此链接 我正在尝试在reactjs生成的表单中填写用户名和密码 但是
  • 当CSS文件存在时,无法在服务器上找到它们[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 当运行本地服务器时 这一切都运行良好 我有 header html 其中包含以下代码 在 public html 目录 与 header h
  • 使用 mongoimport 从 Windows 文件夹批量导入 MongoDB

    我的存档中有很多 json 文件 我需要将它们导入到 mongo 每一个操作中 我认为它可能是循环的 你对此有什么想法吗 如果您使用的是 Linux Unix shell 您可以尝试 for filename in do mongoimpo
  • 为什么 JDOM 的 getChild() 方法返回 null?

    我正在做一个关于 html 文档操作的项目 我想要现有 html 文档中的正文内容将其修改为新的 html 现在我正在使用 JDOM 我想在我的编码中使用 body 元素 为此 我在编码中使用了 getChild body 但它向我的程序返
  • localStorage 获取 NULL?

    我不知道为什么 因为我之前已经这样做过并且工作正常 我认为这可能是因为浏览器问题 错误 localStorage setItem foo bar alert localStorage getItem foo 我使用的是 Firefox 3

随机推荐