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

Guía completa sobre el web scraping con Java

Guía completa sobre el web scraping con Java

A diferencia de la mentalidad del siglo XX de que «el tiempo es oro», ahora todo gira en torno a los datos. Especialmente en la última década, los rastreadores web se han vuelto muy populares. No es difícil entender por qué: Internet rebosa de información valiosa que puede suponer el éxito o el fracaso de las empresas.

A medida que las empresas se dan cuenta de las ventajas de la extracción de datos, cada vez más personas están aprendiendo a crear su propio scraper. Además de tener el potencial de impulsar el negocio, también puede ser un proyecto interesante para que los desarrolladores mejoren sus habilidades de programación.

Si formas parte del equipo de Java, pero tu trabajo no tiene nada que ver con el web scraping, descubrirás un nuevo nicho en el que podrás sacar partido a tus habilidades. El artículo ofrece un tutorial paso a paso sobre cómo crear un sencillo scraper web utilizando Java para extraer datos de sitios web y guardarlos localmente en formato CSV.

Entender el web scraping

¿A qué se refiere el web scraping? Muchos sitios web no proporcionan sus datos a través de API públicas, por lo que los web scrapers extraen los datos directamente del navegador. Es muy parecido a cuando una persona copia texto manualmente, pero se hace en un abrir y cerrar de ojos.

Si tenemos en cuenta que una mejor inteligencia empresarial implica mejores decisiones, este proceso es más valioso de lo que parece a primera vista. Los sitios web producen cada vez más contenido, por lo que ya no es recomendable realizar esta operación totalmente a mano.

Quizás te preguntes: «¿Qué voy a hacer con estos datos?». Bueno, veamos algunos de los casos de uso en los que el web scraping puede resultar realmente útil:

  • Generación de clientes potenciales: un negocio en funcionamiento necesita generar clientes potenciales para encontrar clientes.
  • Inteligencia de precios: la decisión de una empresa de fijar el precio y comercializar sus productos se basará en los precios de la competencia.
  • Aprendizaje automático: para que las soluciones basadas en IA funcionen correctamente, los desarrolladores necesitan proporcionar datos de entrenamiento.

En este artículo, muy bien redactado, que trata sobre el valor del web scraping, encontrarás descripciones detalladas y casos de uso adicionales.

A pesar de comprender cómo funciona el web scraping y cómo puede aumentar la eficacia de su negocio, crear un scraper no es tan sencillo. Los sitios web disponen de muchas formas de identificar y evitar que los bots accedan a sus datos.

He aquí algunos ejemplos:

  • Pruebas de Turing públicas completamente automatizadas (CAPTCHAs): estos problemas lógicos son razonablemente fáciles de resolver para las personas, pero suponen un gran problema para los rastreadores.
  • Bloqueo de IP: si un sitio web detecta que se están realizando múltiples solicitudes desde la misma dirección IP, puede bloquear el acceso a dicho sitio web o ralentizar considerablemente la conexión.
  • Honeypots: enlaces invisibles que son visibles para los bots pero invisibles para los humanos; una vez que los bots caen en la trampa, el sitio web bloquea su dirección IP.
  • Bloqueo geográfico: el sitio web puede bloquear geográficamente ciertos contenidos. Por ejemplo, es posible que se le proporcione información específica de una región cuando solicite datos de otra zona (por ejemplo, precios de billetes de avión).

Hacer frente a todos estos obstáculos no es tarea fácil. De hecho, aunque no es demasiado difícil crear un bot aceptable, es tremendamente difícil crear un excelente rastreador web. Por ello, las API para el rastreo web se convirtieron en uno de los temas más candentes de la última década.

WebScrapingAPI recopila el contenido HTML de cualquier sitio web y se encarga automáticamente de los problemas que he mencionado anteriormente. Además, utilizamos Amazon Web Services, lo que garantiza velocidad y escalabilidad. ¿Te parece interesante? Empieza tu prueba gratuita de WebScrapingAPI y podrás realizar 5000 llamadas a la API durante los primeros 14 días.

Comprender la web

Para entender la Web, es necesario comprender el Protocolo de Transferencia de Hipertexto (HTTP), que explica cómo se comunica un servidor con un cliente. Un mensaje contiene varios datos que describen al cliente y cómo gestiona los datos: método, versión HTTP y encabezados.

Los rastreadores web utilizan el método GET para las solicitudes HTTP, lo que significa que recuperan datos del servidor. Algunas opciones avanzadas también incluyen los métodos POST y PUT. Para más detalles, puedes consultar aquí una lista detallada de los métodos HTTP.

En los encabezados HTTP se pueden encontrar varios detalles adicionales sobre las solicitudes y respuestas. Puedes consultar la lista completa de los mismos, pero los relevantes para el web scraping son:

  • User-Agent: indica la aplicación, el sistema operativo, el software y la versión; los rastreadores web se basan en este encabezado para que sus solicitudes parezcan más realistas.
  • Host: el nombre de dominio del servidor al que ha accedido.
  • Referrer: contiene el sitio de origen que visitó el usuario; en consecuencia, el contenido mostrado puede variar, por lo que también hay que tener en cuenta este hecho.
  • Cookie: guarda información confidencial sobre una solicitud y el servidor (como tokens de autenticación).
  • Accept: garantiza que la respuesta del servidor sea de un tipo específico (p. ej.: text/plain, application/json, etc.).

Entender Java

Java, un lenguaje de código abierto y orientado a objetos, lo que lo convierte en uno de los lenguajes de programación más populares. Han pasado casi dos décadas desde que conocimos Java por primera vez, y el lenguaje de programación se ha vuelto cada vez más accesible.

Muchos de los cambios en Java han tenido como objetivo reducir las dependencias de implementación del código. Por ello, muchos desarrolladores prefieren este lenguaje, pero también tiene otras ventajas:

  • Es de código abierto;
  • Ofrece una gran variedad de API;
  • Es multiplataforma, lo que ofrece mayor versatilidad;
  • Cuenta con documentación detallada y un soporte comunitario fiable.

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 ofrezca información valiosa. Para este tutorial, hemos elegido extraer datos de esta página web que comparte recetas italianas.

Paso 1: Configurar el entorno

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

  • Java 8: aunque Java 11 es la versión más reciente con soporte a largo plazo (LTS), Java 8 sigue siendo el estándar de producción preferido entre los desarrolladores.
  • Gradle: es una herramienta flexible de código abierto para la automatización de compilaciones con una amplia gama de funciones, incluida la gestión de dependencias (requiere Java 8 o superior);
  • Un IDE de Java: en esta guía utilizaremos IntelliJ IDEA, ya que facilita bastante la integración con Gradle.
  • HtmlUnit: puede simular eventos del navegador, como clics y el envío de formularios, durante el scraping, y es compatible con JavaScript.

Tras la instalación, debemos verificar si hemos seguido correctamente las guías oficiales. Abre un terminal y ejecuta los siguientes comandos:

> java -version
> gradle -v

Estos deberían mostrarte las versiones de Java y Gradle que están instaladas en tu equipo:

Si no aparece ningún error, estamos listos para empezar.

Ahora vamos a crear un proyecto para poder empezar a escribir el código. Por suerte, JetBrains ofrece un tutorial muy bien redactado sobre cómo empezar con IntelliJ y Gradle, para que no nos perdamos en las configuraciones.

Asegúrate de que, una vez creado el proyecto, dejes que el IDE termine la primera compilación, ya que obtendrás un árbol de archivos generado automáticamente.

Una vez hecho esto, abre tu archivo «build.gradle» y añade la siguiente línea en el bloque «dependencies»:

implementation('net.sourceforge.htmlunit:htmlunit:2.51.0')

Esto instalará HtmlUnit en nuestro proyecto. No olvides pulsar el botón «Reload» de la caja de herramientas de Gradle situada a la derecha para eliminar todas las advertencias de «Not found».

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 HtmlUnit, que nos devolverá el documento. Volvamos al IDE y pongamos esta idea en código.

Primero, escribe las importaciones que necesitamos para usar HtmlUnit:

import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.html.*;
import java.io.IOException;
import java.util.List;

A continuación, inicializamos un WebClient y enviamos una solicitud HTTP al sitio web que devolverá una HtmlPage. Es importante recordar cerrar la conexión tras recibir la respuesta, ya que el proceso seguirá ejecutándose.

WebClient webClient = new WebClient(BrowserVersion.CHROME);

try {
   HtmlPage page = webClient.getPage("https://foodnetwork.co.uk/italian-family-dinners/");

   webClient.getCurrentWindow().getJobManager().removeAllJobs();
   webClient.close();
   recipesFile.close();

} catch (IOException e) {
   System.out.println("An error occurred: " + e);
}

Vale la pena mencionar que HtmlUnit mostrará un montón de mensajes de error en la consola que te harán pensar que tu PC va a explotar. Bueno, no te preocupes, porque puedes ignorar tranquilamente el 98 % de ellos.

Se deben principalmente a que HtmlUnit intenta ejecutar el código JavaScript desde el servidor del sitio web. Sin embargo, algunos de ellos pueden ser errores reales que indican un problema en tu código, por lo que es mejor prestarles atención cuando ejecutes tu programa.

Puedes evitar ver parte de estos errores inútiles configurando algunas opciones en tu WebClient:

webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setPrintContentOnFailingStatusCode(false);

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. Podemos hacerlo con la ayuda del método integrado getTitleText:

String title = page.getTitleText();
System.out.println("Page Title: " + title);

Continuando, extraigamos todos los enlaces del sitio web. Para ello, disponemos de los métodos integrados getAnchors y getHrefAttribute, que extraerán todas las etiquetas <a> del HTML y, a continuación, recuperarán el valor del atributo href:

List<HtmlAnchor> links = page.getAnchors();
for (HtmlAnchor link : links) {
   String href = link.getHrefAttribute();
   System.out.println("Link: " + href);
}

Como puedes ver, HtmlUnit proporciona muchos métodos integrados y autoexplicativos que te ahorran horas de lectura de documentación.

Veamos un ejemplo más realista. Necesitamos extraer todas las recetas del sitio web, su título y, más concretamente, su dirección.

Si examinas una de las fichas de recetas, verás que toda la información que necesitamos se encuentra en los atributos del enlace, lo que significa que solo tenemos que buscar los enlaces que tengan la clase «card-link» y obtener sus atributos.

List<?> anchors = page.getByXPath("//a[@class='card-link']");
for (int i = 0; i < anchors.size(); i++) {
   HtmlAnchor link = (HtmlAnchor) anchors.get(i);
   String recipeTitle = link.getAttribute("title").replace(',', ';');
   String recipeLink = link.getHrefAttribute();
}

En esta ocasión, utilizamos una expresión XPath para buscar enlaces a cualquier profundidad en el documento HTML. A continuación, recorremos la lista de resultados y extraemos el título y el atributo href de cada uno de ellos.

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 recetas. 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:

import java.io.FileWriter;

A continuación, inicializamos nuestro FileWriter, que creará el CSV en modo «append»:

FileWriter recipesFile = new FileWriter("recipes.csv", true);
recipesFile.write("id,name,link\n");

Tras la creación, también escribimos la primera línea del CSV, que será el encabezado de la tabla. Ahora volvemos al bucle anterior, donde analizamos todas las fichas de recetas, y lo completamos con la siguiente línea:

recipesFile.write(i + "," + recipeTitle + "," + recipeLink + "\n");

Ya hemos terminado de escribir en el archivo, así que ahora es el momento de cerrarlo:

recipesFile.close();

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

Conclusión y alternativas

Con esto concluye nuestro tutorial. Espero que este artículo te haya resultado informativo y te haya ayudado a comprender mejor el web scraping.

Como puedes imaginar, esta tecnología puede hacer mucho más que alimentar agregadores de recetas. Depende de ti encontrar los datos correctos y analizarlos para crear nuevas oportunidades.

Pero, como dije al principio del artículo, hay muchos retos a los que deben enfrentarse los web scrapers. A los desarrolladores les puede parecer emocionante resolver estos problemas con su propio web scraper, ya que es una gran experiencia de aprendizaje y muy divertido. Aun así, si tienes un proyecto que terminar, es posible que quieras evitar los costes asociados a ello (tiempo, dinero, personal).

Siempre será más fácil resolver estos problemas con una API especializada. A pesar de todos los posibles obstáculos, como el renderizado de JavaScript, los proxies, los CAPTCHA, etc., WebScrapingAPI los supera todos y ofrece una experiencia personalizable. También hay una opción de prueba gratuita, así que, si aún no estás del todo seguro, ¿por qué no le das una oportunidad?

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.