Соскреб в Интернете - попробуйте один URL, а в случае неудачи попробуйте другой URL - PullRequest
0 голосов
/ 12 марта 2020

Я создаю скрипт, который будет автоматически очищать ежемесячные данные с сайта. Он загружает zip-файл и распаковывает его. Иногда веб-сайт не обновляет свои данные вовремя, поэтому мне нужно установить условие, при котором он пытается выполнить URL-адрес, связанный с самым последним месяцем (например, m202002.zip), и в случае сбоя он получает данные за предыдущий месяц ( ex - m202001.zip).

Вот базовый c скрипт загрузки:

if (!require('lubridate')) install.packages('lubridate', repos = 'http://cran.us.r-project.org', dependencies=TRUE); library('lubridate')
if (!require('download')) install.packages('download', repos = 'http://cran.us.r-project.org', dependencies=TRUE); library('download')

# Set dates
today <- Sys.Date() # today
current_year <- format(as.Date(Sys.Date()), '%Y') # current year
previous_1month <- format(as.Date(today %m+% months(-1)), '%m') # last month
previous_2month <- format(as.Date(today %m+% months(-2)), '%m') # month before last

# Set directory
data_dir <- 'G:/path/to/file/'
website_dir <- 'https://edcintl.cr.usgs.gov/downloads/sciweb1/shared/uswem/web/conus/eta/modis_eta/monthly/downloads/m'

# Download and unpack most recent file
download.file(paste0(website_dir, current_year, previous_1month, '.zip'), destfile=paste0(data_dir, 'test.zip'), mode='wb')
unzip(paste0(data_dir, 'test.zip'), exdir=data_dir)

Я думаю, мне нужно время while () l oop, которое я не супер знаком с. Вот мой подход, но код не работает. Похоже, что загружается только второй файл независимо от обстоятельств (например, если я предоставлю исходный доступный URL-адрес, он не загружает его, а только второй).

while(TRUE)
{
  zip <- download.file(paste0(website_dir, current_year, previous_1month, '.zip'), destfile=paste0(data_dir, 'test.zip'), mode='wb')
  if(!is(zip, 'try-error')) break
    {
    next
}
    else
    {
      zip <- download.file(paste0(website_dir, current_year, previous_2month, '.zip'), destfile=paste0(data_dir, 'test.zip'), mode='wb')  
    }
  }
unzip(paste0(data_dir, 'test.zip'), exdir=data_dir)

1 Ответ

1 голос
/ 12 марта 2020

Вот код для тестирования в прошлом месяце и продолжения, пока вы не найдете самый последний файл:

require(tidyverse)
# Set dates
today <- Sys.Date() # today

# Set directory
data_dir <- '/tmp/'
website_dir <- 'https://edcintl.cr.usgs.gov/downloads/sciweb1/shared/uswem/web/conus/eta/modis_eta/monthly/downloads/m'

i <- 1
while(TRUE) {
    last_test_month <-  format(today - months(i), "%Y%m")
    zip <- download.file(paste0(website_dir, last_test_month, '.zip'), destfile=paste0(data_dir, 'test.zip'), mode='wb')
    i = i + 1
    if(!is(zip, 'try-error')) break
}
unzip(paste0(data_dir, 'test.zip'), exdir=data_dir)
...