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

使用rvest获取加拿大水文数据时的表单提交及CSV下载问题求助

使用rvest获取加拿大水文数据时的表单提交及CSV下载问题求助

我正在写一个R函数,输入测站编号后自动访问加拿大水文办公室网站,下载该测站的所有数据,但遇到了两个棘手的问题:最开始通过表单提交查询毫无反应,后来能跳转到结果页了,但下载的“CSV文件”实际是HTML代码,根本拿不到想要的数据,求大佬们帮忙看看!

初始表单提交问题

最开始我尝试用rvest的表单填充功能提交查询,代码如下:

station_number <- "08NM083"

url <- "https://wateroffice.ec.gc.ca/search/historical_e.html"

user_a <- httr::user_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 12_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36")

my_session <- session(url, user_a)

form <- html_form(my_session)[[2]]

提取到的表单结构是这样的:

'search-form' (GET https://wateroffice.ec.gc.ca/search/historical_results_e.html) (submit) : Search (radio) search_type: station_name (text) station_name: (radio) search_type: station_number (text) station_number: (radio) search_type: province (select) province: AB ...(其余表单字段省略)

我填充并提交表单后,会话居然还停留在原页面,完全没跳转到结果页:

filled <- form %>%
  html_form_set(station_number = station_number,
                search_type = "station_number")

resp <- session_submit(x = my_session, form = filled)

查看会话状态,两个都是原页面的响应:

> my_session
<session> https://wateroffice.ec.gc.ca/search/historical_e.html
Status: 200
Type:   text/html; charset=UTF-8
Size:   45034

> resp
<session> https://wateroffice.ec.gc.ca/search/historical_e.html
Status: 200
Type:   text/html; charset=UTF-8
Size:   45284

进展:直接构造URL成功跳转结果页

后来按照建议,把测站编号直接拼接到查询URL里,终于成功跳转到了结果页,当前代码如下:

station_number <- "08NM083"

url <- paste0("https://wateroffice.ec.gc.ca/search/historical_results_e.html?search_type=station_number&station_number=",
              station_number,
              "&start_year=1850&end_year=2023&minimum_years=&gross_drainage_operator=%3E&gross_drainage_area=&effective_drainage_operator=%3E&effective_drainage_area=")

user_a <- httr::user_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 12_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36")

my_session <- session(url, user_a)

form <- html_form(my_session)[[2]]

filled <- form %>%
  html_form_set(check_all = "all")

resp <- session_submit(x = my_session, form = filled, submit = "download")

当前卡壳:CSV下载失败

我尝试提取下载链接并下载,但不管是用download.file还是直接read_csv,得到的都是HTML代码,完全不是CSV数据:

link <- resp %>%
  read_html() %>%
  html_element("p+ section .col-lg-4:nth-child(1) a") %>%
  html_attr("href")

full_link <- url_absolute(link, url)

# 两种方式都只拿到HTML
download.file(full_link, destfile = "Downloads/test_hydat.csv")
test <- read_csv(full_link)

有没有大佬能帮忙分析下问题出在哪?尤其是现在的CSV下载问题,万分感谢!

备注:内容来源于stack exchange,提问作者Kim H.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 09:52:32