2016-05-21 21 views
4

Ich muss auf dieselbe Webseite mit verschiedenen "Schlüsseln" zugreifen, um spezifische Inhalte zu erhalten.Wie aktualisieren oder wiederholen Sie eine bestimmte Webseite mit dem Befehl httr GET?

Ich habe eine Liste von Schlüsseln (x) und ich benutze den GET-Befehl von HTR-Paket, um auf die Webseite zugreifen und dann die Informationen, die ich brauche (y).

library("httr") 
library("stringr") 
library(XML) 

for (i in 1:20){ 
    h1 = GET (paste0("http:....categories=&query=", x[i]),timeout(10)) 
    par = htmlParse(file = h1) 

    y[i]=xpathSApply(doc = par, path = "//h3/a" , fun=xmlValue) 

} 

Das Problem ist, dass Timeout oft erreicht wird, und es unterbricht die Schleife.

Also ich möchte die Webseite aktualisieren oder den GET-Befehl wiederholen, wenn Timeout erreicht ist, weil ich vermute, dass das Problem mit der Internetverbindung der Website ist, auf die ich versuche zuzugreifen.

Die Art und Weise, wie mein Code funktioniert, unterbricht die Schleife. Wenn mir jemand helfen könnte, auch wenn ich eine Möglichkeit zeige, den Fehler zu ignorieren und zur nächsten Iteration zu gehen, ohne die Schleife zu durchbrechen, wäre das erstaunlich.

Antwort

5

bei purrr::safely() Blick. Sie können GET als solche wickeln:

safe_GET <- purrr::safely(GET) 

Dies entfernt die Hässlichkeit von tryCatch(), indem wir dir tun:

resp <- safe_GET("http://example.com") # you can use all legal `GET` params 

Und Sie können resp$result für NULL testen. Setzen Sie das in Ihre Wiederholungsschleife und Sie sind gut zu gehen.

Sie können dies in Aktion sehen, indem Sie:

str(safe_GET("https://httpbin.org/delay/3", timeout(1))) 

die den httpbin Service fragen 3s zu warten, bevor reagiert aber setzen eine explizite Timeout auf der GET Anfrage 1s. Ich wickelte es in str() das Ergebnis zu zeigen:

List of 2 
$ result: NULL 
$ error :List of 2 
    ..$ message: chr "Timeout was reached" 
    ..$ call : language curl::curl_fetch_memory(url, handle = handle) 
    ..- attr(*, "class")= chr [1:3] "simpleError" "error" "condition" 

So können Sie auch die Nachricht überprüfen, wenn Sie benötigen.

+0

vielen Dank! Es funktioniert perfekt. –

1

http_status(h1) können Sie wissen, helfen, wo das Problem liegt:

a <- http_status(GET("http://google.com")) 
a 

$category 
[1] "Success" 

$reason 
[1] "OK" 

$message 
[1] "Success: (200) OK" 

und

b <- http_status(GET("http://google.com/blablablablaba")) 
b 

$category 
[1] "Client error" 

$reason 
[1] "Not Found" 

$message 
[1] "Client error: (404) Not Found" 

Sehen Sie diese list of HTTP status codes wissen, was der Code, den Sie Mittel erhalten.

Außerdem tryCatch können Sie erreichen, was Sie wollen helfen:

tryCatch({GET(h1)}, error = function(e){print("error")}) 
+1

tryCatch war was ich brauchte. Es ist mir egal, was der Fehler ist, ich brauchte nur etwas, das verhindern würde, dass die Zeitüberschreitung die Schleife unterbricht. Vielen Dank. –

+0

Ich bin froh, dass ich dir helfen konnte. Vergessen Sie nicht, die Antwort zu akzeptieren, bitte. –