Webscraping

Descarga de datos del Ibex 35 (¿y otros?) minuto a minuto en tiempo (casi) real

El código es

library(httr)
library(plyr)
 
base.url <- "http://www.infobolsa.es/1/wtdb/ChartIntraday"
 
res <- POST(base.url,
            body = list(mv = "M SAN",
                        date = "20160518",
                        compressionMult = 1,
                        isSession = 1))
 
dat <- content(res, as = "parsed",
                type = "application/json")
 
dat <- dat$answer$LST$TV$T09
dat <- ldply(dat, unlist)

Los mutatis mutandis, si alguien tiene la gentileza, en los comentarios.

Cómo capturar datos usados en visualizaciones en la red: una alternativa robusta al scraping

Se me pregunta cómo llegué a los datos con los que armé esta entrada. Recuérdese que gráficos como los que aparecen aquí los pinta tu propio navegador con javascript. De alguna manera, el servidor manda datos a tu navegador y, por lo tanto, de alguna manera, esos datos obran en tu poder. Sólo hay que saber capturarlos.

La manera (más bien, una de ellas):

  • Abre la página con Chrome
  • Abre Chrome DevTools (con control-mayúscula-c en algunas máquinas o a través de menús (Tools, etc.) siempre).
  • Entra a la pestaña Network y selecciona XHR.
  • Busca entre los distintos ficheros intercambiados: típicamente, los datos están en el fichero más voluminoso.

Hay variantes (p.e., el navegador puede estar haciendo una petición POST), pero como todos los lectores de este blog menos, que me conste, uno sois gente lista, seguro que dais con la manera.

Descargar ficheros .gz detrás de HTTPS con R

R

El problema consiste en leer, por ejemplo, [https://stat.ethz.ch/pipermail/r-help-es/2012-August.txt.gz](https://stat.ethz.ch/pipermail/r-help-es/2012-August.txt.gz).

Desde Windows, por algún motivo, es sencillo: se puede usar download.file y luego, readLines directamente (porque no sé si sabéis que esta y otras funciones similares saben leer directamente ficheros comprimidos con gzip).

En Linux parece algo más complicado: download.file se niega a bajar ficheros usando el protocolo [https](http://en.wikipedia.org/wiki/HTTP_Secure). Lo mejor que he sabido hacer es

library(httr)
x <- GET("https://stat.ethz.ch/pipermail/r-help-es/2012-August.txt.gz")
tmp <- tempfile()
writeBin(content(x, "raw"), tmp)
res <- readLines(tmp)
unlink(tmp)

que es feo, feo, feo.

Aventuras de "web scraping": cómo bajarse todo el BOE

R

Rescato aquí para futura o ajena referencia un pedazo de código que utilicé un día para un proyecto que se abortó y que tenía que ver con el análisis del texto del BOE. Reza así:

setwd("~/boe/boes")

library(RCurl)

h = getCurlHandle()

for( i in 1:3231){
  mi.url <- paste("http://www.boe.es/diario_boe/xml.php?id=BOE-A-2013-", i, sep = "")
  nom.fich <- paste("2013-A-",
    formatC(i, width = 6, format = "d", flag = "0"),  ".xml", sep = "")
  res <- getURI(mi.url, curl = h)
  cat(res, file = nom.fich)
}

for( i in 1:3212){
  mi.url <- paste("http://www.boe.es/diario_boe/xml.php?id=BOE-B-2013-", i, sep = "")
  nom.fich <- paste("2013-B-",
    formatC(i, width = 6, format = "d", flag = "0"),  ".xml", sep = "")
  res <- getURI(mi.url, curl = h)
  cat(res, file = nom.fich)
}

No me preguntéis por qué el contador solo llega hasta tres mil doscientos y pico. O por qué no itero hasta que getURI devuelva un error.