我正在尝试自动化从 R 中的 The Climate Explorer 下载美国每个县的数据的过程。我感兴趣的数据要求用户从下拉菜单中选择,但我不知道如何自动化这一点。
我编写了一些代码,只需调整以下 URL 中的 5 位县 FIPS 代码即可导航到包含我想要下载的数据的相关页面:https://crt-climate-explorer.nemac。 org/climate_graphs/?fips=01003&id=days_tmax_lt_32f&zoom=7#。例如,只需在循环中用不同的代码替换“01003”代码。
此时,我需要单击“下载”下拉菜单并选择“Projections.csv”,这会触发下载我感兴趣的数据。我希望有一个与此操作关联的 URL,但是当我右键单击“Projections.csv”按钮并选择“复制链接”时,该链接仅显示为
Void(0);
。还有其他方法可以访问 URL 吗?或者我以错误的方式处理这个问题?看起来有一些使用 RSelenium 的相关帖子,但我很好奇是否有更简单的方法。
这可能看起来有点烦人,但您可以为每个度量发送 API 请求并将它们连接在一起。
library(tidyverse)
library(httr2)
measures <- c("loca:allMin:rcp85", "loca:allMax:rcp85", "loca:wMean:rcp85", "loca:allMin:rcp45",
"loca:allMax:rcp45", "loca:wMean:rcp45")
request_bodies <- str_replace('{"grid":"measures","sdate":"2006-01-01","edate":"2099-12-31","elems":[{"name":"maxt","interval":"yly","duration":"yly","reduce":"cnt_lt_32","area_reduce":"county_mean"}],"county":"01003"}', "measures", measures)
reqs <- map(
request_bodies,
~ request("https://grid2.rcc-acis.org/GridData") %>%
req_headers(
Accept = "*/*",
`Accept-Language` = "en-US,en;q=0.9",
Origin = "https://crt-climate-explorer.nemac.org",
) |>
req_body_raw(.x, "application/json")
)
resps <- reqs %>%
req_perform_sequential()
resps %>%
map(resp_body_json) %>%
map2(measures,
~ pluck(.x, "data") %>%
tibble(body = .) %>%
unnest_wider(body, names_sep = "_") %>%
mutate(body_2 = unlist(body_2)) %>%
set_names(c("Year", .y))
) %>%
reduce(full_join, by = "Year")
#> # A tibble: 94 × 7
#> Year `loca:allMin:rcp85` `loca:allMax:rcp85` `loca:wMean:rcp85`
#> <chr> <int> <dbl> <dbl>
#> 1 2006 0 1.33 0.0774
#> 2 2007 0 1.98 0.112
#> 3 2008 0 1.26 0.120
#> 4 2009 0 1.83 0.268
#> 5 2010 0 1.37 0.111
#> 6 2011 0 2.32 0.218
#> 7 2012 0 1.27 0.0884
#> 8 2013 0 2.08 0.265
#> 9 2014 0 1.05 0.0968
#> 10 2015 0 2.98 0.226