Я новичок в веб-скрейпинге, но мне очень нравится использовать 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()
работает но не очень хорошо и слишком медленно((
rvest
себя. Вы можете использоватьtry(..., silent=TRUE)
, чтобы пропустить неработающие URL-адреса. - person nrussell   schedule 28.04.2015if else
,if
errorelse(then)
перезапускает цикл с последнего + 1 результирующего URL-адреса. Но я не могу представить его код) Будет ли он эффективен? - person Dima Sukhorukov   schedule 29.04.2015d[i,2] <- try({ urls %>% html_node(".span") %>% html_text() }, silent=TRUE)
, вероятно, будет работать нормально. - person nrussell   schedule 29.04.2015html()
, который вы разместили за пределами вашего блокаtry()
. Переместите операторurls<-html(a)
внутрь блокаtry()
, и он заработает. - person bgoldst   schedule 29.04.2015for(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.2015d[i,2] <-
находится за пределами блокаtry()
. Если вы переместите это внутрь, то присваивание вообще не произойдет, если есть ошибка. - person bgoldst   schedule 29.04.2015