雅虎财经财务页面更新后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
相关产品推荐
相关产品推荐

