首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在R中批量下载压缩文件

在R中批量下载压缩文件
EN

Stack Overflow用户
提问于 2014-09-12 05:30:04
回答 4查看 1.4K关注 0票数 2

我正在尝试从像http://cdo.ncdc.noaa.gov/qclcd_ascii/这样的网站下载压缩文件。文件太多了,有没有批量下载而不是逐个下载的方法?理想情况下,下载的文件可以在下载后批量解压。我尝试使用system(curl http://cdo.ncdc.noaa.gov/qclcd_ascii/QCLCD")等,但得到了许多错误和状态127警告。

有什么想法或建议吗?

谢谢!

EN

回答 4

Stack Overflow用户

发布于 2014-09-12 06:10:27

这应该是可行的。

代码语言:javascript
运行
复制
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)
票数 2
EN

Stack Overflow用户

发布于 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/

票数 1
EN

Stack Overflow用户

发布于 2014-09-12 06:30:32

以下是我对此的看法:

代码语言:javascript
运行
复制
### 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和相应的文件名的向量,你可以把它们下载到你的硬盘上。您有两个选择。可以串行下载,也可以并行下载。

代码语言:javascript
运行
复制
### 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文件,请将正则表达式更改为

代码语言:javascript
运行
复制
fnames <- grep('(zip)|(gz)$', fnames, value = T)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25797242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档