html - redskins - curl r
R: Verifique la existencia de url, problemas con httr: GET() y url.exists() (2)
Tengo una lista de aproximadamente 13,000 URL de las que quiero extraer información, sin embargo, no todas las URL realmente existen. De hecho, la mayoría no. Acabo de intentar pasar las 13,000 URL a través de html()
pero lleva mucho tiempo. Estoy tratando de encontrar la manera de ver si las URL existen realmente antes de analizarlas en html()
. He intentado usar las httr
y GET()
, así como las rcurls
y url.exists()
. Por alguna razón, url.exist()
siempre devuelve valores FALSE
, incluso cuando la URL existe, y la forma en que estoy usando GET()
siempre es exitosa, creo que esto se debe a que la página está siendo redireccionada.
Las siguientes URL representan el tipo de páginas que estoy analizando, la primera no existe
urls <- data.frame(''site'' = 1:3, ''urls'' = c(''https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-1&unit=SLE010'',
''https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=HMM202'',
''https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=SLE339''))
urls$urls <- as.character(urls$urls)
Para GET()
, el problema es que la segunda URL no existe, pero se redirige y, por lo tanto, devuelve un "éxito".
urls$urlExists <- sapply(1:length(urls[,1]),
function(x) ifelse(http_status(GET(urls[x, ''urls'']))[[1]] == "success", 1, 0))
Para url.exists()
, obtengo tres FALSE devueltos aunque la primera y la tercera urls sí existen.
urls$urlExists2 <- sapply(1:length(urls[,1]), function(x) url.exists(urls[x, ''urls'']))
Revisé estas dos publicaciones 1 , 2 , pero preferiría no utilizar un userragent simplemente porque no estoy seguro de cómo encontrar el mío o si cambiaría para diferentes personas que usan este código en otras computadoras. Por lo tanto, hacer que el código sea más difícil de recoger y usar por otros. Ambas respuestas de mensajes sugieren usar GET()
en httr
. Parece que GET()
es probablemente el método preferido, pero tendría que averiguar cómo lidiar con el problema de la redirección.
¿Alguien puede sugerir una buena manera en R para probar la existencia de una URL antes de analizarlas en html()
? También me alegraría cualquier otro trabajo sugerido para este problema.
ACTUALIZAR:
Después de ver el valor devuelto por GET()
descubrí que había una solución alternativa, ver las respuestas para más detalles.
Después de una sugerencia de @TimBiegeleisen, miré lo que se devolvió de la función GET()
. Parece que si la url existe, GET()
devolverá esta url como un valor, pero si se redirige, se devuelve una url diferente. Acabo de cambiar el código para ver si la URL devuelta por GET()
coincide con la que envié.
urls$urlExists <- sapply(1:length(urls[,1]), function(x) ifelse(GET(urls[x, ''urls''])[[1]] == urls[x,''urls''], 1, 0))
Me interesaría conocer los mejores métodos que las personas usan para hacer lo mismo.
Con httr, use url_success()
y redirigir a continuación apagado:
library(httr)
urls <- c(
''https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-1&unit=SLE010'',
''https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=HMM202'',
''https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=SLE339''
)
sapply(urls, url_success, config(followlocation = 0L), USE.NAMES = FALSE)