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§ion=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
相关产品推荐
相关产品推荐

