You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA调用NSE India股票API解析JSON报错:Expecting '{' or '['求助

解决VBA调用NSE India API时的JSON解析错误

你遇到的核心问题是NSE India的API反爬机制拦截了你的请求,导致返回的不是预期的JSON数据,而是HTML页面——这就是错误提示里出现<!Doctype的原因,JsonConverter自然无法将HTML解析为JSON。

问题分析

错误提示 error parsing json <!Doctype h ^ expecting '{' or '[' 已经给出了明确线索:API返回的内容开头是HTML的文档声明,而非JSON格式要求的{或[。这是因为NSE的API会验证请求是否来自合法的浏览器环境,你的VBA请求缺少必要的请求头,被判定为非浏览器请求,所以返回了反爬验证页面。

解决方案

在发送GET请求前,添加模拟浏览器的请求头,让API认为你的请求来自正常浏览器。修改后的代码如下:

Sub JnewCOP22()
    Dim req As New MSXML2.XMLHTTP60
    Dim URL As String
    Dim json As Object, r As Variant
    URL = "https://www.nseindia.com/api/quote-equity?symbol=DRREDDY&section=trade_info"
    
    With req
        .Open "GET", URL, False
        ' 添加模拟浏览器的请求头,核心是User-Agent
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
        .setRequestHeader "Accept", "application/json, text/javascript, */*; q=0.01"
        .send
        
        ' 可选:先打印返回内容验证是否获取到正确JSON
        ' Debug.Print .responseText
        
        Set json = JsonConverter.ParseJson(.responseText)
        r = json("securityWiseDP")("quantityTraded")
    End With
    MsgBox r
End Sub

关键修改说明

  • User-Agent头:这是最核心的部分,告诉服务器你的请求来自主流浏览器,避开基础反爬拦截。如果后续失效,可以从自己浏览器的开发者工具中复制最新的User-Agent值替换。
  • Accept头:明确告知服务器你期望接收JSON格式的数据,避免返回默认的HTML内容。
  • 可选补充:如果仍然失败,可以尝试添加Referer头(值设为https://www.nseindia.com/get-quotes/equity?symbol=DRREDDY),进一步模拟浏览器从NSE官网跳转的请求行为。

验证小技巧

在调用JsonConverter.ParseJson之前,可以先执行Debug.Print .responseText查看返回内容:

  • 如果输出的是你提供的预期JSON结构,说明请求成功;
  • 如果还是返回HTML,可能需要更新请求头参数,或者检查是否需要携带特定Cookie(部分场景下NSE会验证会话Cookie)。

内容的提问来源于stack exchange,提问作者Jugal Kishor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 21:22:49