使用R爬取CASA机场页面数据时得到空DataFrame,求解决方法
解决动态页面爬取问题:获取CASA机场数据
问题根源
目标页面的机场数据是JavaScript动态渲染的,直接用read_html()只能获取初始静态HTML,无法加载JS生成的内容,这是你得到空DataFrame的核心原因。同时你使用的CSS选择器与页面实际元素不匹配,即使能获取静态内容也无法提取目标数据。
解决方案:用RSelenium模拟浏览器加载
以下是完整可运行的代码,通过模拟Chrome浏览器获取动态渲染后的页面内容:
library(RSelenium) library(rvest) library(dplyr) # 启动Chrome浏览器(需确保本地已安装Chrome及对应版本的ChromeDriver) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] # 导航到目标页面 remDr$navigate("https://www.casa.gov.au/search-centre/aerodromes") # 等待页面完全加载(根据网络情况调整等待时间) Sys.sleep(5) # 获取渲染后的页面源代码 page_html <- remDr$getPageSource()[[1]] webpage <- read_html(page_html) # 提取所有机场条目容器 airport_rows <- webpage %>% html_nodes(".views-row") # 遍历条目提取名称和位置 airport_list <- lapply(airport_rows, function(row) { # 提取机场名称(对应页面标题链接文本) name <- row %>% html_nodes(".field--name-title a") %>% html_text(trim = TRUE) # 提取机场位置 location <- row %>% html_nodes(".field--name-field-aerodrome-location") %>% html_text(trim = TRUE) data.frame(Airport_Name = name, Location = location) }) # 合并为DataFrame AeroFrame <- bind_rows(airport_list) # 关闭浏览器及驱动 remDr$close() driver$server$stop() # 查看结果 head(AeroFrame)
关键说明
- 选择器修正:页面中机场名称位于
.field--name-title a标签,位置位于.field--name-field-aerodrome-location容器,替换了你之前错误的.field_item和.field_label选择器。 - 动态加载处理:RSelenium通过模拟真实浏览器行为,等待JS完成渲染后再获取页面内容,解决了静态爬取无法获取动态数据的问题。
- 环境准备:运行前需确保安装Chrome浏览器,可通过
wdman::chrome()自动管理对应版本的ChromeDriver。
内容的提问来源于stack exchange,提问作者evani
相关产品推荐
相关产品推荐

