R Rvest for() и Ошибка сервера: (503) Служба недоступна

Я новичок в веб-скрейпинге, но мне очень нравится использовать rvest в R. Я пытался использовать его для очистки определенных данных компаний. Я создал цикл for (171 URL-адрес), и когда я запускаю его, он останавливается на 6-м или 7-м URL-адресе с ошибкой.

Error in parse.response(r, parser, encoding = encoding) : 
  server error: (503) Service Unavailable

Когда я начинаю свой цикл с 7-го URL-адреса, он продолжается еще два или три и снова останавливается с той же ошибкой. Моя петля

library(rvest)    
thing<-c("http://www.informazione-aziende.it/Azienda_ LA-VIS-S-C-A",                                                                                  
    "http://www.informazione-aziende.it/Azienda_ L-ANGOLO-DEL-DOLCE-DI-OBEROSLER-MARCO",                                                         
    "http://www.informazione-aziende.it/Azienda_ MARCHI-LAURA",                                                                                 
    "http://www.informazione-aziende.it/Azienda_ LAVIS-PIZZA-DI-GASPARETTO-MATTEO",                                                              
    "http://www.informazione-aziende.it/Azienda_ LE-DELIZIE-MOCHENE-DI-OSLER-NICOLA",                                                            
    "http://www.informazione-aziende.it/Azienda_ LE-DELIZIE-S-N-C-DI-GAMBONI-PIETRO-E-PISONI-MAURO-C-IN-SIGLA-LE-DELIZIE-S-N-C",                 
    "http://www.informazione-aziende.it/Azienda_ LE-FONTI-DISTILLATI-DI-COVI-MARCELLO",                                                          
    "http://www.informazione-aziende.it/Azienda_ LE-MIGOLE-DI-MATTEOTTI-LUCA",                                                                   
    "http://www.informazione-aziende.it/Azienda_ LECHTHALER-DI-TOGN-LUIGI-E-C-S-N-C",                                                            
    "http://www.informazione-aziende.it/Azienda_ LETRARI-AZ-AGRICOLA")

    thing<-gsub(" ", "", thing)

    d <- matrix(nrow=10, ncol=4)
    colnames(d)<-c("RAGIONE SOCIALE",'ATTIVITA', 'INDIRIZZO', 'CAP')

    for(i in 1:10) {
            a<-thing[i]

            urls<-html(a)

            d[i,2] <- try({ urls %>% html_node(".span") %>% html_text() }, silent=TRUE)
    }

Возможно, есть способ избежать этой ошибки, заранее спасибо, любая помощь будет оценена по достоинству.

UPD Следующим кодом пытаюсь перезапустить цикл выборки данных, с последнего удачного с repeat(), но он зацикливается бесконечно, надеюсь на какие-нибудь подсказки.

    for(i in 1:10) {

  a<-thing[i]

  try({d[i,2]<- try({html(a) }, silent=TRUE)  %>%
         html_node(".span") %>%
         html_text() }, silent=TRUE)

  repeat {try({d[i,2]<- try({html(a) }, silent=TRUE)  %>%
                 html_node(".span") %>%
                 html_text() }, silent=TRUE)}
  if (!is.na(d[i,2])) break
}

Или с while()

for(i in 1:10) {

  a<-thing[i]

while (is.na(d[i,2])) {
  try({d[i,2]<-try({html(a) %>%html_node(".span")},silent=TRUE) %>% html_text() },silent=TRUE)
}
}

While() работает но не очень хорошо и слишком медленно((


person Dima Sukhorukov    schedule 28.04.2015    source источник
comment
Скорее всего, эти веб-страницы недоступны. сделать с rvest себя. Вы можете использовать try(..., silent=TRUE), чтобы пропустить неработающие URL-адреса.   -  person nrussell    schedule 28.04.2015
comment
@nrussell, может быть, какая-то функция типа if else,if error else(then) перезапускает цикл с последнего + 1 результирующего URL-адреса. Но я не могу представить его код) Будет ли он эффективен?   -  person Dima Sukhorukov    schedule 29.04.2015
comment
d[i,2] <- try({ urls %>% html_node(".span") %>% html_text() }, silent=TRUE), вероятно, будет работать нормально.   -  person nrussell    schedule 29.04.2015
comment
@nrussell, спасибо, но все равно в среднем 2 или 3, но не больше)   -  person Dima Sukhorukov    schedule 29.04.2015
comment
Извините, но я понятия не имею, как выглядят ваши данные, поэтому невозможно сказать, что пошло не так.   -  person nrussell    schedule 29.04.2015
comment
@nrussell Я обновил код, возможно, это будет полезно для решения проблемы, спасибо за ваше время   -  person Dima Sukhorukov    schedule 29.04.2015
comment
@DimaSukhorukov, проблема в том, что ошибка возникает при вызове html(), который вы разместили за пределами вашего блока try(). Переместите оператор urls<-html(a) внутрь блока try(), и он заработает.   -  person bgoldst    schedule 29.04.2015
comment
@bgoldst спасибо, если я правильно понял, это движение правильное? for(i in 1:10) { a<-thing[i] d[i,2] <- try({ html(a) %>% html_node(".span") %>% html_text() }, silent=TRUE) } он не выдает ошибку, но заполняет матрицу (Ошибка в parse.response(r, parser, encoding = e), URL-адреса правильные.... хм, я делаю что-то неправильно?   -  person Dima Sukhorukov    schedule 29.04.2015
comment
@ДимаСухоруков, да, верно. Теперь проблема в том, что назначение d[i,2] <- находится за пределами блока try(). Если вы переместите это внутрь, то присваивание вообще не произойдет, если есть ошибка.   -  person bgoldst    schedule 29.04.2015
comment
@bgoldst и в результате я получу либо ошибку 503 в ячейке матрицы, либо значение NA. надеюсь это не окончательное решение)   -  person Dima Sukhorukov    schedule 29.04.2015


Ответы (1)


Похоже, если вы попадете на этот сайт слишком быстро, вы получите 503. Добавьте Sys.sleep(2), и все 10 итераций сработали для меня...

library(rvest)    
thing<-c("http://www.informazione-aziende.it/Azienda_ LA-VIS-S-C-A",                                                                                  
         "http://www.informazione-aziende.it/Azienda_ L-ANGOLO-DEL-DOLCE-DI-OBEROSLER-MARCO",                                                         
         "http://www.informazione-aziende.it/Azienda_ MARCHI-LAURA",                                                                                 
         "http://www.informazione-aziende.it/Azienda_ LAVIS-PIZZA-DI-GASPARETTO-MATTEO",                                                              
         "http://www.informazione-aziende.it/Azienda_ LE-DELIZIE-MOCHENE-DI-OSLER-NICOLA",                                                            
         "http://www.informazione-aziende.it/Azienda_ LE-DELIZIE-S-N-C-DI-GAMBONI-PIETRO-E-PISONI-MAURO-C-IN-SIGLA-LE-DELIZIE-S-N-C",                 
         "http://www.informazione-aziende.it/Azienda_ LE-FONTI-DISTILLATI-DI-COVI-MARCELLO",                                                          
         "http://www.informazione-aziende.it/Azienda_ LE-MIGOLE-DI-MATTEOTTI-LUCA",                                                                   
         "http://www.informazione-aziende.it/Azienda_ LECHTHALER-DI-TOGN-LUIGI-E-C-S-N-C",                                                            
         "http://www.informazione-aziende.it/Azienda_ LETRARI-AZ-AGRICOLA")

thing<-gsub(" ", "", thing)

d <- matrix(nrow=10, ncol=4)
colnames(d)<-c("RAGIONE SOCIALE",'ATTIVITA', 'INDIRIZZO', 'CAP')

for(i in 1:10) {
  print(i)
  a<-thing[i]  
  urls<-html(a)  
  d[i,2] <- try({ urls %>% html_node(".span") %>% html_text() }, silent=TRUE)
  Sys.sleep(2)
}
person cory    schedule 29.04.2015
comment
ВАУ, это действительно круто!!, Sys.sleep(2) дает отдых на 2 секунды?? - person Dima Sukhorukov; 29.04.2015
comment
Да, не уверен, достаточно ли 2 секунд или слишком много. Кроме того, вероятно, разумно включить некоторые другие решения для очистки кода... - person cory; 29.04.2015