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

雅虎财经财务页面更新后R语言爬虫xpath失效无法抓取财务数据

雅虎财经财务报表爬虫失效适配方案

雅虎财经新版财务页面已弃用静态table标签存储数据,改为页面加载后通过JS渲染数据,静态请求HTML源码时不会包含目标table节点,因此原有XPath匹配返回空列表。

方案1:提取页面预加载JSON数据(推荐,性能最优)

新版页面会把全量财务数据预写入静态HTML的root.App.main全局变量中,无需等待页面渲染,直接解析该字段即可拿到结构化数据,适配R代码如下:

# 收入表数据抓取适配代码
library(rvest)
library(jsonlite)
library(stringr)

link <- "https://finance.yahoo.com/quote/"
link <- paste0(link, stock[i], "/financials?p=", stock[i])
wahis.session <- html_session(link)

# 提取预加载的JSON数据
page_content <- read_html(wahis.session)
script_text <- html_text(html_nodes(page_content, xpath = '//script[contains(text(), "root.App.main")]'))
json_str <- str_match(script_text, "root\\.App\\.main = (.*?});\\s*\\(function")[1,2]
finance_data <- fromJSON(json_str)

# 提取收入表数据
IncomeStatement <- finance_data$context$dispatcher$stores$QuoteSummaryStore$incomeStatementHistory$incomeStatementHistory

方案2:使用无头浏览器抓取渲染后内容

如果希望沿用原有table提取逻辑,可改用RSelenium启动无头浏览器等待页面渲染完成后再提取元素,适配代码如下:

library(RSelenium)
library(rvest)

# 启动无头Chrome驱动
driver <- rsDriver(browser = "chrome", chromever = "你的Chrome对应版本", verbose = F, port = free_port(), extraCapabilities = list(chromeOptions = list(args = c('--headless', '--disable-gpu'))))
remDr <- driver$client

link <- "https://finance.yahoo.com/quote/"
link <- paste0(link, stock[i], "/financials?p=", stock[i])
remDr$navigate(link)
# 等待报表节点渲染完成
Sys.sleep(3)

# 提取渲染后的table
page_source <- remDr$getPageSource()[[1]]
p <- read_html(page_source) %>%
  html_nodes(xpath = '//div[contains(@data-test,"fin-table")]//table') %>%
  html_table(fill = T)
IncomeStatement <- p[[1]]

# 关闭驱动
remDr$close()
driver$server$stop()

注意事项

  • 两种方案都需要配置合理的请求头和请求间隔,避免被雅虎财经的反爬策略拦截
  • 预加载JSON结构可能随页面迭代变更,若提取失效可重新匹配root.App.main下的财务数据存储路径

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:54:02