загрузка zip-файлов с использованием R - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь загрузить кучу zip-файлов с сайта

https://mesonet.agron.iastate.edu/request/gis/watchwarn.phtml

Есть предложения?Я попытался использовать rvest для определения href, но мне не повезло.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Мы можем избежать проблем, связанных с платформой, с помощью 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, которая поддерживает платформу идиосинкразию .

0 голосов
/ 04 октября 2018

Это должно работать

library(tidyverse)
library(rvest)

setwd("YourDirectoryName") # set the directory where you want to download all files

read_html("https://mesonet.agron.iastate.edu/request/gis/watchwarn.phtml") %>%
  html_nodes(".table-striped a") %>%
  html_attr("href") %>%
  lapply(function(x) {
    filename <- str_extract(x, pattern = "(?<=wwa/).*") # this extracts the filename from the url
    paste0("https://mesonet.agron.iastate.edu",x) %>% # this creates the relevant url from href
      download.file(destfile=filename, mode = "wb")
    Sys.sleep(5)})})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...