使用VBA XMLHTTP(非IE)抓取纳斯达克网站表格返回空值问题求助
问题原因
返回值为空是因为纳斯达克目标页面的收益表格是JavaScript动态渲染的内容,你直接用XMLHTTP请求拿到的是未执行JS的初始HTML源码,里面不存在.earnings-surprise__table对应的DOM节点,所以选择器返回空值。
修复方案
直接请求页面背后的官方数据接口即可,不需要解析HTML,数据更稳定也更容易处理。你需要在请求时补充请求头避免被接口拦截,修改后的代码如下:
Public Sub GetTableMayank() Dim ws As Worksheet, jsonResp As Object, earningsData As Object Dim r As Long, c As Long, item As Object Set ws = ThisWorkbook.Worksheets("Sheet1") r = 1 ' 写入表头 ws.Cells(r, 1) = "财报日期" ws.Cells(r, 2) = "每股收益预期" ws.Cells(r, 3) = "实际每股收益" ws.Cells(r, 4) = "超预期百分比" r = r + 1 With CreateObject("MSXML2.XMLHTTP.6.0") ' 直接请求官方数据接口,替换URL中的股票代码即可适配其他股票 .Open "GET", "https://api.nasdaq.com/api/company/ctxs/earnings-surprise", False ' 补充请求头避免403拦截 .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" .setRequestHeader "Accept", "application/json" .send If .Status = 200 Then ' 解析JSON返回结果,需要提前引入VBA-JSON库 Set jsonResp = JsonConverter.ParseJson(.responseText) Set earningsData = jsonResp("data")("earningsSurpriseTable")("rows") For Each item In earningsData ws.Cells(r, 1) = item("date") ws.Cells(r, 2) = item("consensusEstimate") ws.Cells(r, 3) = item("actualEarnings") ws.Cells(r, 4) = item("surprisePercentage") r = r + 1 Next End If End With End Sub
补充说明
- 如果不想引入VBA-JSON解析库,也可以用正则表达式匹配返回的JSON字符串中的对应字段提取数据。
- 如果必须要解析渲染后的HTML,可以使用Selenium调用Chrome/Edge无头浏览器实现,不需要依赖IE,兼容性更强。
内容的提问来源于stack exchange,提问作者Mayank
相关产品推荐
相关产品推荐

