Guía para principiantes de Web Scraping con R (usando rvest) con ejemplos prácticos

Tutorial de Web Scraping: Introducción

Se sabe que la la información en Internet crece de forma exponencial aprovéchala usando web scraping. La mayoría de usuarios hacen sus búsquedas a través de Google, se puede decir que es nuestra primera fuente de conocimiento. Ya sea para leer opiniones sobre un lugar en articular, o para entender un nuevo tema.

Con la gran cantidad de datos que ofrece la web, se abren nuevos horizontes de análisis para un Científico de Datos o un SEO. En la actualidad, todos los datos que se requieren, están disponibles en Internet. Lo único que nos limita a usarlos es no saber cómo acceder a ellos. En este artículo espero que tengamos una herramienta para superar esta limitación.

Si bien existen complementos, software especializado para llevar a cabo esta tarea, algunos están limitados en la cantidad de información que podemos obtener. Algunos tienen costos. Mostraré una alternativa para poder obtener los datos deseados desde un sitio web. De esta forma aprenderemos cómo hacer web scraping con R, paso a paso.

¿Qué es Web Scraping?

Web Scraping es una técnica para obtener datos no estructurado (etiquetas HTML) de una página web, a un formato estructurado de columnas y renglones, en los cuales se puede acceder y usar más fácilmente. Web scraping también es conocido rastreo web, data scraping, o simplemente extracción de datos.

Existen diversos programas para scrapear una página, e incluso sitios web completos. Estos programas son llamados, con frecuencia, bot, spider o crawler. Siendo software para diversas aplicaciones, están limitados, por lo mismo, siempre es mejor desarrollar código a al medida. No te preocupes, continúa leyendo, y podrás scrapear un sitio web (si haces los pasos correctamente).

En este artículo, usaremos el lenguaje de programación R para hacer web scraping, aunque no es el único lenguaje con el cuál extraer datos. Entre otros lenguajes esta Python.

Obtendremos descripciones para cada producto a scrapear en Amazon. Títulos (nombre del producto), precio, entre otros datos. Además, veremos los problemas más comunes que surgen al obtener datos de Internet debido a la falta de uniformidad en el código del sitio web. Daremos una de las soluciones, la que ocupamos para completar la tarea a realizar.

¿Para qué sirve Web Scraping?

Es probable que te preguntes ¿En qué podríamos usar web Scraping? A manera de ejemplo práctico, vamos a realizar un ejercicio de extracción de datos. Algunas otras aplicaciones posibles para las que puede usar web scraping son:

  • Los datos colectados sirven para clasificar productos o servicios para crear motores de recomendación
  • Obtener datos de texto, por ejemplo de Wikipedia, entre otras fuentes para hacer sistemas basados en Procesamientos de Lenguajes Naturales. Incluso entrenar modelos de aprendizaje profundo que reconocen temas de un texto dado
  • Generar datos de las etiquetas de imágenes, de sitios web como Google, Flickr, etc. para entrenar modelos de clasificación de imágenes
  • Consolidar datos de redes sociales: Facebook y Twitter, para realizar Análisis de Sentimiento u opinión.
  • Extraer comentarios de usuarios y de sitios de comercio electrónico como Amazon, Walmart, etc.
  • Conocer la reputación online de funcionarios, marcas, artistas, productos, etc.
  • Optimizar precios de tiendas online, a través del análisis histórico de la competencia.
  • Para conocer los resultados de búsqueda en Google de diversas palabras clave. Identificar las posiciones en dichos resultados, tipo de contenidos, y mucho más.

Formas de Scrapear Datos

De forma funcional, podemos scrapear datos, es decir, obtenerlos de diferentes maneras, algunas muy arcaicas:

  • Copiar y pegar, obviamente realizado por algún humano: esta es una forma lenta, nada eficiente de obtener datos de la web.
  • Coincidencia de patrones de texto: otro enfoque simple y poderoso para extraer información de la web, es mediante el uso de expresiones regulares a través de lenguajes de programación.
  • Interfaz API:  sitios web como Facebook, Twitter, LinkedIn, entre otros, proporcionan una API pública y / o privada, a las que se tiene acceso usando programación, para recuperar los datos en el formato deseado.
  • Análisis de DOM: a través de algunos programas es posible recuperar el contenido dinámico, o partes de una pagina de sitios web, generado por scripts desde el cliente.

Usaremos el enfoque de análisis DOM (Modelo de Objetos del Documento) durante el transcurso de este artículo. Y confíe en los selectores de CSS de la página web para encontrar los campos relevantes que contienen la información deseada. Pero antes de comenzar, hay algunos requisitos previos que uno necesita para eliminar datos de cualquier sitio web.

Requisitos previos para hacer web scraping

Los requisitos previos para hacer web scraping con R, básicamente son dos:

  • Primero. Tener instalado R, descargarlo desde su página CRAN R – Project. Algún conocimiento práctico del lenguaje R. Aunque, para esta tarea no es tan necesario, basta con seguir los pasos al pie de la letra y conseguirás los mismos resultados. Utilizaremos el paquete rvest de R, escrito por Hadley Wickham. Explicaré más adelante qué y cómo usar rvest. 
  • Segundo. Suponemos que tienen conocimiento básico de HTML y CSS, es una ventaja. Si bien la mayoría de los Data Scientists tienen una formación que no contemplan conocimientos técnicos de HTML y CSS, no es necesario ser expertos. Aún más sencillo, usaremos un complemento de código abierto llamado SelectorGadget. Será suficiente para que cualquiera pueda hacer web scraping. instala o descargar la extensión del gadget. Asegúrese tener esta extensión instalada. Uso Google Chrome y está disponible esta extensión en su web store. Como en todo Existen alternativas diversas para obtener la clase CSS, sea a través de otros complementos o directamente observando el código fuente de la página. 
web scraping selectorgadget chrome captura

¿Qué es RVEST?

Esencialmente es una librería (o paquete) de R. Esencialmente permite extraer y manipular datos de una página web, usando html y xml,. Se distribuye bajo la licencia GPL-3 (General Public Licence). El autor se inspiró el las librerías Robobrowser y beatiful soup escritas en  Python.

¿Cómo instalar Rvest?

Para instalar la librería revest. Requieres iniciar la consola de R, a través del icono o directamente del .exe.

Seguido  ejecutas el siguiente código:

install.packages(‘rvest’)

Se abrirá una venta emergente donde se muestran repositorios espejos de cada librería. Puedes seleccionar el que se encuentre más cerca de tu país. Para elegir, por decirlo de alguna forma, el sitio oficial de estados unidos (existen repositorios hasta por universidades), puedes hacerlo a través del parámetro RPOS. Usa el siguiente código y presiona enter:

install.packages(“rvset”, repos=’http://cran.us.r-project.org’)

¿Cómo cargar Rvest en R?

En R, para usar la librería se invoca desde la consola, a través de la instrucción

library(“rvest”)

¿Cómo usar Rvest?

Para usar Rvest, se requiere conocer las instrucciones en código, a las que llamaremos funciones, para para hacer las tareas más comunes en la extracción y manipulación de datos web. A continuación, en negrita, se listan las funciones más importantes. Entre comillas se describirán los parámetros más usados. Para familiarizarte se mostrará un par de ejemplos, más adelante. 

  • read_html(“url”) con esta función se crea un objeto que contiene todo el código o etiquetas HTML.
  • html_nodes(“objeto html”, “etiqueta css”) es usada para seleccionar partes del objeto que contiene todo el código html. El segundo parámetros es la clase CSS que está relacionada con la sección que deseamos extraer. 
  • html_name() obtiene los atributos html
  • html_text() extrae el texto html
  • html_attr() regresa los atributos específicos html
  • html_attrs() obtiene los atributos html
  • html_table() convierte una tabla html en una estructura de datos en R

Web Scraping de Amazon usando R

En general, lo que tenemos que hacer es ir a una página, en este caso Amazon México y obtener la URL. En la página principal, elegir una categoría, en mi caso elegiré la cocina, seguido la categoría de café y té. Para finalizar en cafeteras.

De la página anterior obtenemos la URL (ver diccionario seo). Seguido, cargamos la librería en R y leemos la página web. Usa el código:

#invocar la librería
library("rvest")

#Asignamos la url
url <- "https://www.amazon.com.mx/b/ref=s9_acsd_hfnv_hd_bw_bAcAgpX_ct_x_ct00_w?_encoding=UTF8&node=9725407011&pf_rd_m=AVDBXBAVVSXLQ&pf_rd_s=merchandised-search-4&pf_rd_r=Q47SQG6GBGGECT1SXNZY&pf_rd_t=101&pf_rd_p=8cc61471-874f-5f7f-96d7-e2b634466523&pf_rd_i=9725377011"

#Obtenemos código html de la página web
pagina_web <- read_html(url)

Si bien las necesidades de obtener datos, depende de cada proyecto. Para hacer más sencilla la explicación se recopilará los siguientes dos datos.

  • Producto, es el titulo de los productos.
  • Precio, obviamente hace referencia al precio del producto.
web scraping amazon cafeteras

Identificar la clase CSS para scrapear

Identifiquemos la clase CSS que está relacionada con el titulo o nombre del producto. Para ello seleccionamos el complemente y después el nombre del producto. Con esto obtendremos la clase.

clase css para titulo producto

Extraer datos de producto de Amazon

Ahora usamos el siguiente código para obtener los nombres de los productos:

#Asignamos la clase
css_producto <- "a.a-link-normal.s-access-detail-page.s-color-twister-title-link.a-text-normal"

#Obtenemos el código html que contiene el nombre del producto
producto_html <- html_nodes(pagina_web,css_producto)
producto_texto <- html_text(producto_html)

#mostramos los datos, al final presionar enter
productos_texto

Con el siguiente código extraeremos el precio del producto:

#clase css del producto
css_precio <- "span.a-size-base.a-color-price.s-price.a-text-bold"
#obtenemos el contenido de la clase en código html
precio_html <- html_nodes(pagina_web,css_precio)
#limpiamos el código para obtener el texto
precio_texto <- html_text(precio_html)

Los valores de la variable precio, tendrán el signo de pesos $, vamos a  limpiar este caracter y trasformar a numérico la variable a través del código.

#Eliminamos el signo de peso
precio_limpio <- gsub("\\$","",precio_texto)
#Eliminamos la coma
precio_limpio <- gsub(",","",precio_limpio)
#Transformamos a numérico 
precio_numerico <- as.numeric(precio_limpio)

Combinar los datos

Resta combinar los datos, quiere decir que tenemos dos vectores. Por un lado aquel que contiene el nombre del producto, y por el otro el que tiene los precios. Es conveniente agruparlos, más si deseamos hacer análisis de los mismos. Para ello usamos el código.

#Unimos los datos
productos <- data.frame(Producto = producto_texto, Precio = precio_numerico)
#Para mostrar la gráfica por precio
barplot(precio_numerico)

Conclusión

La intención de este tutorial fue mostrar de manera sencilla cómo hacer web scraping. Se consideró un caso simple, y podríamos decir que ideal. No se mostraron todos los problemas o retos que se pueden presentar al hacer esta tarea. Escribiré otro contenido, en el que mostraré un ejemplo más complejo.

Las ventajas que observo son: R es gratuito, fácil de usar y tiene bastante documentación. Toda generada por la comunidad. La flexibilidad de extraer virtualmente todo lo que se desee.

Las desventajas, esencialmente una: programación avanzada. Si se dese hacer la extracción de datos, se requiere enfrentar a diversas situaciones, por lo que el nivel de programación se especializa:

  • paginación
  • Valores nulos
  • Clases css condicionadas
  • Scripts
  • obtención de todas las urls del sitio
  • Clasificación por categoría
  • Limpieza e integración de datos
  • Exportación de datos
  • Entre otras tantas

Deja un comentario