我正在尝试从像http://cdo.ncdc.noaa.gov/qclcd_ascii/这样的网站下载压缩文件。文件太多了,有没有批量下载而不是逐个下载的方法?理想情况下,下载的文件可以在下载后批量解压。我尝试使用system(curl http://cdo.ncdc.noaa.gov/qclcd_ascii/QCLCD")等,但得到了许多错误和状态127警告。
有什么想法或建议吗?
谢谢!
发布于 2014-09-12 06:10:27
这应该是可行的。
library(XML)
url<-c("http://cdo.ncdc.noaa.gov/qclcd_ascii/")
doc<-htmlParse(url)
#get <a> nodes.
Anodes<-getNodeSet(doc,"//a")
#get the ones with .zip's and .gz's
files<-grep("*.gz|*.zip",sapply(Anodes, function(Anode) xmlGetAttr(Anode,"href")),value=TRUE)
#make the full url
urls<-paste(url,files,sep="")
#Download each file.
mapply(function(x,y) download.file(x,y),urls,files)发布于 2014-09-12 05:47:56
它不是R,但您可以忽略robots.txt,轻松使用程序wget:
接受wget -r --no-parent -e robots=off --accept *.gz http://cdo.ncdc.noaa.gov/qclcd_ascii/
发布于 2014-09-12 06:30:32
以下是我对此的看法:
### Load XML package, for 'htmlParse'
require(XML)
### Read in HTML contents, extract file names.
root <- 'http://cdo.ncdc.noaa.gov/qclcd_ascii/'
doc <- htmlParse(root)
fnames <- xpathSApply(doc, '//a[@href]', xmlValue)
### Keep only zip files, and create url paths to scrape.
fnames <- grep('zip$', fnames, value = T)
paths <- paste0(root, fnames)现在你有了R中的url和相应的文件名的向量,你可以把它们下载到你的硬盘上。您有两个选择。可以串行下载,也可以并行下载。
### Download data in serial, saving to the current working directory.
mapply(download.file, url = paths, destfile = fnames)
### Download data in parallel, also saving to current working directory.
require(parallel)
cl <- makeCluster(detectCores())
clusterMap(cl, download.file, url = paths, destfile = fnames,
.scheduling = 'dynamic')如果你选择并行下载,我建议考虑“动态”调度,这意味着每个内核在开始下一次下载之前不必等待其他内核完成。动态调度的缺点是增加了通信开销,但由于下载~50mb文件的过程不是非常耗费资源,所以只要文件下载速度略有不同,就值得使用此选项。
最后,如果还希望包含tar文件,请将正则表达式更改为
fnames <- grep('(zip)|(gz)$', fnames, value = T)https://stackoverflow.com/questions/25797242
复制相似问题