2016-07-08 4 views
7

Ich versuche, Texte aus dem chartlyrics API zu bekommen. Ich schreibe eine R-Funktion, die funktioniert, aber nicht innerhalb einer Schleife. Mein Skript ist:Fehler bei curl :: curl_fetch_memory (url, handle = handle): Fehler, wenn Daten aus dem Peer-Empfang

library(httr) 
library(RCurl) 
library(XML) 

df <- data.frame(artist = c('Led Zeppellin', 'Adele'), song = c('Rock´n roll', 'Hello'), stringsAsFactors = F) 

make.querrye <- function(xx) { 
    names_ok <- gsub(" ", "&", xx) 
    names_ok2 <- paste("\'", names_ok, "\'", sep = '') 
querrye <- paste("http://api.chartlyrics.com/apiv1.asmx/SearchLyricDirect?artist=", names_ok[1],"&song=", names_ok[2], sep='') 
data <- GET(querrye) 
aa <- content(data, "text") 
doc <- htmlParse(aa, asText=TRUE) 
plain.text <- xpathSApply(doc, "//lyric//text()[not(ancestor::script)][not(ancestor::style)][not(ancestor::noscript)][not(ancestor::form)]", xmlValue) 
if (length(plain.text)==0) { 
    plain.text2 <- 'Lyrics not found' 
} else { 
    plain.text2 <- iconv(plain.text, from = "UTF-8", to = "latin1", sub = NA, mark = TRUE, toRaw = FALSE) 
} 
return(plain.text2) 
} 


names <- c(df$artist[1], df$song[1]) 
make.querrye(names) #- it works 

names <- c(df$artist[2], df$song[2]) 
make.querrye(names) #- it also works 

Aber meine Funktion funktioniert nicht in einer Schleife

for (ii in 1:2){ 
    names <- c(df$artist[ii], df$song[ii]) 
    print(names) 
    make.querrye(names) 
} 

ich den follwing Fehler:

Error in curl::curl_fetch_memory(url, handle = handle) : Failure when receiving data from the peer

+0

sind Sie hinter einem Proxy? – nachti

+0

Entschuldigung, ich habe heute Ihren Kommentar gesehen. In der Tat bin ich mir deiner Frage nicht sicher. Ist eine wirklich alte Frage und jetzt arbeite ich nicht daran, dann schließe ich die Frage (wenn ich kann, weil ich es vorher nie getan habe). In dieser langen Zeit habe ich gesehen, dass andere eine ähnliche Sache machen und ich denke, dass die Lösung darin besteht, etwas Zeit zwischen den Anfragen zu investieren, aber ich bin mir nicht sicher. Wie auch immer, danke für deine Antwort – pjperez

Antwort

0

Die RETRY Funktion in June 2016 eingeführt wurde, und ermöglicht Sie können eine Anfrage mehrmals wiederholen, bis sie erfolgreich ist.

es mit dem Parameter verwenden verb = "GET" anstatt direkt GET verwenden, d.h.

data <- VERB("GET", querrye) 

Sie auch die maximale Anzahl der Versuche mit den times Parametern definieren.