You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)

关键说明

  1. 选择器修正:页面中机场名称位于.field--name-title a标签,位置位于.field--name-field-aerodrome-location容器,替换了你之前错误的.field_item和.field_label选择器。
  2. 动态加载处理:RSelenium通过模拟真实浏览器行为,等待JS完成渲染后再获取页面内容,解决了静态爬取无法获取动态数据的问题。
  3. 环境准备:运行前需确保安装Chrome浏览器,可通过wdman::chrome()自动管理对应版本的ChromeDriver。

内容的提问来源于stack exchange,提问作者evani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:45:55