Cómo el Web Scraping en R hace divertida la Ciencia de Datos

Raluca Penciuc el 19 oct 2022

A medida que la web evoluciona, se generan más datos de forma dinámica. Esto hace que sea más difícil extraerlos con una API. Web scraping en R viene a ayudar a los científicos de datos, cuyos proyectos necesitan enormes cantidades de datos.

Por suerte, los lenguajes de programación también han evolucionado para hacer frente a estas situaciones. Un ejemplo popular de este tipo de lenguaje es R, diseñado para gestionar mejor las tareas de gran volumen.

En este tutorial, repasaré los principios básicos hablando de la utilidad de R en la vida real. También describiré uno de los paquetes más populares utilizados en el web scraping con R, rvest. Luego ilustraré cómo funciona R en cuestiones de extracción de datos de un sitio web.

Introducción a R

R es la versión de código abierto del lenguaje de programación S, combinado con la semántica de Scheme. Apareció por primera vez a mediados de 1993, se convirtió en código abierto en 1995 y tuvo su primera versión beta estable en 2000.

blog-image

Ross Ihaka y Robert Gentleman diseñaron R con el propósito de "convertir ideas en software de forma rápida y fiel".

R es un lenguaje de programación funcional muy conocido entre los científicos de datos. Sus casos de uso más populares son:

  • bancario;
  • finanzas;
  • comercio electrónico;
  • aprendizaje automático;
  • cualquier otro sector que utilice grandes cantidades de datos.

En comparación con SAS y SPSS, R es la herramienta analítica más utilizada del mundo. Su activa y solidaria comunidad alcanza casi los 2 millones de usuarios.

Si echáramos un vistazo a algunas de las empresas que integran R en sus negocios y cómo lo hacen, veríamos: :

  • Facebook: para actualizar el estado y su gráfico de red social;
  • Google: predicción de la actividad económica y mejora de la eficacia de la publicidad en línea;
  • Foursquare: por su motor de recomendaciones;
  • Trulia: para predecir los precios de la vivienda y los índices de delincuencia local.

Sin embargo, en comparación con otros lenguajes, R compite constantemente con Python. Ambos ofrecen herramientas de web scraping y cuentan con comunidades activas.

Las diferencias aparecen cuando echamos un vistazo al público objetivo. Python tiene una sintaxis muy fácil de aprender y muchas funciones de alto nivel. Esto lo hace más atractivo para principiantes y usuarios no técnicos.

R puede parecer un poco intimidante al principio, pero se centra más en el análisis estadístico. Ofrece un conjunto más amplio de herramientas integradas de análisis y visualización de datos. Por lo tanto, puede ser una mejor opción para proyectos en los que se manejan grandes cantidades de datos, como el web scraping.

Acerca de rvest

Rvest es uno de los paquetes más populares utilizados para el web scraping en R. Ofrece funciones de análisis potentes pero sencillas. BeautifulSoup de Python sirve como fuente de inspiración y forma parte de la colección tidyverse.

Genial, pero ¿por qué usar rvest cuando R tiene bibliotecas nativas que hacen el mismo trabajo? La primera buena razón es el hecho de que rvest es una envoltura sobre los paquetes httr y xml2. Esto significa que se encarga tanto de la petición GET como del análisis sintáctico de HTML.

De este modo, utilizas una librería en lugar de dos y tu código será mucho más limpio y corto. Más que esto, rvest también puede recibir una cadena como entrada y manejar el análisis XML y la descarga de archivos también.

Sin embargo, hay que tener en cuenta que los sitios web tienen más contenidos generados dinámicamente. Las razones son diversas: rendimiento, experiencia del usuario y muchas otras. Rvest no puede manejar la ejecución de JavaScript por lo que aquí es donde usted debe buscar una alternativa.

Scraping con R

Bueno, basta de teoría. Veamos cómo se comporta R en un caso de uso real. Para este tutorial, elegí la página de Goodreads de un libro muy famoso: 1984 de George Orwell. Puedes encontrar la página aquí: https://www.goodreads.com/book/show/61439040-1984.

Quiero ver cómo ha evolucionado la popularidad de este libro a lo largo de los años. Para ello, voy a raspar la lista de reseñas y extraer la fecha y la puntuación de cada una de ellas. Como paso final, guardaré los datos en un archivo externo que pueda ser procesado posteriormente por otros programas.

Configurar el entorno

Pero primero tienes que asegurarte de que tienes todo lo que necesitas para escribir el código.

blog-image

En cuanto al IDE, tienes dos opciones:

  • instalar un plugin de R para Visual Studio Code;
  • descargue RStudio, diseñado para facilitar la programación en R.

En este tutorial, utilizaré este último. Puede descargarlo aquí: https://www.rstudio.com/products/rstudio/download/.

blog-image

La versión gratuita de RStudio Desktop es suficiente para que te sientas cómodo con los conceptos básicos. Como antes, sigue las instrucciones de instalación.

Abra RStudio y cree un nuevo directorio vacío. Escribiré el código en un nuevo archivo llamado"goodreads-rvest.r".

Presentación del navegador

Ahora, antes de extraer los datos, tienes que reconocer qué datos quieres. Rvest maneja tanto selectores CSS como XPath, así que elige tu luchador. 

Si planeas iniciar proyectos de scraping más complejos, te recomiendo que tengas conocimientos básicos de HTML y CSS. Aquí hay un buen patio de recreo para empezar.

Si no estás familiarizado con todo el asunto del HTML, también hay algunas opciones no técnicas. Por ejemplo, Chrome ofrece la extensión de navegador SelectorGadget. Te permite hacer clic en cualquier parte de la página y te muestra el selector CSS para obtener los datos.

Sin embargo, no todos los sitios web son tan sencillos como Goodreads. Voy a optar por recuperar los datos utilizando selectores CSS encontrados inspeccionando manualmente el HTML.

Navegue hasta nuestra URL de destino en su navegador y desplácese hasta la sección "Community Reviews". A continuación, haga clic con el botón derecho del ratón y seleccione "Inspeccionar" para abrir las Herramientas para desarrolladores.

blog-image

El contenedor con el id "other_reviews" es en el que me centraré. Ahora utiliza el botón "Inspeccionar" para encontrar el selector CSS para la fecha y la calificación de una reseña.

blog-image

Así, puedes darte cuenta de lo siguiente:

  • cada reseña individual es un contenedor div con la clase "reseña";
  • la fecha de la revisión es un único elemento de anclaje con la clase "reviewDate";
  • la valoración de la reseña es un elemento span con la clase "staticStars". Tiene cinco elementos span como hijos, el número de estrellas que un usuario puede establecer. Veremos los de color, que tienen la clase "p10".

Extracción de las reseñas

Una vez comprobados todos los requisitos previos, puede empezar a escribir el código.

install.packages('rvest')

Sitúe el cursor al final de la línea y pulse el botón "Ejecutar" situado encima del editor de código. Verás en tu consola el progreso de la instalación del paquete.

La instalación se realiza una vez, así que ahora puedes comentar o borrar la línea anterior:

#install.packages('rvest')

Ahora tienes que cargar (o importar) la biblioteca:

biblioteca(rvest)

Utilizaré la función read_html para enviar una petición GET al sitio web de destino, que descargará el documento HTML necesario. De esta forma descargaré el documento HTML necesario:

book_html <- read_html("https://www.goodreads.com/book/show/61439040-1984")

El resultado se almacena ahora en la variable book_html, que también puedes ver simplemente escribiendo en la consola:

blog-image

Si en algún momento necesitas consultar la documentación oficial de una función que quieres utilizar, escribe en la consola:

help(nombre_función) 

RStudio abrirá un servidor HTTP con un enlace directo a los documentos. Para read_html la salida será:

blog-image

Para obtener la lista de revisiones, utilizaré la función html_elements. Recibirá como entrada el selector CSS que encontré anteriormente:

reviews <- book_html %>% html_elements('div.review')

El resultado será una lista de nodos XML, que iteraré para obtener la fecha y la calificación de cada elemento individual:

blog-image

Los programadores de R utilizan el operador de tubería "%>%" para que la codificación sea más versátil. Su función es pasar el valor del operando izquierdo como argumento al operando derecho.

Puedes encadenar los operandos (como verás más adelante en esta guía), por lo que puede ayudarte a reducir un montón de variables locales. La línea de código anterior escrita sin el operador pipe tendría este aspecto:

reviews <- html_elements(book_html, 'div.review')

Para recoger los datos, inicializaré dos vectores fuera del bucle. Echando un vistazo rápido a la página web, puedo garantizar que ambos vectores tendrán la misma longitud.

dates <- vector()
ratings <- vector()

Ahora, mientras itero a través de la lista de revisiones, busco dos valores: fecha y calificación. Como has visto antes, la fecha es un elemento ancla que tiene la clase reviewDate .

La calificación es un elemento span con la clase staticStars , y contiene cinco elementos span por cada estrella. Si el usuario ha concedido una estrella, el elemento span tendrá el nombre de clase p10 , mientras que el resto tendrá el nombre de clase p0 .

El código tendrá este aspecto:

for (review in reviews) {
review_date = review %>% html_element('a.reviewDate') %>% html_text()
dates <- c(dates, review_date)

review_rating_element = review %>% html_element('span.staticStars')
valid_stars = review_rating_element %>% html_elements('span.p10')
review_rating = length(valid_stars)
ratings <- c(ratings, review_rating)
}

Fíjese en la función html_elemento; no es un error tipográfico. Puede utilizar html_elements cuando desee extraer una lista de nodos XML y html_element para uno solo.

En este caso, he aplicado esta última para una sección más pequeña del documento HTML (una reseña). También utilicé la función html_text para ayudarme a obtener el contenido de texto del elemento encontrado. 

Por último, fusionaré los dos vectores en un único marco de datos para centralizar los datos:

resultado = data.frame(fecha = fechas, valoración = valoraciones)

Y el resultado final tendrá este aspecto:

blog-image

Guardar los resultados

Todos sabemos que el scraping no sirve de nada si no se almacenan los resultados en algún sitio. En R, para escribir en un CSV no es más que:

write.csv(resultado, "reseñas.csv")

El resultado tiene que ser una matriz o un marco de datos (que ya lo es), de lo contrario, intenta una conversión. Ejecuta el código y comprueba el directorio del proyecto. Verás que puedes abrir la tabla anterior en un editor de texto, Excel doc, etc.

El resultado tiene que ser una matriz o un marco de datos (que ya lo es), de lo contrario, intenta una conversión. Ejecuta el código y comprueba el directorio del proyecto. Verás que puedes abrir la tabla anterior en un editor de texto, Excel doc, etc.

Ni que decir tiene que nuestra lista de datos sólo tiene 30 entradas. El sitio web muestra más de 90.000 opiniones y más de 3 millones de valoraciones. ¿Qué ha pasado? Pues la paginación.

Más aún, vuelva a su navegador y haga clic en la segunda página. Notará que la lista cambiará pero la URL no. Esto significa que utilizan un estado para cargar dinámicamente otra sección de la lista.

En estas situaciones, rvest puede no ser útil. En su lugar, un navegador automatizado puede ayudar a imitar el comportamiento de clic para cargar el resto de la lista. Un ejemplo de tal biblioteca es RSelenium, pero dejaré este tema como un ejercicio de seguimiento.

Conclusión

Espero que este tutorial te haya dado una sólida base de partida en web scraping con R. Ahora puedes tomar una decisión más fácil sobre la pila tecnológica de tu próximo proyecto.

Sin embargo, tenga en cuenta que este artículo no cubre los muchos desafíos del web scraping. Puede encontrarlos más detallados como conceptos en esta guía autoexplicativa.

Noticias y actualidad

Manténgase al día de las últimas guías y noticias sobre raspado web suscribiéndose a nuestro boletín.

We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Artículos relacionados

miniatura
GuíasCómo raspar datos de productos de Amazon: Guía completa de mejores prácticas y herramientas

Explore las complejidades del scraping de datos de productos de Amazon con nuestra guía en profundidad. Desde las mejores prácticas y herramientas como Amazon Scraper API hasta las consideraciones legales, aprenda a superar los desafíos, eludir los CAPTCHA y extraer información valiosa de forma eficiente.

Suciu Dan
avatar de autor
Suciu Dan
15 minutos de lectura
miniatura
GuíasLa guía definitiva para el Job Scraping en línea, es Pros y Contras

Definición y usos del job scraping en línea. Ventajas y desventajas del job scraping, junto con estrategias y riesgos potenciales.

Suciu Dan
avatar de autor
Suciu Dan
8 min leer
miniatura
GuíasAprenda a eludir la detección de Cloudflare con el mejor navegador Selenium

Conozca cuál es el mejor navegador para eludir los sistemas de detección de Cloudflare mientras hace web scraping con Selenium.

Mihnea-Octavian Manolache
avatar de autor
Mihnea-Octavian Manolache
9 min leer