R爬取Yahoo Finance数据不全:如何修改代码获取完整表格数据?
解决Yahoo Finance IVV行情数据爬取缺失问题
问题说明
使用R代码爬取Yahoo Finance上IVV的行情页面时,能准确定位目标URL和节点,但返回的数据存在缺失(如前收盘价、开盘价等字段为空或未成功获取),需修改代码以获取图表下方第一个表格的所有数值。
原代码问题分析
- 老旧的User-Agent易被网站反爬机制识别,导致部分数据未正常返回
- XPath选择器使用的class已失效,且仅提取span文本,无法完整匹配字段与对应数值
- 未对提取数据做结构化处理,无法直观对应各行情字段
修改后的代码
library(rvest) library(httr) library(dplyr) ticker <- "IVV" url <- paste0("https://finance.yahoo.com/quote/", ticker, "/") # 使用现代浏览器的User-Agent browser_ua <- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" head <- c( "Accept" = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language" = "en-US,en;q=0.9" ) # 创建会话并获取页面 html_page <- session( url, user_agent(browser_ua), add_headers(head) ) # 定位图表下方第一个行情表格的所有列表项 temp <- html_page %>% read_html() %>% xml_find_all("//div[contains(@class, 'yf-3a2v0c')]/ul/li") # 提取每个列表项的字段名称和对应数值 data_list <- lapply(temp, function(x) { field <- x %>% xml_find_first(".//span[1]/text()") %>% xml_text() value <- x %>% xml_find_first(".//span[2]/text()") %>% xml_text() tibble(字段 = field, 数值 = value) }) # 合并为完整的数据框 result <- bind_rows(data_list) print(result)
关键修改点
- 更新User-Agent:使用现代Chrome浏览器的UA,避免被反爬机制拦截,确保页面完整加载
- 修正XPath选择器:定位到行情表格的父容器(
yf-3a2v0c),遍历每个列表项分别提取字段名和数值,保证字段与数据一一对应 - 结构化数据整理:将零散文本转换为键值对形式的数据框,方便后续查看与使用
内容的提问来源于stack exchange,提问作者Brad Horn
相关产品推荐
相关产品推荐

