使用rvest和httr爬取Benzinga财报日历遇问题求助
如何爬取Benzinga财报日历数据?
问题背景
我使用XML包的readHTMLTable成功爬取了Yahoo财报日历:
url <- "https://finance.yahoo.com/calendar/earnings?from=2022-12-04&to=2022-12-10&day=2022-12-06" download_table <- function(url) { url_file <- GET(url) web_page_parsed <- htmlParse(url_file) tables <- readHTMLTable(web_page_parsed) } url_file <- GET(url) web_page_parsed <- htmlParse(url_file) tables <- readHTMLTable(web_page_parsed) print(head(tables))
但将代码修改为爬取Benzinga财报日历(链接:https://www.benzinga.com/calendars/earnings)时:
url <- "https://www.benzinga.com/calendars/earnings" download_table <- function(url) { url_file <- GET(url) web_page_parsed <- htmlParse(url_file) tables <- readHTMLTable(web_page_parsed) } url_file <- GET(url) web_page_parsed <- htmlParse(url_file) tables <- readHTMLTable(web_page_parsed) print(head(tables)) tables$`NULL`
仅得到无效结果,只能提取表头,页面源码中也找不到股票代码等实际数据:
> print(head(tables)) $`NULL` Date time ticker Quarter Prior EPS Est EPS Actual EPS EPS Surprise 1 Date time ticker Quarter Prior EPS Est EPS Actual EPS EPS Surprise Prior Rev Est Rev Actual Rev Rev Surprise Get Alert 1 Prior Rev Est Rev Actual Rev Rev Surprise Get Alert $`NULL` V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 1 2 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> > tables$`NULL` Date time ticker Quarter Prior EPS Est EPS Actual EPS EPS Surprise 1 Date time ticker Quarter Prior EPS Est EPS Actual EPS EPS Surprise Prior Rev Est Rev Actual Rev Rev Surprise Get Alert 1 Prior Rev Est Rev Actual Rev Rev Surprise Get Alert >
解决方案
Benzinga的财报日历数据是通过JavaScript动态渲染的,直接请求静态HTML无法获取实际内容,以下两种方法可以解决:
方法1:使用RSelenium模拟浏览器加载页面
通过模拟真实浏览器的行为,等待页面完全渲染后提取数据:
# 安装依赖包 install.packages(c("RSelenium", "rvest")) library(RSelenium) library(rvest) # 启动Chrome浏览器会话(需确保ChromeDriver已正确配置) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] # 访问目标页面 remDr$navigate("https://www.benzinga.com/calendars/earnings") # 等待页面加载完成(根据网络情况调整等待时间) Sys.sleep(5) # 获取渲染后的页面源码并解析 page_source <- remDr$getPageSource()[[1]] page <- read_html(page_source) # 提取表格数据(需根据页面实际HTML结构调整CSS选择器) earnings_table <- page %>% html_element("table") %>% html_table() # 查看结果 head(earnings_table) # 关闭浏览器会话 remDr$close() driver$server$stop()
方法2:直接调用Benzinga的API接口
通过浏览器开发者工具找到后台API接口,直接请求JSON格式的数据:
- 打开浏览器开发者工具(F12),切换到「Network」标签
- 刷新页面,筛选「XHR/fetch」请求,找到返回财报数据的API端点
- 复制请求URL和必要的请求头(如User-Agent)
示例代码:
# 安装依赖包 install.packages(c("httr", "jsonlite")) library(httr) library(jsonlite) # 替换为实际找到的API接口URL api_url <- "https://api.benzinga.com/api/v2/calendars/earnings" # 设置请求头,模拟浏览器请求 headers <- add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" ) # 发送请求并解析JSON数据 response <- GET(api_url, headers) data <- fromJSON(content(response, "text")) # 转换为数据框 earnings_df <- as.data.frame(data$results) # 查看结果 head(earnings_df)
注意事项
- API接口可能随网站更新而变化,需定期验证接口有效性
- 部分API需要开发者密钥,需注册Benzinga开发者账号获取
- 遵守网站的
robots.txt规则和使用条款,避免高频请求导致IP被封禁
内容的提问来源于stack exchange,提问作者Philipp Neuber
相关产品推荐
相关产品推荐

