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

如何用R自动从加拿大水文局网站下载读取指定站点时段的日均流量.csv文件?

解决加拿大水文局日均流量CSV自动下载问题

要实现自动下载不同站点、时段的日均流量CSV,关键是维持会话状态——因为点击Download按钮后,网站会把当前页面的站点、日期参数存在会话中,跳转至下载页后才能生成对应的数据链接。以下是具体实现步骤:

核心思路

  1. 先请求带站点、日期参数的报表页面,通过会话保存参数信息;
  2. 访问下载页面,从页面中提取“日均流量”对应的CSV下载链接;
  3. 下载CSV到本地并读取。

完整代码示例

需要用到httr(处理HTTP请求)、rvest(解析HTML)和readr(读取CSV)包:

library(httr)
library(rvest)
library(readr)

# 定义下载函数,可批量传入站点、日期参数
download_daily_streamflow <- function(stn_id, start_date, end_date, save_path = "./streamflow_data.csv") {
  # 1. 创建会话,维持请求状态
  session <- handle("https://wateroffice.ec.gc.ca")
  
  # 2. 请求带参数的报表页面,让会话保存站点、日期信息
  report_url <- paste0(
    "https://wateroffice.ec.gc.ca/report/real_time_e.html",
    "?stn=", stn_id,
    "&mode=Table",
    "&startDate=", start_date,
    "&endDate=", end_date,
    "&prm1=46&prm2=47"  # 46对应水位、47对应流量,固定参数
  )
  GET(report_url, handle = session)
  
  # 3. 请求下载页面,解析HTML找到日均流量的CSV链接
  download_page <- GET("https://wateroffice.ec.gc.ca/download/index_e.html?results_type=real_time", handle = session)
  page_html <- content(download_page, "html")
  
  # 定位到"Discharge (daily mean values)"对应的CSV链接
  csv_link <- page_html %>%
    html_elements(xpath = "//td[text()='Discharge (daily mean values)']/following-sibling::td/a[text()='Comma Separated Values']") %>%
    html_attr("href")
  
  # 4. 下载CSV文件
  if (!is.na(csv_link)) {
    csv_url <- paste0("https://wateroffice.ec.gc.ca", csv_link)
    download.file(csv_url, save_path, mode = "wb")
    cat("文件已保存至:", save_path, "\n")
    
    # 读取CSV到R环境
    streamflow_data <- read_csv(save_path)
    return(streamflow_data)
  } else {
    stop("未找到日均流量的CSV下载链接,请检查参数是否正确")
  }
}

# 使用示例:下载站点07BJ001、2024-06-20至2024-07-23的日均流量
data <- download_daily_streamflow(
  stn_id = "07BJ001",
  start_date = "2024-06-20",
  end_date = "2024-07-23",
  save_path = "./07BJ001_streamflow.csv"
)

# 查看数据
head(data)

关键说明

  • 会话维持:用handle创建会话,确保两次请求(报表页+下载页)共享同一上下文,网站能识别你要下载的对应数据;
  • 参数固定项:prm1=46和prm2=47是水位、流量的参数ID,无需修改;
  • 批量处理:可以把多个站点、日期组合成列表,用lapply循环调用函数实现批量下载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:59:54