Ir al contenido principal

Web scraping con R y PhantomJS

Breve tutorial sobre cómo extraer datos generados con JavaScript en R usando PhantomJS.
Actualizado 17 sept 2026  · 5 min leer

Explorar con IA

ChatGPTClaudePerplexity

Cuando necesitas hacer web scraping, normalmente utilizarías el paquete rvest de Hadley Wickham. Este paquete ofrece una solución lista para usar para obtener el código HTML que genera una página web. Sin embargo, cuando el sitio o la página usa JavaScript para mostrar los datos que te interesan, al paquete rvest le falta la funcionalidad necesaria. Una solución es usar PhantomJS.

\n

¿Quieres practicar la importación de más datos en R? Prueba este tutorial.

\n
\n

Carga los paquetes necesarios

\n

Como primer paso, tendrás que cargar en tu espacio de trabajo todos los paquetes que necesitaremos para este análisis (si aún no los has instalado en tu sistema local, usa install.packages() para tenerlos disponibles):

\n
library(rvest)\nlibrary(stringr)\nlibrary(plyr)\nlibrary(dplyr)\nlibrary(ggvis)\nlibrary(knitr)\noptions(digits = 4)\n
\n

Scraping de datos generados con JavaScript en R

\n

El siguiente paso es recopilar los datos de TechStars usando PhantomJS. Echa un vistazo al siguiente archivo .js básico:

\n
// scrape_techstars.js\n\nvar webPage = require('webpage');\nvar page = webPage.create();\n\nvar fs = require('fs');\nvar path = 'techstars.html'\n\npage.open('http://www.techstars.com/companies/stats/', function (status) {\n  var content = page.content;\n  fs.write(path,content,'w')\n  phantom.exit();\n});\n
\n

El script básicamente renderiza la página HTML después de que el código JavaScript haya hecho su trabajo, lo que te permite obtener la página con todas sus tablas. Para permanecer en R durante el resto del análisis, te sugerimos usar la función system() para invocar PhantomJS (tendrás que descargar e instalar PhantomJS y colocarlo en tu directorio de trabajo):

\n
# Deja que PhantomJS haga scraping de TechStars; el resultado se guarda en techstars.html\nsystem(\"./phantomjs scrape_techstars.js\")\n
\n

Tras este pequeño rodeo, por fin tienes un archivo HTML, techstars.html, en tu sistema local, que puede extraerse con rvest. Al inspeccionar la página de Techstars vemos que las tablas que nos interesan están en divs con la clase CSS batch:

\n
batches <- html(\"techstars.html\") %>%\n  html_nodes(\".batch\")\n\nclass(batches)\n
\n
[1] \"XMLNodeSet\"\n
\n

Ahora tienes una lista de objetos XMLNodeSet: cada objeto contiene los datos de una cohorte de TechStars. Dentro podemos encontrar información sobre la ubicación de la cohorte, el año, la temporada, así como sobre las empresas, su sede actual, su estado actual y la financiación total que han levantado. No entraremos al detalle de los pasos de recopilación y limpieza de datos a continuación; puedes ejecutar el código tú mismo e inspeccionar qué hace. Verás que hay limpieza personalizada para asegurarnos de que cada dato quede bien formateado:

\n
batch_titles <- batches %>%\n  html_nodes(\".batch_class\") %>%\n  html_text()\n\nbatch_season <- str_extract(batch_titles, \"(Fall|Spring|Winter|Summer)\")\nbatch_year <- str_extract(batch_titles, \"([[:digit:]]{4})\")\n# la ubicación es todo lo del título que no es año ni temporada\nbatch_location <- sub(\"\\\\s+$\", \"\",\n                      sub(\"([[:digit:]]{4})\", \"\",\n                          sub(\"(Fall|Spring|Winter|Summer)\",\"\",batch_titles)))\n\n# crea un data frame con la información de la cohorte\nbatch_info <- data.frame(location = batch_location,\n                         year = batch_year,\n                         season = batch_season)\n\nbreakdown <- lapply(batches, function(x) {\n  company_info <- x %>% html_nodes(\".parent\")\n  companies_single_batch <- lapply(company_info, function(y){\n    as.list(gsub(\"\\\\[\\\\+\\\\]\\\\[\\\\-\\\\]\\\\s\", \"\", y %>%\n       html_nodes(\"td\") %>%\n       html_text()))\n  })\n  df <- data.frame(matrix(unlist(companies_single_batch),\n                   nrow=length(companies_single_batch),\n                   byrow=T,\n                   dimnames = list(NULL, c(\"company\",\"funding\",\"status\",\"hq\"))))\n  return(df)\n})\n\n# añade la información de cohorte al desglose\nbatch_info_extended <- batch_info[rep(seq_len(nrow(batch_info)),\n                                  sapply(breakdown, nrow)),]\nbreakdown_merged <- rbind.fill(breakdown)\n\n# combina toda la información\ntechstars <- tbl_df(cbind(breakdown_merged, batch_info_extended)) %>%\n  mutate(funding = as.numeric(gsub(\",\",\"\",gsub(\"\\\\$\",\"\",funding))))\n
\n

Con una combinación de funciones base de R y de rvest, plyr y dplyr, ahora tenemos el data frame techstars; un conjunto de datos con todas las empresas de TechStars y toda la información pública, ya bien formateada:

\n
techstars\n
\n
## Source: local data frame [535 x 7]\n##\n##          company funding   status                hq location year season\n## 1    Accountable  110000   Active    Fort Worth, TX   Austin 2013   Fall\n## 2          Atlas 1180000   Active        Austin, TX   Austin 2013   Fall\n## 3        Embrace  110000   Failed        Austin, TX   Austin 2013   Fall\n## 4  Filament Labs 1490000   Active        Austin, TX   Austin 2013   Fall\n## 5        Fosbury  300000   Active        Austin, TX   Austin 2013   Fall\n## 6          Gone!  840000   Active San Francisco, CA   Austin 2013   Fall\n## 7     MarketVibe  110000 Acquired        Austin, TX   Austin 2013   Fall\n## 8           Plum 1630000   Active        Austin, TX   Austin 2013   Fall\n## 9  ProtoExchange  110000   Active        Austin, TX   Austin 2013   Fall\n## 10       Testlio 1020000   Active        Austin, TX   Austin 2013   Fall\n## ..           ...     ...      ...               ...      ...  ...    ...\n
\n
names(techstars)\n
\n
## [1] \"company\"  \"funding\"  \"status\"   \"hq\"       \"location\" \"year\"\n## [7] \"season\"\n
\n

Conclusión

\n

Con la combinación de herramientas y código anterior hemos logrado extraer datos de un sitio web que usa JavaScript para generar su contenido. Como ves, es un proceso muy estructurado que se puede repetir fácilmente una vez tienes el código inicial. ¿Quieres aprender R y buscas tutoriales y cursos de ciencia de datos y R? Échale un vistazo a DataCamp.

\n
Temas
R
Ciencia de datos

Aprende más sobre R

Curso

Introducción a R

4 h
3.1M
Domina los fundamentos del análisis de datos en R, como vectores, listas y marcos de datos, y practica R con conjuntos de datos reales.
Ver detallesRight Arrow
Iniciar Curso
Ver másRight Arrow
Relacionado
R Project

blog

Las 8 mejores ideas de proyectos R para 2026

Descubre qué es R y todas las ventajas de utilizarlo, con ejemplos e ideas nuevas para un proyecto.
Elena Kosourova's photo

Elena Kosourova

14 min

Tutorial

Tutorial sobre cómo importar datos a R

Averigua cómo importar datos a R, incluidos archivos CSV, JSON, Excel, HTML, bases de datos, SAS, SPSS, Matlab y otros, utilizando los conocidos paquetes de R.
Abid Ali Awan's photo

Abid Ali Awan

10 min

Tutorial

Tutorial sobre cómo instalar R en Windows, Mac OS X y Ubuntu

Esta es una guía para principiantes diseñada para ahorrarte dolores de cabeza y un tiempo valioso si decides instalar R tú mismo.
Francisco Javier Carrera Arias's photo

Francisco Javier Carrera Arias

6 min

Tutorial

Tutorial de Subconjuntos en R

Descubre cómo acceder a los datos de tu marco de datos con el subconjunto. Aprende a hacer subconjuntos utilizando paréntesis o la función subconjunto() de R.
DataCamp Team's photo

DataCamp Team

4 min

Tutorial

Creación de una lista en R

Practica Listas en R utilizando el material del curso Introducción a R de DataCamp.
Ryan Sheehy's photo

Ryan Sheehy

3 min

Tutorial

Tutorial sobre cómo ejecutar consultas SQL en Python y R

Aprenda formas fáciles y eficaces de ejecutar consultas SQL en Python y R para el análisis de datos y la gestión de bases de datos.
Abid Ali Awan's photo

Abid Ali Awan

13 min

Ver MásVer Más