Volver al blog
Guías
Raluca PenciucLast updated on Mar 31, 202610 min read

Web scraping en Ruby: el tutorial definitivo

Web scraping en Ruby: el tutorial definitivo

No nos engañemos: a medida que pasan los años, el volumen de datos en Internet no hará más que seguir aumentando. La situación escapa al control de cualquiera, pero ¿es eso realmente algo malo?

Especialmente en la última década, el web scraping ha ganado una enorme popularidad. Para triunfar en el mundo empresarial actual, las empresas necesitan estrategias adecuadas, lo que requiere disponer de mucha información en poco tiempo. Además, podría ser una forma estupenda para que los desarrolladores mejoren sus habilidades de programación Y ayuden a la empresa.

Si formas parte del equipo Ruby pero no tienes mucho que ver con el web scraping, este artículo te proporcionará un nuevo nicho que explorar: crear tu propio web scraper.

Entender el web scraping

Tomemos como ejemplo una plataforma de comparación de precios. Su función es obtener el coste de multitud de artículos de varios minoristas online. Pero, ¿por qué limitarse a los productos físicos? Los sectores de las aerolíneas y la hostelería también se han vuelto mucho más accesibles para el consumidor gracias a los sitios de comparación. Entonces, ¿cómo funcionan estos mágicos sitios web o aplicaciones? ¡A través del web scraping, por supuesto!

Probablemente te estés preguntando ahora: «¿Para qué más puedo usar estos datos?». Veamos algunas de las aplicaciones prácticas del web scraping:

Este artículo, muy bien redactado, que trata sobre el web scraping ofrece descripciones detalladas y casos de uso adicionales.

Los rastreadores web no son fáciles de crear, incluso si entiendes cómo funcionan y los beneficios potenciales que pueden ofrecer. Existen muchas formas en que los sitios web pueden identificar y bloquear el acceso de los bots a sus datos.

A modo de ejemplo, aquí tienes algunos:

  • Bloqueo geográfico: es posible que se te muestren resultados específicos de una región cuando solicites información de otra zona (por ejemplo, precios de billetes de avión).
  • Bloqueo de IP: un sitio web puede bloquearte o ralentizar tu conexión cuando detecta que estás realizando solicitudes repetidas desde una dirección IP concreta;
  • Honeypots: los humanos no pueden ver los enlaces de honeypot, pero los bots sí; una vez que los robots caen en la trampa, se bloquea su dirección IP;
  • CAPTCHAs: Las personas pueden resolver estos sencillos problemas lógicos con relativa rapidez, pero a los rastreadores a menudo les resultan difíciles;

Superar todos estos obstáculos no es tarea fácil. No es tan difícil crear un bot sencillo, pero crear un excelente scraper web es un poco más complicado. Por eso, en la última década, las API para el web scraping se han convertido en uno de los temas más candentes.

El contenido HTML de cualquier sitio web se puede recopilar utilizando WebScrapingAPI, y todos los problemas que hemos mencionado anteriormente se resolverán automáticamente. Además, utilizamos Amazon Web Services para garantizar la velocidad y la escalabilidad. Suena interesante, ¿verdad? ¡Pues no te quedes solo en las palabras! Pruébalo tú mismo con las 5000 llamadas API gratuitas que obtienes como parte de la prueba gratuita de WebScrapingAPI.

Comprender la web

Para comprender la web, es necesario entender el Protocolo de Transferencia de Hipertexto (HTTP). Este protocolo explica cómo se comunican un servidor y un cliente. Un mensaje contiene información que describe al cliente y cómo gestiona los datos: método, versión HTTP y encabezados.

Para las solicitudes HTTP, los rastreadores web utilizan el método GET para recuperar datos del servidor. Además, existen algunos métodos avanzados como POST y PUT. Los métodos HTTP se detallan aquí para tu referencia.

En los encabezados HTTP se puede encontrar diversa información adicional sobre las solicitudes y respuestas. Para el web scraping, estos son los que importan:

  • User-Agent: los rastreadores web se basan en este encabezado para que sus solicitudes parezcan más realistas; contiene información como la aplicación, el sistema operativo, el software y la versión.
  • Cookie: el servidor y la solicitud pueden intercambiar información confidencial (como tokens de autenticación).
  • Referrer: contiene el sitio de origen que visitó el usuario; por lo tanto, es esencial tener en cuenta este dato.
  • Host: identifica el host al que te estás conectando.
  • Accept: proporciona un tipo de respuesta para el servidor (por ejemplo, text/plain, application/json).

Comprender Ruby

Ruby es un lenguaje de programación multiparadigma de alto nivel que también es totalmente interpretable. Esto significa que el código del programa se almacena en texto plano, que se transmite al intérprete que lo ejecuta.

En 1995, Yukihiro Matsumoto (también conocido como Matz en la comunidad Ruby) combinó características de diferentes lenguajes de programación, como Perl, Lisp y Smalltalk, para crear uno nuevo centrado en la simplicidad y la productividad.

Es un lenguaje de programación especializado, cuyo ámbito natural son las aplicaciones web. Estas son las ventajas significativas de las que te beneficias al utilizar este lenguaje en tus proyectos:

  • Obtiene resultados rápidamente. En combinación con el marco Rails, puedes crear software con relativa rapidez; por eso las startups prefieren principalmente Ruby para desarrollar rápidamente sus MVP (productos mínimos viables).
  • Está bien desarrollado y mantenido por la creciente comunidad Ruby.
  • Las útiles herramientas y bibliotecas (llamadas «gems») garantizan que sea fácil seguir las mejores prácticas de programación en casi cualquier situación.

Por otro lado, estas ventajas no convierten a Ruby en una solución mágica y universal para todo nuevo software. También debes tener en cuenta estas características del lenguaje antes de tomar una decisión:

  • A medida que aumenta su tamaño, las aplicaciones creadas con Ruby se vuelven más lentas, lo que causa problemas de escalabilidad.
  • Su ámbito natural son las aplicaciones web. Por lo tanto, no es muy adecuado para aplicaciones de escritorio o móviles.
  • Dado que utiliza un intérprete, un posible código orientado a objetos será más lento.

Crear tu propio rastreador web

Ahora podemos empezar a hablar de la extracción de datos. Lo primero es lo primero: necesitamos un sitio web que proporcione información valiosa.

Paso 1: Configurar el entorno

Para crear nuestro rastreador web en Ruby, primero debemos asegurarnos de que contamos con todos los requisitos previos:

  • La última versión estable de Ruby: consulta su guía de instalación oficial para elegir el mejor método para tu sistema operativo.
  • Un IDE: en esta guía, utilizaremos Visual Studio Code, ya que es ligero y no requiere configuraciones adicionales, pero puedes elegir el IDE que prefieras.
  • Bundler: una herramienta de Ruby para la gestión de dependencias (también llamada «gem»);
  • Watir: una gem basada en Selenium que se utiliza para pruebas automáticas, ya que puede imitar el comportamiento del usuario en un navegador;
  • Webdrivers: una gem recomendada por Watir que descargará automáticamente el controlador más reciente para una instancia de navegador;
  • Nokogiri: una gem conocida por su capacidad para facilitar el análisis de páginas web. Puede analizar HTML y XML, detecta documentos HTML dañados y ofrece acceso a elementos mediante selectores XPath y CSS3.

Después de configurar el entorno Ruby, crea un nuevo directorio en cualquier lugar de tu ordenador y ábrelo con el IDE que prefieras. A continuación, ejecuta el siguiente comando en una ventana de terminal para instalar nuestra primera gem:

> gem install bundler

Ahora crea un archivo llamado Gemfile en el directorio raíz de tu proyecto. Aquí vamos a añadir el resto de las gemas como dependencias:

source 'https://rubygems.org'

gem 'watir', '~> 6.19', '>= 6.19.1'
gem 'webdrivers', '~> 4.6'
gem 'nokogiri', '~> 1.11', '>= 1.11.7'

Ahora vuelve a la ventana de terminal y ejecuta el siguiente comando para instalar las gemas que hemos declarado:

> bundle install

¡Genial configuración! Por último, solo tienes que crear un archivo «scraper.rb» para guardar el código de nuestro rastreador web. Sea lo que sea lo que escribamos aquí, lo podemos ejecutar con el comando:

> ruby scraper.rb

Paso 2: Inspecciona la página que quieres rastrear

¡Genial, sigamos adelante! Navega hasta la página que quieres rastrear y haz clic con el botón derecho en cualquier lugar de la misma, luego selecciona «Inspeccionar elemento». Aparecerá la consola de desarrollador, donde deberías ver el código HTML del sitio web.

Paso 3: Envía una solicitud HTTP y extrae el HTML

Ahora, para obtener ese HTML en nuestro equipo local, tenemos que enviar una solicitud HTTP utilizando Watir para que nos devuelva el documento. Volvamos al IDE y pongamos esta idea en código.

Primero, escribe las importaciones que necesitamos:

require 'watir'
require 'webdrivers'
require 'nokogiri'

A continuación, inicializamos una instancia del navegador y navegamos hasta el sitio web que queremos extraer. Después accedemos al HTML y lo pasamos al constructor de Nokogiri, que nos ayudará a analizar el resultado.

browser = Watir::Browser.new
browser.goto 'https://blog.eatthismuch.com/latest-articles/'
parsed_page = Nokogiri::HTML(browser.html)

File.open("parsed.txt", "w") { |f| f.write "#{parsed_page}" }

browser.close

También hemos guardado el resultado en un archivo de texto llamado «parsed.txt» para echar un vistazo al HTML. Es importante cerrar la conexión tras recibir la respuesta, ya que el proceso seguirá ejecutándose.

Paso 4: Extraer secciones específicas

Así pues, tenemos un documento HTML, pero queremos datos, lo que significa que debemos analizar la respuesta anterior para convertirla en información legible para los humanos.

Empezando por pequeños pasos, extraigamos el título del sitio web. Una característica destacable de Ruby es que todo es un objeto, con muy pocas excepciones, lo que significa que incluso una simple cadena puede tener atributos y métodos.

Por lo tanto, podemos acceder fácilmente al valor del título del sitio web a través de los atributos del objeto parsed_page.

puts parsed_page.title

Continuando, extraigamos todos los enlaces del sitio web. Para ello, utilizaremos un método más genérico que analiza etiquetas específicas: el método css.

links = parsed_page.css('a')
links.map {|element| element["href"]}

puts links

También utilizamos el método map para conservar solo los enlaces con un atributo href del HTML.

Veamos un ejemplo más realista. Necesitamos extraer los artículos del blog, su título, dirección y meta descripción.

Si inspeccionas una de las fichas de artículo, verás que podemos obtener la dirección y el título del artículo a través de los atributos del enlace. Además, la meta descripción se encuentra bajo una etiqueta <div> con un nombre de clase específico.

Por supuesto, hay muchas formas de realizar esta búsqueda. La que utilizaremos consistirá en buscar todas las etiquetas <div> con el nombre de clase td_module_10 y, a continuación, recorrer cada una de ellas para extraer las etiquetas <a> y las etiquetas internas con el nombre de clase td-excerpt.

article_cards = parsed_page.xpath("//div[contains(@class, 'td_module_10')]")

article_cards.each do |card|
    title = card.xpath("div[@class='td-module-thumb']/a/@title")
    link = card.xpath("div[@class='td-module-thumb']/a/@href")
    meta = card.xpath("div[@class='item-details']/div[@class='td-excerpt']")
end

Sí, como ya habrás adivinado, una expresión XPath es lo que nos permite hacerlo, ya que buscamos elementos HTML por sus nombres de clase y sus ascendientes.

Paso 5: Exportar los datos a CSV

Este tipo de extracción puede resultar útil cuando los datos deben pasarse a otra aplicación, en nuestro caso, un agregador de artículos. Para ello, necesitamos exportar los datos analizados a un archivo externo.

Crearemos un archivo CSV, ya que puede ser leído fácilmente por otra aplicación y abierto con Excel para su posterior procesamiento. Primero, solo una importación más:

require 'csv'

A continuación, crearemos el CSV en modo «añadir» y envolveremos el código anterior, de modo que ahora nuestro scraper tendrá este aspecto:

CSV.open("articles.csv", "a+") do |csv|
    csv << ["title", "link", "meta"]

    article_cards = parsed_page.xpath("//div[contains(@class, 'td_module_10')]")
    article_cards.each do |card|

        title = card.xpath("div[@class='td-module-thumb']/a/@title")
        link = card.xpath("div[@class='td-module-thumb']/a/@href")
        meta = card.xpath("div[@class='item-details']/div[@class='td-excerpt']")

        csv << [title.first.value, link.first.value, meta.first.text.strip]
    end
end

¡Genial, eso es todo! Ahora podemos ver todos los datos analizados de una forma clara, sencilla y fácil de reenviar.

Conclusión y alternativas

Ya hemos completado nuestro tutorial. ¡Enhorabuena! Esperamos que este artículo te haya proporcionado mucha información sobre el web scraping y te haya ayudado a comprenderlo mejor.

Obviamente, esta tecnología puede hacer mucho más que alimentar agregadores de artículos. La clave está en encontrar los datos correctos y analizarlos para descubrir nuevas posibilidades.

Sin embargo, como dije al principio del artículo, los rastreadores web se enfrentan a numerosos retos. Además de impulsar tu negocio, es una gran oportunidad de aprendizaje para que los desarrolladores resuelvan problemas utilizando sus propios rastreadores web. No obstante, es posible que quieras reducir costes si necesitas completar un proyecto (tiempo, dinero, personal).

Una API dedicada a resolver estos problemas siempre será más fácil de usar. Incluso cuando puedan existir obstáculos como el renderizado de JavaScript, los proxies, los CAPTCHA y otros factores de bloqueo, WebScrapingAPI los supera todos y ofrece una experiencia personalizable. Si aún tienes dudas, ¿por qué no pruebas la opción de prueba gratuita?

Acerca del autor
Raluca Penciuc, Desarrollador full-stack @ WebScrapingAPI
Raluca PenciucDesarrollador full-stack

Raluca Penciuc es desarrolladora full stack en WebScrapingAPI, donde se dedica a crear rastreadores, mejorar las técnicas de evasión y buscar formas fiables de reducir la detección en los sitios web de destino.

Empieza a crear

¿Estás listo para ampliar tu recopilación de datos?

Únete a más de 2000 empresas que utilizan WebScrapingAPI para extraer datos de la web a escala empresarial sin ningún gasto de infraestructura.