使用rvest抓取纳斯达克IPO表格时Rstudio崩溃,如何获取对应数据框
问题原因
- 目标页面的IPO表格为JavaScript动态渲染生成,
rvest::read_html()仅能抓取未加载数据的初始静态页面,不存在目标表格节点 - 页面内置的大量JS代码、反爬校验逻辑可能触发rvest依赖的libxml解析器异常,进而导致RStudio崩溃
解决方案
方案1:直接调用官方数据接口(最优,无解析崩溃问题)
直接请求纳斯达克后端IPO数据接口,返回结构化JSON数据,无需解析HTML,稳定性和速度都最优:
# 首次运行先安装依赖包 install.packages(c("httr2", "jsonlite", "dplyr"))
library(httr2) library(jsonlite) library(dplyr) # 构造请求,模拟浏览器标识避免反爬拦截 req <- request("https://api.nasdaq.com/api/ipo/calendar") %>% req_headers( `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36", `Referer` = "https://www.nasdaq.com/" ) %>% req_url_query(date = format(Sys.Date(), "%Y-%m")) # 按YYYY-MM格式指定拉取月份,默认拉取当月数据 # 发送请求解析响应 resp <- req_perform(req) raw_data <- resp_body_json(resp) # 直接转化为标准DataFrame格式 upcoming_ipo <- bind_rows(raw_data$data$upcoming$upcomingTable$rows) # 待上市IPO表格 priced_ipo <- bind_rows(raw_data$data$priced$pricedTable$rows) # 已定价IPO表格
方案2:动态渲染页面后提取(适合需要模拟页面操作的场景)
如果需要和页面交互,可使用chromote包启动无头浏览器加载完整页面后再提取数据:
# 首次运行先安装依赖包 install.packages(c("chromote", "rvest", "dplyr"))
library(chromote) library(rvest) library(dplyr) # 启动无头Chrome会话 b <- ChromoteSession$new() # 访问目标页面,等待JS渲染完成 b$Page$navigate("https://www.nasdaq.com/market-activity/ipos") Sys.sleep(3) # 可根据网络情况调整等待时长 # 获取渲染完成后的完整HTML full_html <- b$Runtime$evaluate('document.documentElement.outerHTML')$result$value web <- read_html(full_html) # 提取两个表格 tables <- web %>% html_elements(".market-calendar-table__table") %>% html_table() # 分别赋值为对应DataFrame upcoming_ipo <- tables[[1]] # 第一个表格为待上市IPO priced_ipo <- tables[[2]] # 第二个表格为已定价IPO # 关闭浏览器会话释放资源 b$close()
注意事项
- 调整请求频率,避免短时间内多次请求触发反爬限制
- 接口请求可通过修改
date参数的年月值,拉取历史月份的IPO数据
内容的提问来源于stack exchange,提问作者Alberto Aguilera
相关产品推荐
相关产品推荐

