我正在尝试从网站上下载一堆zip文件
https://mesonet.agron.iastate.edu/request/gis/watchwarn.phtml
有什么建议吗?我尝试使用rvest来标识href,但是没有任何运气。
答案 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)})})