如何在R中抓取NASA动态网页的小行星密切轨道要素数据?
解决R抓取JPL小行星密切轨道要素的问题
针对动态页面无法用rvest直接抓取的情况,提供两种可行方案:
方案1:用RSelenium模拟浏览器渲染页面
动态页面内容由JavaScript加载,rvest无法解析JS,因此用RSelenium模拟完整浏览器环境获取数据:
- 安装并加载依赖包:
install.packages(c("RSelenium", "rvest", "dplyr")) library(RSelenium) library(rvest) library(dplyr)
- 启动Chrome驱动(确保已安装Chrome浏览器,
rsDriver会自动匹配对应驱动版本):
driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]]
- 访问目标页面并等待加载:
remDr$navigate("https://ssd.jpl.nasa.gov/tools/sbdb_lookup.html#/?sstr=2006%20WP1") Sys.sleep(5) # 等待页面完全加载,可根据网络情况调整时长
- 触发“轨道参数”下拉菜单:
# 通过XPath定位按钮并点击展开菜单 orbit_btn <- remDr$findElement(using = "xpath", value = "//button[contains(text(),'轨道参数')]") orbit_btn$clickElement() Sys.sleep(2) # 等待表格渲染完成
- 提取并解析表格:
page_source <- remDr$getPageSource()[[1]] page_html <- read_html(page_source) # 定位密切轨道要素表格(CSS选择器可通过浏览器开发者工具确认) osculating_table <- page_html %>% html_element(css = "table[data-table-type='osculating']") %>% html_table(header = TRUE)
- 清理资源:
remDr$close() driver$server$stop()
- 查看结果:
print(osculating_table)
方案2:直接调用JPL官方API(推荐)
JPL提供了Small-Body Database的公开API,无需模拟浏览器,直接请求数据更高效稳定:
- 安装并加载依赖包:
install.packages(c("httr", "jsonlite", "dplyr")) library(httr) library(jsonlite) library(dplyr)
- 构造API请求链接:
asteroid <- "2006%20WP1" # 请求密切轨道要素,开启高精度数据返回 api_url <- paste0("https://ssd-api.jpl.nasa.gov/sbdb.api?sstr=", asteroid, "&full-prec=true&cov=false")
- 解析API返回的JSON数据:
response <- GET(api_url) raw_data <- fromJSON(content(response, "text"))
- 整理成表格格式:
# 提取osculating轨道要素字段 osculating_elements <- raw_data$orbit$elements$osculating osculating_table <- as.data.frame(osculating_elements) %>% select(param, value, unit, desc)
- 查看结果:
print(osculating_table)
方案对比
- 方案1:通用型强,适用于各类动态页面,但依赖浏览器驱动,运行速度较慢。
- 方案2:专为JPL数据库设计,无需渲染页面,速度快且数据准确,优先推荐使用。
内容的提问来源于stack exchange,提问作者derik boonstra
相关产品推荐
相关产品推荐

