使用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]]
提取到的表单结构是这样的:
我填充并提交表单后,会话居然还停留在原页面,完全没跳转到结果页:
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.
相关产品推荐
相关产品推荐

