VBA爬虫适配嵌套字典Requestpayload获取NiftyIndices数据失败求助
解决方案
问题核心是网站要求的请求 payload 改为嵌套结构:外层是包含cinfo键的字典,cinfo的值是另一个包含索引参数的JSON字符串。以下是修改后的VBA代码:
Dim url As String Dim innerPayload As Object, outerPayload As Object Dim requestPayload As String Dim startD As Date, endD As Date Dim req As Object, responseJSON As Object ' 初始化目标日期(按需修改) startD = DateSerial(2024, 5, 1) endD = DateSerial(2024, 5, 30) url = "https://www.niftyindices.com/Backpage.aspx/getHistoricaldatatabletoString" ' 1. 构造内层参数字典(包含网站要求的所有字段) Set innerPayload = CreateObject("Scripting.Dictionary") innerPayload("name") = "NIFTY 50" innerPayload("startDate") = Day(startD) & "-" & MonthName(Month(startD), True) & "-" & Year(startD) innerPayload("endDate") = Day(endD) & "-" & MonthName(Month(endD), True) & "-" & Year(endD) innerPayload("indexName") = "NIFTY 50" ' 新增网站要求的必填字段 ' 2. 将内层字典转为JSON字符串 Dim innerJson As String innerJson = JsonConverter.ConvertToJson(innerPayload) ' 3. 构造外层字典,包裹cinfo字段 Set outerPayload = CreateObject("Scripting.Dictionary") outerPayload("cinfo") = innerJson ' 4. 生成最终的请求Payload requestPayload = JsonConverter.ConvertToJson(outerPayload) ' 发送请求并处理响应 Set req = CreateObject("MSXML2.XMLHTTP.6.0") With req .Open "POST", url, False .setRequestHeader "Content-Type", "application/json; charset=UTF-8" .setRequestHeader "X-Requested-With", "XMLHttpRequest" .send requestPayload If .Status = 200 Then Set responseJSON = JsonConverter.ParseJson(.responseText) Debug.Print responseJSON("d") ' 输出响应数据 Else Debug.Print "请求失败,状态码:" & .Status End If End With ' 释放对象 Set innerPayload = Nothing Set outerPayload = Nothing Set req = Nothing Set responseJSON = Nothing
关键修改说明:
- 补充
indexName字段:网站新的payload要求必须包含该参数,原代码缺失导致请求无效 - 嵌套结构构造:先生成内层参数的JSON,再将其作为
cinfo的值封装到外层字典,完全匹配网站要求的payload格式 - 增加状态码判断:方便快速排查请求失败的原因
注意事项:
- 确保已安装并引用
VBA-JSON库(JsonConverter依赖) - 日期格式严格遵循
DD-MMM-YYYY格式(如01-May-2024),否则网站无法解析 - 若仍返回空数据,可尝试添加
User-Agent请求头模拟浏览器访问,部分网站会验证请求来源
内容的提问来源于stack exchange,提问作者Swat
相关产品推荐
相关产品推荐

