使用rvest爬取纳斯达克IPO页面无法获取目标数据的求助
解决rvest爬取纳斯达克IPO页面无法获取数据的问题
我明白你遇到的困扰了——用rvest直接爬取纳斯达克IPO页面时,完全拿不到目标的Priced表格数据,甚至tbody节点返回的都是空内容。这核心原因是这个页面的IPO表格是动态加载的:服务器返回的初始HTML里只有空的占位符,实际数据是通过JavaScript从后端API拉取后渲染到页面上的,静态爬取方式根本抓不到真实数据。
下面给你两种可行的解决方案:
方案一:直接请求后端API(推荐,高效稳定)
纳斯达克的IPO数据其实是通过公开的API接口提供的,我们可以跳过前端页面,直接请求这个接口获取JSON格式的数据,解析起来更方便快捷。
代码示例:
library(httr) library(jsonlite) # 请求Priced类型的IPO数据接口,模拟浏览器请求避免被拦截 response <- GET( url = "https://api.nasdaq.com/api/ipo/calendar?date=priced", add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" ) ) # 解析JSON响应内容 ipo_data <- fromJSON(content(response, "text")) # 提取Priced表格的核心数据(包含你需要的Symbol、Company Name等字段) priced_ipos <- ipo_data$data$priced$data # 查看目标字段 print(priced_ipos[, c("symbol", "companyName", "price", "offerDate")])
说明:
- 接口参数
date=priced指定获取已定价的IPO数据,如果你需要其他类型(比如即将上市的),可以改成date=upcoming或date=all。 - 加上
User-Agent头是为了模拟浏览器请求,避免被接口直接拒绝。
方案二:用RSelenium模拟浏览器加载(适合复杂动态页面)
如果API接口有变化,或者你需要模拟完整的页面交互操作,可以用RSelenium启动真实浏览器加载页面,等数据渲染完成后再爬取。
代码示例:
library(RSelenium) library(rvest) # 启动Chrome浏览器(会自动下载对应驱动,也可以手动指定) driver <- rsDriver(browser = "chrome", port = sample(4000:5000, 1)) remDr <- driver[["client"]] # 访问IPO页面 remDr$navigate("https://www.nasdaq.com/market-activity/ipos") # 等待页面加载完成(给JS足够时间拉取数据,可根据网络情况调整延迟) Sys.sleep(5) # 获取渲染后的完整页面源码 page_html <- read_html(remDr$getPageSource()[[1]]) # 精准定位Priced表格的tbody,转换成数据框 priced_table <- page_html %>% html_element("#priced-ipos") %>% # 定位Priced表格的容器 html_element("tbody") %>% html_table() # 查看你需要的字段 head(priced_table[, c("Symbol", "Company Name", "Price", "Offer Date")]) # 关闭浏览器和驱动 remDr$closeSession() driver$server$stop()
为什么你的原始代码失败?
你用read_html(url)获取的是服务器返回的初始静态HTML,这个HTML里的<tbody>只是空的占位符,真实的IPO数据还没有被JavaScript插入到页面中。所以xml_nodes("tbody")拿到的是空节点集合,xml_text()自然只有换行符了。
内容的提问来源于stack exchange,提问作者Rime
相关产品推荐
相关产品推荐

