Мы можем избежать проблем, связанных с платформой, с помощью download.file()
и обрабатывать загрузки с помощью httr
.
Сначала мы прочитаем на странице:
library(xml2)
library(httr)
library(rvest)
library(tidyverse)
pg <- read_html("https://mesonet.agron.iastate.edu/request/gis/watchwarn.phtml")
Теперь мы нацелимся на все .zip
ссылки на файлы.Это относительные пути (например, <a href="/pickup/wwa/1986_all.zip">Zip</a>
), поэтому мы также добавим к ним префикс URL:
html_nodes(pg, xpath=".//a[contains(@href, '.zip')]") %>% # this href gets _all_ of them
html_attr("href") %>%
sprintf("https://mesonet.agron.iastate.edu%s", .) -> zip_urls
Вот пример того, как выглядит ^^:
head(zip_urls)
## [1] "https://mesonet.agron.iastate.edu/data/gis/shape/4326/us/current_ww.zip"
## [2] "https://mesonet.agron.iastate.edu/pickup/wwa/1986_all.zip"
## [3] "https://mesonet.agron.iastate.edu/pickup/wwa/1986_tsmf.zip"
## [4] "https://mesonet.agron.iastate.edu/pickup/wwa/1987_all.zip"
## [5] "https://mesonet.agron.iastate.edu/pickup/wwa/1987_tsmf.zip"
## [6] "https://mesonet.agron.iastate.edu/pickup/wwa/1988_all.zip"
Их 84:
length(zip_urls)
## [1] 84
Итак, мы позаботимся о том, чтобы включили Sys.sleep(5)
в нашу программу загрузки, поэтому мы не используем их серверы, поскольку наши потребностине более важны, чем сайт.
Создайте место для хранения вещей:
dir.create("mesonet-dl")
Это также можно сделать с помощью цикла for
, но использование purrr::walk
делает это довольно явным, мы генерируем побочные эффекты (т.е.загрузка на диск и отсутствие каких-либо изменений в среде R):
walk(zip_urls, ~{
message("Downloading: ", .x) # keep us informed
# this is way better than download.file(). Read the httr man page on write_disk
httr::GET(
url = .x,
httr::write_disk(file.path("mesonet-dl", basename(.x)))
)
Sys.sleep(5) # be kind
})
Мы используем file.path()
для построения местоположения файла сохранения без учета платформы и используем basename()
для извлечения части имени файлапротив взлома регулярных выражений, поскольку это внутренняя функция с поддержкой R C, которая поддерживает платформу идиосинкразию .