Web Scraping con R

Web Scraping con R

Obtén datos de una página web dinámica

Una de las cosas interesantes cuando se analiza datos es querer comparar datos propios con datos abiertos de la web, lo que conocemos como Web Scraping. Cuando iniciamos nuestro primer objetivo son las páginas que tienen los datos en texto plano Html, en R con el uso de la librería Rvest nos es relativamente sencillo obtener los datos en un dataframe y luego trabajar en con ellas. Pero, ¿Qué pasa con las páginas que para mostrar sus datos ejecutan primero un código JavaScript?

En este tutorial veremos como obtener datos desde este tipo de páginas combinando las bondades de Phantomjs y el ya mencionado Rvest. El ejemplo consiste en obtener los datos del Comité de Operación Económica del Sistema Interconectado Nacional (COES) y graficaremos el resultado.

Instalar dependencias:

  1. Instalar Rvest : install.packages(“rvest”)
  2. Descargar Phantomjs : link

En el caso de Windows ubicar el instalador en el directorio donde se encuentra el programa. Necesitamos ejecutar el código JavaScript que contiene la página para renderizar los datos y lo hacemos con el siguiente código, lo llamaremos “scrape_page.js”

var webPage = require('webpage');
var page = webPage.create();
var fs = require('fs');
var path = 'coes.html'
page.open('https://www.coes.org.pe/Portal/portalinformacion/demanda', function (status) {
  var content = page.content;
  fs.write(path,content,'w')
  phantom.exit();
});

En R escribimos el “script scrape_data.R” para ejecutar el JavaScript. y almacenar la información

library(rvest)
library(tidyverse)
library(stringi)

#path to executable phantomjs
#system("C:\..\\phantomjs.exe scrape_coes.js")

paginawebca<-read_html("../../coes.html")
selectorca<-"#contentHolder > table"
nodo_tabla<-html_node(paginawebca,selectorca)
nodo_tabla<-html_table(nodo_tabla)

Tienes que posicionarte en el directorio donde se encuentra el ejecutable. Phamtonjs renderizará los datos de la página y lo escribe en un archivo html, después con rvest buscamos la tabla de nuestro interés lo convertimos a un dataframe.

head(nodo_tabla)
##              Fecha Ejecutado Prog. Diaria Prog. Semanal
## 1 17/09/2019 00:30 5 707,899    5 756,119     5 623,266
## 2 17/09/2019 01:00 5 581,516    5 620,449     5 623,266
## 3 17/09/2019 01:30 5 502,963    5 553,468     5 476,561
## 4 17/09/2019 02:00 5 446,029    5 505,737     5 476,561
## 5 17/09/2019 02:30 5 431,983    5 458,534     5 394,244
## 6 17/09/2019 03:00 5 336,157    5 453,442     5 394,244

Filtramos los datos que deseamos

data <- nodo_tabla[1:48,]
data$Fecha <- str_replace_all(data$Fecha, "/", "-")
data$Fecha <- as.character(strptime(as.character(data$Fecha),"%d-%m-%Y %H:%M"))
data[2:4] <-data %>% select(2:4)%>%
  mutate_all(str_replace_all," ","")%>%
  mutate_all(str_replace_all,",",".")

Y el gráfico que obtenemos es

library(plotly)
library(dplyr)

dates1 <- strptime(as.character(data$Fecha), "%Y-%m-%d %H:%M:%S")
data <- data[,2:ncol(data)]  #tomamos la parte del dataframe con los valores
data <- data.frame(date=dates1,data)  #Añadimos las fechas

plot_ly(data,x = ~date)%>%
  add_lines(y=data$Ejecutado, name=colnames(data)[2])%>%
  add_lines(y=data$Prog..Diaria,name=colnames(data)[3])%>%
  add_lines(y=data$Prog..Semanal,name=colnames(data)[4])

Puedes descargar el código fuente aqui . No olvides descargar y posicionar el ejecutable de phantomjs.