Tengo algunos enlaces:
myLinks = c("https://www.fotocasa.es/es/comprar/viviendas/torrelavit/todas-las-zonas/l",
"https://www.fotocasa.es/es/comprar/viviendas/torrelles-de-foix/todas-las-zonas/l",
"https://www.fotocasa.es/es/comprar/viviendas/vilafranca-del-penedes/todas-las-zonas/l",
"https://www.fotocasa.es/es/comprar/viviendas/vilobi-del-penedes/todas-las-zonas/l"
)
Uno de los enlaces está devolviendo un error, pero no quiero eliminarlo, solo quiero almacenar el enlace para poder inspeccionarlo más a fondo.
Codigo de DATOS:
library(RSelenium)
library(rvest)
library(tidyverse)
rD <- rsDriver(browser="firefox", port=4536L)
remDr <- rD[["client"]]
collectZonaLinkData <- function(zona_url_to_get){
remDr$navigate(zona_url_to_get)
#click on Distrito
remDr$findElement(using = "xpath", '/html/body/div[1]/div[2]/div[1]/div[3]/div/div[1]/div')$clickElement()
html_zona_full_page = remDr$getPageSource()[[1]] %>%
read_html()
Zonas_Names = html_zona_full_page %>%
html_nodes('.re-GeographicSearchNext-checkboxItem.is-checked') %>% # only interested in the checked name boxes
html_nodes('.re-GeographicSearchNext-checkboxItem-literal') %>%
html_text()
Zonas_Link = html_zona_full_page %>%
html_nodes('.re-GeographicSearchNext-checkboxItem.is-checked') %>%
html_attr('href') %>%
paste("https://www.fotocasa.es",., sep = "")
zonas = cbind.data.frame(Zonas_Names, Zonas_Link)
return(zonas)
}
Puedo ejecutar lo siguiente:
out = map(myLinks, ~ collectZonaLinkData(.x)) %>%
set_names(myLinks) %>%
bind_rows(.id = "ID")
Lo que da el siguiente error:
Error en data.frame (..., check.names = FALSE): los argumentos implican un número diferente de filas: 0, 1
La URL del problema es la siguiente:
collectZonaLinkData(myLinks[3])
¿Cómo puedo envolver el collectZonaLinkData
interior safely
y asegurarme de que Zonas_Link
contiene un NA
en el marco de datos?
es decir, ejecutando lo siguiente:
myLinks = myLinks[1:2]
out = map(myLinks, ~ collectZonaLinkData(.x)) %>%
set_names(myLinks) %>%
bind_rows(.id = "ID")
Me da la salida para 2 enlaces que funcionan:
ID Zonas_Names
1 https://www.fotocasa.es/es/comprar/viviendas/torrelavit/todas-las-zonas/l Torrelavit
2 https://www.fotocasa.es/es/comprar/viviendas/torrelles-de-foix/todas-las-zonas/l Torrelles de Foix
Zonas_Link
1 https://www.fotocasa.es/es/comprar/viviendas/torrelavit/todas-las-zonas/l
2 https://www.fotocasa.es/es/comprar/viviendas/torrelles-de-foix/todas-las-zonas/l
El tercer enlace no funciona, por lo que puede recopilar el ID
pero para Zonas_Names
y Zonas_Link
me gustaría un NA
en estas columnas.
No estoy seguro de si debo envolver la safely()
función alrededor Zonas_Names
y Zonas_Links
dentro de collectZonaLinkData
?
Rendimiento esperado:
ID Zonas_Names
1 https://www.fotocasa.es/es/comprar/viviendas/torrelavit/todas-las-zonas/l Torrelavit
2 https://www.fotocasa.es/es/comprar/viviendas/torrelles-de-foix/todas-las-zonas/l Torrelles de Foix
3 https://www.fotocasa.es/es/comprar/viviendas/vilafranca-del-penedes/todas-las-zonas/l
NA
Zonas_Link
1 https://www.fotocasa.es/es/comprar/viviendas/torrelavit/todas-las-zonas/l
2 https://www.fotocasa.es/es/comprar/viviendas/torrelles-de-foix/todas-las-zonas/l
3 NA
EDITAR:
producción:
# A tibble: 1 × 4
`https://www.fotocasa.… `https://www.fotocasa.es… $Zonas_Link `https://www.fotocasa.e… `https://www.fotocasa.e… $Zonas_Link
<lgl> <fct> <fct> <lgl> <fct> <fct>
1 NA Torrelles de Foix https://www.fotoca… NA Vilobí del Penedès https://www.fotoc…
Solución del problema
Podemos envolver la función como entrada a possibly
osafely
pcollectZonaLinkData <- possibly(collectZonaLinkData,
otherwise = tibble(ID = NA_character_,
Zonas_Names = NA_character_, Zonas_link = NA_character_))
y luego usar esta función enmap
library(purrr)
library(dplyr)
out <- map(myLinks, ~ pcollectZonaLinkData(.x)) %>%
set_names(myLinks) %>%
bind_rows(.id = "ID")
No hay comentarios.:
Publicar un comentario