tacosdedatos

loading...

Raspando a Barragán

Manuel Toral
Halfway crook y especialista en datos.
・4 min read

Inauguro este espacio escribiendo sobre cosas que me gustan y por las que me interesé en las bases de datos. Una de esas cosas es la de recopilar información de la internet y jugar con ella, con liberad y quizás como detonante de otras ideas.

Un ejemplo es la base de la Fundación Barragán, establecida en 1996 en Birsfelden en Suiza. Llegué a ella por una discusión en twitter y me impresioné del trabajo tan minucioso de la fundación por recuerar el legado de Barragán. Pensé que sería interesante tener esa información en una base de datos y jugar con ella a voluntad. Acá les comparto el proceso.

Bibliotecas

Voy a usar el conjunto de paquetes del tidyverse para el tratamiento general de los datos y el raspador web (scrapeador) rvest.

pacman::p_load(tidyverse, rvest, rayshader, tmap)
Enter fullscreen mode Exit fullscreen mode

Definir el URL

Extraeré la información Barragán en mi computadora.

url <- "https://www.barragan-foundation.org/works/list"
Enter fullscreen mode Exit fullscreen mode

Iniciar el raspado (scraping)

Utilicé Selector Gadget para seleccionar en la página de la Fundación Barragán las ubicaciones de las piezas de información que necesitaba. Esta herramiente me permitió por ejemplo, seleccionar todos los años de las obras gracias que están ubicadas en .work-year. Al poner esta ubicación en el comando html_nodes() puedo extraer todo lo que se encuentre en ese lugar.

Así fue como construí un objeto para cada uno de los elementos que necesitaba. Probablemente este es un buen espacio para pensar en una función o en un apply que ahorre líneas de código.


yr <- read_html(url) %>% 
  html_nodes(".work-year") %>% 
  html_text()

titulo <- read_html(url) %>% 
  html_nodes(".work-title") %>% 
  html_text()

categoria <- read_html(url) %>% 
  html_nodes(".category") %>% 
  html_text()

colaboracion <- read_html(url) %>% 
  html_nodes(".meta-collab") %>% 
  html_text()

locacion <- read_html(url) %>% 
  html_nodes(".short-location") %>% 
  html_text()

Enter fullscreen mode Exit fullscreen mode

Coordenadas

url_map <- "https://www.barragan-foundation.org/works/map"
Enter fullscreen mode Exit fullscreen mode

lat <- read_html(url_map) %>% 
  html_nodes("section")%>% 
  html_attr("data-lat")

long <- read_html(url_map) %>% 
  html_nodes("section")%>% 
  html_attr("data-lon")

dir <- read_html(url_map) %>% 
  html_nodes("section")%>% 
  html_attr("data-addr")


Enter fullscreen mode Exit fullscreen mode

Pegamos todo en un tibble

Uní todas las partes que fui recolectando en una sola tabla.

barragan <- tibble(
  year = yr %>% str_squish(),
  titulo, 
  categoria = categoria %>% str_squish(),
  colaboracion=colaboracion %>% str_squish(),
  locacion=locacion %>% str_squish(),
  latitud = lat,
  longitud = long,
  direccion = dir
)

glimpse(barragan)
Enter fullscreen mode Exit fullscreen mode

Rows: 168
Columns: 8
$ year "1927", "1927, 1936", "Late 1920s", "L~
$ titulo "Houses for Adolfo Robles Castillo", "~
$ categoria "Semi-detached residences", "Townhouse~
$ colaboracion "", "Collaborating architect in the 19~
$ locacion "Guadalajara, State of Jalisco", "Guad~
$ latitud "20.674519", "20.673354", "20.681558",~
$ longitud "-103.361219", "-103.353713", "-103.34~
$ direccion "1095 Avenida Vallarta and 27 Calle Ar~

¿Qué hacer con esta base? Pues, además de conocer la obra de Barragán, quizás sea una buena oportunidad para visualizar. Por ejemplo, la localización de cada una de sus obras. Voy a usar sf de Edzer Pebesma y tmap de Martijn Tennekes.

tmap_mode("view")

mapa <- barragan %>% 
  mutate(across(c(latitud, longitud), 
                as.numeric)) %>% 
  filter(!is.na(longitud)) %>% 
  sf::st_as_sf(coords = c("longitud", "latitud"), 
               crs = 4329)

tm_shape(mapa) + tm_dots()
Enter fullscreen mode Exit fullscreen mode

Pièce de résistance

Y aquí es donde se me ocurrió una idea: "imaginemos que cada punto en donde se localiza una obra de Barragán fuera una torre de Satélite". Así es como hice los pasos prohibidos: rayshader de Tyler Morgan-Wall.

primcol <- c("white","yellow", "blue", "grey80", "red")


#color=sample(primcol, 16, replace=T)

satelite <- barragan %>% 
  filter(locacion == "Guadalajara, State of Jalisco") %>% 
  filter(!is.na(latitud)) %>% 
  mutate(alto = floor(runif(n(), min=1, max=5))) %>% 
  add_row(alto = 0) %>% 
  ggplot(aes(latitud, longitud,
             color = alto)) +
  geom_point(size = 5, shape=17) +
  scale_color_gradientn(colours = primcol) +
  guides(color = "none") +
  theme(axis.text = element_blank(),
        axis.title = element_blank(),
        panel.background = element_blank(), 
        axis.ticks = element_blank())

satelite
Enter fullscreen mode Exit fullscreen mode

Preliminar

plot_gg(satelite, width = 5, 
        multicore = TRUE, windowsize = c(1400, 700), 
        zoom = 0.3, phi = 35, 
        theta = 30, sunangle = 200, 
        soliddepth = -100)

Sys.sleep(5)

render_snapshot()
Enter fullscreen mode Exit fullscreen mode

Torres de Satélite

Datos sobre la sesión

sessionInfo()
Enter fullscreen mode Exit fullscreen mode

R version 4.1.1 (2021-08-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18362)

Matrix products: default

locale:
[1] LC_COLLATE=Spanish_Mexico.1252 LC_CTYPE=Spanish_Mexico.1252

[3] LC_MONETARY=Spanish_Mexico.1252 LC_NUMERIC=C

[5] LC_TIME=Spanish_Mexico.1252

attached base packages:
[1] stats graphics grDevices utils datasets methods

[7] base

other attached packages:
[1] tmap_3.3-2 rayshader_0.26.1 rvest_1.0.0

[4] forcats_0.5.1 stringr_1.4.0 dplyr_1.0.7

[7] purrr_0.3.4 readr_1.4.0 tidyr_1.1.3

[10] tibble_3.1.2 ggplot2_3.3.4 tidyverse_1.3.1

loaded via a namespace (and not attached):
[1] fs_1.5.0 sf_1.0-0 lubridate_1.7.10

[4] doParallel_1.0.16 RColorBrewer_1.1-2 progress_1.2.2

[7] httr_1.4.2 tools_4.1.1 backports_1.2.1

[10] utf8_1.2.1 R6_2.5.0 KernSmooth_2.23-20
[13] DBI_1.1.1 colorspace_2.0-1 raster_3.4-13

[16] sp_1.4-5 withr_2.4.2 tidyselect_1.1.1

[19] prettyunits_1.1.1 leaflet_2.0.4.1 curl_4.3.1

[22] compiler_4.1.1 extrafontdb_1.0 leafem_0.1.6

[25] cli_3.0.1 pacman_0.5.1 xml2_1.3.2

[28] bookdown_0.22 scales_1.1.1 classInt_0.4-3

[31] proxy_0.4-26 digest_0.6.27 rmarkdown_2.9

[34] base64enc_0.1-3 dichromat_2.0-0 pkgconfig_2.0.3

[37] htmltools_0.5.1.1 extrafont_0.17 dbplyr_2.1.1

[40] htmlwidgets_1.5.3 rlang_0.4.11 readxl_1.3.1

[43] rstudioapi_0.13 generics_0.1.0 jsonlite_1.7.2

[46] crosstalk_1.1.1 magrittr_2.0.1 Rcpp_1.0.7

[49] munsell_0.5.0 fansi_0.5.0 abind_1.4-5

[52] lifecycle_1.0.0 stringi_1.7.3 leafsync_0.1.0

[55] yaml_2.2.1 tmaptools_3.1-1 grid_4.1.1

[58] parallel_4.1.1 crayon_1.4.1 lattice_0.20-44

[61] haven_2.4.1 stars_0.5-3 hms_1.1.0

[64] knitr_1.33 pillar_1.6.2 codetools_0.2-18

[67] reprex_2.0.0 XML_3.99-0.6 glue_1.4.2

[70] evaluate_0.14 blogdown_1.4 modelr_0.1.8

[73] selectr_0.4-2 png_0.1-7 vctrs_0.3.8

[76] foreach_1.5.1 Rttf2pt1_1.3.8 cellranger_1.1.0

[79] gtable_0.3.0 assertthat_0.2.1 xfun_0.24

[82] lwgeom_0.2-7 broom_0.7.7 e1071_1.7-7

[85] class_7.3-19 viridisLite_0.4.0 iterators_1.0.13

[88] units_0.7-2 rgl_0.107.10 ellipsis_0.3.2

Discussion (0)