基于rvest从带选择项的网页提取降水数据的可行性及方法咨询
解决方案:使用R提取DEOS站点降水数据
1. 用rvest实现该数据请求是否可行?
可行,但需要结合httr包(rvest底层依赖httr,也可直接调用)模拟表单提交——因为目标站点的数据是通过提交站点、日期、访问密钥等参数后由后端动态生成的,并非静态页面内容。核心思路是解析网页表单结构,构造合法请求参数后提交,再抓取返回的表格数据。
2. 如何用R提取特定站点一年的降水数据?
以下是可直接复用的实操步骤与代码:
第一步:加载依赖包
library(rvest) library(httr) library(dplyr)
第二步:配置核心参数
# 替换为你的实际参数 site_id <- "目标站点ID" # 需从网页站点下拉框的源码中获取对应ID start_date <- "2023-01-01" # 年度起始日期 end_date <- "2023-12-31" # 年度结束日期 api_key <- "你的访问密钥" # 网页提供的访问密钥 target_url <- "https://deos.udel.edu/data/daily_retrieval.php"
第三步:模拟表单提交并提取数据
# 加载目标页面,解析表单结构 page <- read_html(target_url) form <- html_form(page)[[1]] # 若页面有多个表单,需根据实际调整索引 # 填充表单参数(字段名需对照网页源码确认,以下为示例) filled_form <- set_values(form, station = site_id, start_date = start_date, end_date = end_date, key = api_key ) # 提交表单并获取响应 response <- submit_form(session = html_session(target_url), form = filled_form, submit = "submit") # submit按钮的name需从源码确认 # 提取响应中的降水表格数据 precip_data <- response %>% html_element("table") %>% html_table(header = TRUE) %>% as_tibble()
关键注意事项
- 字段名验证:需通过浏览器F12查看网页源码,确认表单字段的
name属性(比如站点字段可能叫station,密钥字段可能叫access_key),确保参数名与网站要求完全一致。 - 请求限制:若批量抓取多个站点/年度数据,建议加入
Sys.sleep(1)延迟,避免触发网站反爬机制。 - 数据清洗:返回的表格可能包含备注行、异常格式,需用
dplyr::filter()或type.convert()做后续清洗,比如将降水列转换为数值型。
内容的提问来源于stack exchange,提问作者Josh B
相关产品推荐
相关产品推荐

