使用Rvest对Freedom24网站IPO页做web scraping返回空值如何解决
问题原因
返回空值的核心原因是目标页面的IPO列表数据是JavaScript动态渲染生成的,rvest::read_html()只能获取页面初始静态HTML源码,这部分动态加载的IPO卡片内容在静态源码里不存在,你定位的tm-f24eu-ipo-card-past-grid-item类元素只有在浏览器执行完页面JS逻辑后才会生成,所以静态抓取无法匹配到对应元素。
解决方案
提供两种可直接落地的调整方案:
方案1:使用RSelenium模拟浏览器加载(适配性最高)
RSelenium可以启动真实浏览器内核加载页面,等JS执行完成、内容渲染完毕后再提取元素,代码示例:
# 首次使用先安装依赖包 # install.packages("rvest") # install.packages("RSelenium") library(rvest) library(RSelenium) # 启动Chrome驱动,需提前安装对应版本的Chrome和ChromeDriver driver <- rsDriver(browser = "chrome", chromever = "你的Chrome浏览器对应版本号", port = 4545L) remDr <- driver$client remDr$navigate("https://es.freedom24.com/ipo/all") # 等待动态内容加载完成,可根据网络情况调整等待时长 Sys.sleep(3) # 获取渲染完成的完整页面源码 page_source <- remDr$getPageSource()[[1]] web <- read_html(page_source) # 提取IPO卡片内容 datos_web <- web %>% html_nodes(xpath = '//*[@class="tm-f24eu-ipo-card-past-grid-item"]') %>% html_text() # 抓取完成后关闭驱动释放资源 remDr$close() driver$server$stop() # 查看抓取结果 head(datos_web)
方案2:直接请求后端数据接口
打开浏览器控制台的「网络」标签,筛选XHR/fetch类型请求,刷新页面后即可找到加载IPO数据的后端接口,直接请求接口即可拿到结构化JSON数据,无需解析HTML,抓取效率更高。
注意事项
- 抓取前请确认目标网站的
robots.txt规则和用户协议,遵守合规抓取要求 - 可适当增加请求间隔,避免给目标服务器造成过大压力
内容的提问来源于stack exchange,提问作者Alberto Aguilera
相关产品推荐
相关产品推荐

