GOOGLE ADS

lunes, 25 de abril de 2022

purrr de forma segura sobre una función y guardar los enlaces que están dando errores

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 collectZonaLinkDatainterior safelyy asegurarme de que Zonas_Linkcontiene un NAen 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 IDpero para Zonas_Namesy Zonas_Linkme gustaría un NAen estas columnas.

No estoy seguro de si debo envolver la safely()función alrededor Zonas_Namesy Zonas_Linksdentro 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 possiblyosafely

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

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...