批量下载R中的压缩文件

时间:2014-09-11 21:30:04

标签: r batch-file

我正在尝试从http://cdo.ncdc.noaa.gov/qclcd_ascii/这样的网站下载压缩文件。 由于文件很多,有没有办法分批下载而不是一个一个?理想情况下,下载后可以批量解压缩下载的文件。 我尝试使用系统(curl http://cdo.ncdc.noaa.gov/qclcd_ascii/QCLCD")等。但是有很多错误和状态127警告。

有任何想法或建议吗?

谢谢!

4 个答案:

答案 0 :(得分:2)

这应该有用。

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)

答案 1 :(得分:1)

它不是R,但你可以轻松使用程序wget,忽略robots.txt:

  

wget -r --no-parent -e robots = off --accept * .gz   http://cdo.ncdc.noaa.gov/qclcd_ascii/

答案 2 :(得分:1)

这是我的看法:

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

现在你有一个url的向量和R中相应的文件名,你可以将它们下载到你的硬盘上。你有两个选择。您可以串行或并行下载。

### 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')

如果您选择同时下载,我建议您考虑动态&#39;调度,这意味着每个核心在开始下一次下载之前不必等待其他人完成。动态调度的缺点是增加了通信开销,但由于下载〜50mb文件的过程不是非常耗费资源,因此只要文件以稍微不同的速度下载,就可以使用此选项。

最后,如果您还要包含tar个文件,请将正则表达式更改为

fnames <- grep('(zip)|(gz)$', fnames, value = T)

答案 3 :(得分:0)

要下载该目录下的所有内容,您可以执行以下操作:

wget -r -e robots=off http://cdo.ncdc.noaa.gov/qclcd_ascii/