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

求助:使用rvest抓取Ventusky meteogram降水数据时xpath返回NA

解决Ventusky气象图降水数据抓取问题

问题原因

你得到NA的核心原因是:Ventusky的meteogram(气象图)数据是JavaScript动态渲染生成的。rvest只能抓取页面初始加载的静态HTML,而你通过网页检查看到的XPath元素,是浏览器执行JS后才生成的,原始HTML里根本不存在这个节点,所以html_node找不到对应内容,返回NA。

解决方案

静态抓取工具(rvest、httr)无法处理动态渲染内容,推荐两种可行方案:

方案1:用R的Playwright包替代RSelenium

Playwright是更稳定的现代浏览器自动化工具,支持无头模式,能完整渲染JS生成的页面内容:

  1. 安装依赖:
install.packages("playwright")
playwright::install_browsers()
  1. 抓取代码:
library(playwright)

# 启动无头浏览器
pw <- chromium()
page <- pw$new_page()

# 导航到目标页面,等待气象图加载完成
page$goto("https://www.ventusky.com/-14.868;-71.332#forecast")
page$wait_for_selector("#meteogram svg")

# 提取所有降水数值文本
precip_values <- page$eval_all('//*[@id="meteogram"]//g[contains(@class, "values")]/text', function(elements) {
  elements.map(el => el.textContent)
})

# 关闭浏览器并查看结果
pw$close()
print(precip_values)

方案2:直接调用Ventusky的API(更高效)

Ventusky的气象数据来自API接口,可跳过浏览器渲染直接请求数据:

library(httr)
library(jsonlite)

# 构造API请求(接口可通过浏览器F12->网络面板查看XHR请求获取)
api_url <- "https://api.ventusky.com/graphql"
payload <- list(
  query = "query getMeteogram($lat: Float!, $lon: Float!) { meteogram(lat: $lat, lon: $lon) { precipitation { time value } } }",
  variables = list(lat = -14.868, lon = -71.332)
)

# 发送请求并解析降水数据
response <- POST(api_url, body = payload, encode = "json")
data <- fromJSON(content(response, "text"))
precip_data <- data$data$meteogram$precipitation

print(precip_data)

注:API接口可能随网站更新变化,需定期通过浏览器网络面板确认最新格式。

内容的提问来源于stack exchange,提问作者César Carvallo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:10:27