Я пытаюсь очистить данные с веб-сайта, который, к сожалению, находится на очень ненадежном терминале, который имеет очень изменчивое время реакции. Первой идеей является, конечно, перебрать список (тысяч) URL-адресов и сохранить загруженные результаты, заполнив список.Динамическое изменение последовательности цикла
Проблема в том, что сервер случайным образом реагирует очень медленно, что приводит к ошибке таймаута. Это само по себе не будет проблемой, поскольку я могу использовать функцию tryCatch()
и перейти к следующей итерации. Тем не менее, я пропускаю некоторые файлы в каждом прогоне. Я знаю, что каждый из URL-адресов в списке существует, и мне нужны все данные.
Моя идея, таким образом, заключалась бы в использовании tryCatch()
, чтобы оценить, дает ли результат и ошибка getURL()
. Если это так, цикл переходит к следующей итерации, а ошибочный URL-адрес добавляется в конец списка URL-адреса, по которому выполняется цикл. Мое интуитивное решение будет выглядеть примерно так:
dwl = list()
for (i in seq_along(urs)) {
temp = tryCatch(getURL(url=urs[[i]]),error=function(e){e})
if(inherits(temp,"OPERATION_TIMEDOUT")){ #check for timeout error
urs[[length(urs)+1]] = urs[[i]] #if there is one the erroneous url is appended at the end of the sequence
next} else {
dwl[[i]] = temp #if there is no error the data is saved in the list
}
}
Если это «бы» работа, которую я бы в конечном итоге иметь возможность загрузить все URL-адреса в списке. Он, однако, не работает, поскольку на странице справки для функции next
указано: «seq в цикле for оценивается в начале цикла, а его изменение впоследствии не влияет на цикл». Есть ли обходной путь для этого или трюк, с которым я мог бы достичь своей предполагаемой цели? Я благодарен за каждый комментарий!
эй спасибо большое! отличное решение! – chameau13