2014-09-11 21 views
2

Я пытаюсь загрузить сжатые файлы с сайта, например http://cdo.ncdc.noaa.gov/qclcd_ascii/. Поскольку есть много файлов, есть ли способ загрузить их в пакетном режиме, а не один за другим? В идеале, загруженные файлы можно распаковать в пакетном режиме после загрузки. Я пытался использовать систему (свернуться http://cdo.ncdc.noaa.gov/qclcd_ascii/QCLCD «) и т.д .. но есть много ошибок и состояние 127 предупреждений.batch загрузить zipped files in R

Любая идея или предложения?

Спасибо!

+0

Вы бы нужно на стороне сервера доступа поместить все в пакетном файле. Возможно, вы можете скачать с помощью одной из параллельных фреймворков, предлагаемых в R? –

+0

Можем ли мы проголосовать, чтобы закрыть это? – mgriebe

+0

да, я так думаю! благодаря! – ponyhd

ответ

1

Это не R, но вы могли бы легко использовать программу wget, игнорируя robots.txt:

Wget -r --no-родительские -e роботы = выкл --accept * .gz http://cdo.ncdc.noaa.gov/qclcd_ascii/

+0

спасибо, я попробую ... – ponyhd

0

Чтобы скачать все в этом каталоге вы можете сделать это:

wget -r -e robots=off http://cdo.ncdc.noaa.gov/qclcd_ascii/ 
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) 
+0

Это записывается в рабочий каталог, который вы можете установить с помощью 'setwd()'. Чтобы распаковать их, 'lapply (grep (". Zip ", files, value = true), unzip)' будет работать для zip-файлов и 'lapply (grep (". Tar.gz ", files, value = true), untar) 'будет работать для файлов tar.gz (хотя вы можете напрямую прочитать файлы tar.gz.txt). – mgriebe

+0

Большое спасибо mgriebe! Это действительно работает очень хорошо! – ponyhd

+0

Как насчет голосования? – mgriebe

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

Если вы решили загрузить параллельно, я рекомендую, учитывая «динамические» планирования, что означает, что каждое ядро ​​не придется ждать, пока другие закончить до начала своей следующей загрузки. Недостатком динамического планирования является добавленная коммуникационная накладная, но поскольку процесс загрузки файлов ~ 50 МБ не очень ресурсоемкий, будет стоить использовать эту опцию, если файлы загружаются со слегка изменяющимися скоростями.

Наконец, если вы хотите, чтобы также включать tar файлы, а также, изменить регулярное выражение

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