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

如何使用VBA抓取雅虎财经无table对象的数据导入Excel

核心原因

QueryTables.Add方法仅能识别页面初始静态响应中包裹在标准<table>标签内的内容。雅虎财经财务板块的三类报表数据,是页面初始加载完成后通过JavaScript异步拉取、用div元素动态拼接渲染的,没有使用原生HTML table结构,因此检查元素时找不到对应的table对象,也无法通过QueryTables直接完成导入。

实现方案

优先选择提取结构化数据源,比解析渲染后的DOM效率更高、稳定性更强:

  • 直接请求目标财务页的URL,在返回的静态源码中搜索__APP_DATA__关键字,就能找到内嵌在script标签里的全量JSON格式数据,包含利润表、资产负债表、现金流量表的所有字段和数值,不需要等待JS渲染、也不需要模拟浏览器操作。
  • 也可以打开F12开发者工具,切换到「网络」面板筛选Fetch/XHR请求,刷新页面后找到返回财务数据的后端接口,直接调用接口拿到纯JSON数据,解析逻辑更简单。

VBA实现参考代码(采用后期绑定,无需提前加载引用库):

Sub ImportYahooFinancials()
    Dim http As Object, pageSource As String, jsonRaw As String
    Dim ws As Worksheet, startPos As Long, endPos As Long
    Set ws = ActiveSheet
    
    ' 发起HTTP请求获取页面源码
    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
    http.Open "GET", "目标雅虎财务页地址", False
    ' 模拟浏览器请求头,避免被反爬拦截
    http.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
    http.send
    pageSource = http.responseText
    
    ' 提取内嵌的JSON数据块
    startPos = InStr(pageSource, "window.__APP_DATA__ = ") + Len("window.__APP_DATA__ = ")
    endPos = InStr(startPos, pageSource, ";</script>")
    jsonRaw = Mid(pageSource, startPos, endPos - startPos)
    
    ' 后续根据JSON实际结构,遍历提取报表字段、数值,从指定单元格开始写入即可
    ' 解析JSON可通过字符串正则匹配,或调用ScriptControl对象完成结构化解析
    ' 写入逻辑可根据自己需要的报表格式调整行列对应关系
    
    Set http = Nothing
End Sub

如果不想处理JSON解析,也可以通过IE浏览器对象模拟页面完整加载:

  • 等待页面JS执行完成、所有报表内容渲染完毕后,通过div节点的class属性定位报表的行、列元素,逐个提取文本内容写入单元格。
  • 这种方式不需要处理JSON结构,但需要等待页面全量资源加载,速度较慢,且受页面样式调整影响更大。

注意事项:雅虎财经的页面结构、内嵌数据标识、反爬规则可能随版本迭代调整,代码中的请求头、数据提取规则需要根据你实际访问时的页面内容做对应修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:27:18