example - geturl r
realizar solicitudes concurrentes de RCurl GET para un conjunto de URL (1)
Tuve una mala experiencia con RCurl y la solicitud de Async. R se congelaría por completo (aunque no hubo mensaje de error, la CPU y la RAM no se dispararon) con solo 20 solicitudes concurrentes.
Recomiendo cambiar a CURL y usar la función curl_fetch_multi (). En mi caso, podría manejar fácilmente la solicitud de 50000 JSON en un grupo (con alguna división en subpools bajo el capó). https://cran.r-project.org/web/packages/curl/vignettes/intro.html#async_requests
Escribí una función para usar RCurl para obtener la URL efectiva para una lista de redireccionamientos de URL acortados (bit.ly, t.co, etc.) y manejar errores cuando la URL efectiva localiza un documento (los archivos PDF tienden a arrojar "Error en curlPerform"). ... nul incrustado en una cuerda. ")
Me gustaría hacer esta función de manera más eficiente si es posible (manteniéndola en R). Como está escrito, el tiempo de ejecución es prohibitivamente largo para no acortar mil o más URL.
?getURI
nos dice que, de forma predeterminada, getURI / getURL se vuelve asíncrono cuando la longitud del vector url es> 1. Pero mi rendimiento parece totalmente lineal, presumiblemente porque con sapply
convierte la cosa en un gran ciclo y la concurrencia se pierde.
¿De todos modos puedo acelerar estas solicitudes? Crédito adicional por solucionar el problema "nul incrustado".
require(RCurl)
options(RCurlOptions = list(verbose = F, followlocation = T,
timeout = 500, autoreferer = T, nosignal = T,
useragent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2)"))
# find successful location (or error msg) after any redirects
getEffectiveUrl <- function(url){
c = getCurlHandle()
h = basicHeaderGatherer()
curlSetOpt( .opts = list(header=T, verbose=F), curl= c, .encoding = "CE_LATIN1")
possibleError <- tryCatch(getURI( url, curl=c, followlocation=T,
headerfunction = h$update, async=T),
error=function(e) e)
if(inherits(possibleError, "error")){
effectiveUrl <- "ERROR_IN_PAGE" # fails on linked documents (PDFs etc.)
} else {
headers <- h$value()
names(headers) <- tolower(names(headers)) #sometimes cases change on header names?
statusPrefix <- substr(headers[["status"]],1,1) #1st digit of http status
if(statusPrefix=="2"){ # status = success
effectiveUrl <- getCurlInfo(c)[["effective.url"]]
} else{ effectiveUrl <- paste(headers[["status"]] ,headers[["statusmessage"]]) }
}
effectiveUrl
}
testUrls <- c("http://t.co/eivRJJaV4j","http://t.co/eFfVESXE2j","http://t.co/dLI6Q0EMb0",
"http://www.google.com","http://1.uni.vi/01mvL","http://t.co/05Mz00DHLD",
"http://t.co/30aM6L4FhH","http://www.amazon.com","http://bit.ly/1fwWZLK",
"http://t.co/cHglxQkz6Z") # 10th URL redirects to content w/ embedded nul
system.time(
effectiveUrls <- sapply(X= testUrls, FUN=getEffectiveUrl, USE.NAMES=F)
) # takes 7-10 secs on my laptop
# does Vectorize help?
vGetEffectiveUrl <- Vectorize(getEffectiveUrl, vectorize.args = "url")
system.time(
effectiveUrls2 <- vGetEffectiveUrl(testUrls)
) # nope, makes it worse