使用R下载zip文件

时间:2018-10-03 22:30:10

标签: r rest zip

我正在尝试从网站上下载一堆zip文件

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

有什么建议吗?我尝试使用rvest来标识href,但是没有任何运气。

2 个答案:

答案 0 :(得分:1)

我们可以避免使用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()提取文件名部分与regex骇客,因为它是由R C支持的内部函数,{ {3}}。

答案 1 :(得分:0)

这应该有效

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)})})