(?? первый вопрос!)
Ниже представлен альтернативный подход.
Мы:
- получаем все возможные файлы данных
- Отфильтруйте его только по файлам данных SOLAR zip (вы можете отфильтровать больше, если это необходимо - т.е. ограничить его тем, что имеется в вашем существующем фрейме данных)
- создать папку для сохранения
- загрузить файлы
Обратите внимание, что это действительно плохая форма - забивать сервер последовательными запросами без паузы, так что это вводит это, но это часто игнорируется вежливостью в наши дни.
library(curl)
library(httr)
base_dir <- "ftp://ftp-cdc.dwd.de/pub/CDC/observations_germany/climate/10_minutes/solar/now/"
# Get all available files in that directory
res <- curl_fetch_memory(base_dir, handle = new_handle(dirlistonly = TRUE)
grep(
"SOLAR_[[:digit:]]{5}",
strsplit(rawToChar(res$content), "\n")[[1]], # curl_fetch returns a raw vector since it has no idea what type of content might be there so we have to convert it and it's a text listing so we have to do some more wrangling
value = TRUE
) -> all_zips
head(all_zips)
## [1] "10minutenwerte_SOLAR_00044_now.zip"
## [2] "10minutenwerte_SOLAR_00071_now.zip"
## [3] "10minutenwerte_SOLAR_00073_now.zip"
## [4] "10minutenwerte_SOLAR_00131_now.zip"
## [5] "10minutenwerte_SOLAR_00150_now.zip"
## [6] "10minutenwerte_SOLAR_00154_now.zip"
save_dir <- "~/Data/solar-output"
dir.create(save_dir)
for (zip in all_zips) {
try(httr::GET(
url = sprintf("%s%s", base_dir, zip),
httr::write_disk(file.path(save_dir, zip)), # enables caching (it won't overwrite by default and avoid issues with download.file() on windows)
httr::progress() # progress bars for free!
))
Sys.sleep(5) # be kind to their server CPU and network bandwidth
}
Мы завернемGET()
в try()
, поскольку мы попросили write_disk()
до не перезаписать существующие файлы.Когда это происходит, возникает исключение, поэтому try()
перехватывает его и позволяет циклу продолжать работу (но все равно отображает полезное сообщение о файле, который уже существует).