Web Scraping con R y Fernández-Villaverde

Mike · 2018/06/09 · 3 minute read

La razón principal por la que leo el blog de economía en español Nada es gratis es porque los artículos de Jesús Fernandez-Villaverde (en adelante, JFV) me parecen magníficos. JFV es un economista de primer nivel con una formación técnica envidiable y, además de su producción académica, dedica tiempo a exponer en Nada es gratis cuestiones sustantivas sobre economía, instituciones o métodos cuantitativos dando respuestas inteligentes a muchos de los interrogantes que me intrigan profundamente. Incluso ha acudido al Congreso en más de una ocasión a decirles unas cuantas verdades incómodas a los miembros del cutre establishment político en España.

Últimamente no escribe mucho, por lo que me dedico a rastrear el historial del blog en busca de alguno de las 616 entradas que ha escrito y que no haya leído. Sin embargo, la página muestra las entradas al buscar por autores de treinta en treinta aproximadamente (y con la imagen de miniatura de cada entrada) por lo que llegar a las entradas de hace varios años resulta bastante tedioso: darle a siguientes, bajar el scroll, darle a siguientes, etc. hasta llegar al final tras bastantes clics.

Si tuviera una lista con las fechas, títulos y enlaces de las entradas podría acceder a las que me interesen mucho más rápido, por lo que -en honor a los fans de JFV- y para mi propio beneficio, he utilizado algunos paquetes de R para extraer la información que me interesa de la página y conformar esa base de datos. He creado un script de R en el que señalo todos los pasos y que se puede descargar, al final, si se quiere replicar el resultado.

Procedimiento

Tal como está diseñada la página no puedo extraer los enlaces directamente desde la url, por lo que he descargado la página tras haber dado los clics pertinentes hasta llegar al primer artículo de 2009 y selecciono esta página descargada mediante choose.files.

# Cargando paquetes
install.packages("tidyverse")
install.packages("rvest")

library("rvest")
library("tidyverse")

web <- choose.files()

page <- read_html(web)

Para seleccionar el contenido que me interesa, utilizo la extensión de Chrome Selector Gadget.

jfv-selector

Con ella marco la parte de la web de la que quiero extraer los datos y obtengo el selector CSS que lo identifica. En el caso de los títulos y enlaces es h3 a .

# Extrayendo los títulos y enlaces

titles_html <- html_nodes(page,'h3 a') 

## Separando texto

titles <- html_text(titles_html)

Para los enlaces, busco el atributo que los identifica en en el objeto titles_html y creo el vector, que también limpio.

Por alguna razón que desconozco, el último elemento extraído conduce a una web de mudanzas turca (sí, una web de mudanzas turca). Como no nos interesa, nos libramos de él tanto en el vector de títulos, como en el de enlaces.

### Limpiando el vector

titles <- titles[-c(617)] 

## Separando enlaces

urls <- titles_html %>%
  xml_attr('href')

### Limpiando el vector

urls <- urls[-c(617)] 

# Extrayendo las fechas

times_html <- html_nodes(page, 'time')

## Separando texto

times <- html_text(times_html)

Al extraer las fechas aparecen con caracteres adicionales, que eliminamos con gsub. Unimos los vectores en un data.frame y guardamos el resultado.

### Limpiando el vector 

times <- gsub("\n\t\t\t\t\t\t","",time)
times <- gsub("\t\t\t\t\t","",time)

# Creando data.frame

JFV <- data.frame(times, titles, urls)

# Guardando el resultado

write.csv2(JFV, file = "JFV.csv", row.names=FALSE)

He creado un repositorio en Github en el que incluyo todo lo necesario para replicar el resultado (la web y el script de R), así como el resultado en csv y, tras una edición leve -cambiar nombres de columna y hacer los enlaces clicables en el formato excel.

jfv-excel