Web Scraping con lenguaje de programación PHP

Guías, Guías, Raspado, 25 de diciembre de 20245 minutos de lectura

El web scraping se ha convertido en una herramienta esencial para desarrolladores y analistas de datos que necesitan extraer y analizar información de la web. Ya sea para hacer un seguimiento de los precios de un producto, recopilar datos para una investigación o crear un panel de control personalizado, el web scraping ofrece infinitas posibilidades.

Si eres un entusiasta de PHP, Goutte es una fantástica librería a tener en cuenta para tus necesidades de web scraping. Goutte es ligera, fácil de usar y potente, combinando las capacidades del cliente HTTP de Guzzle con DomCrawler de Symfony para un raspado web fluido y eficiente.

Esta guía le llevará a través de los fundamentos del web scraping con PHP usando Goutte-desdela instalación y su primer script hasta técnicas avanzadas como el manejo de formularios y la paginación.

¿Por qué elegir Goutte para el Web Scraping?

Goutte ha ganado popularidad entre los desarrolladores por varias razones, convirtiéndose en una de las bibliotecas de scraping para PHP más utilizadas:

  • API sencilla y limpia: Goutte ofrece una interfaz limpia e intuitiva que es fácil de aprender, incluso para los principiantes.
  • Integración perfecta: Combina las peticiones HTTP con el análisis sintáctico de HTML, eliminando la necesidad de bibliotecas independientes.
  • Funciones potentes: Goutte soporta funcionalidades avanzadas como el manejo de sesiones, la gestión de cookies y el envío de formularios mediante programación.
  • Fácil de usar para principiantes, pero robusto: Desde las tareas de scraping más sencillas hasta los proyectos más complejos, tiene todo lo necesario para empezar.

Tanto si eres nuevo en PHP como si eres un desarrollador experimentado, Goutte consigue un equilibrio ideal entre sencillez y potencia.

Instalación de Goutte

Antes de lanzarse a la codificación, asegúrese de que se cumplen los requisitos previos necesarios:

  • PHP instalado: Asegúrese de tener PHP 7.3 o superior instalado en su entorno de desarrollo. Descarga PHP directamente usando este enlace.
  • Composer instalado: Composer es necesario para gestionar las dependencias e instalar Goutte.

Para instalar Goutte, simplemente ejecute el siguiente comando en su terminal:

composer require fabpot/goutte

Una vez instalada, verifica que la librería es accesible requiriendo el autoloader de Composer en tu proyecto:

require 'vendor/autoload.php';

Ya está listo para empezar a raspar.

Tu primer script de Web Scraping con Goutte

Empecemos con un ejemplo sencillo. Vamos a scrapear el título de una página web usando Goutte. Abajo está el script básico:

Obtención y visualización del título de la página

<?php
require 'vendor/autoload.php';

use Goutte\Client;

// Initialize Goutte Client
$client = new Client();

// Send a GET request to the target URL
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract the title of the page
$title = $crawler->filter('title')->text();
echo "Page Title: $title\n";

// Extract the titles of the first 5 books
echo "First 5 Book Titles:\n";
$crawler->filter('.product_pod h3 a')->slice(0, 5)->each(function ($node) {
    echo "- " . $node->attr('title') . "\n";
});
?>

Salida:

Título de la página: Todos los productos | Libros para raspar - Sandbox
Primeros 5 títulos de libros:
- Una luz en el ático
- Tipping the Velvet
- Soumission
- Sharp Objects
- Sapiens: Breve historia de la humanidad

Así de fácil. Con sólo unas pocas líneas de código, puede obtener y mostrar el archivo títulode cualquier página web.

Extracción de datos de páginas web

Una vez que haya aprendido a obtener una página web, el siguiente paso es extraer datos específicos, como enlaces o contenido de elementos HTML concretos.

Extracting All Links (`<a>` Tags)

El siguiente script extrae el href atributos de todos <a> en una página web:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract all <a> tags
$links = $crawler->filter('a')->each(function ($node) {
    return $node->attr('href');
});

// Print all extracted links
foreach ($links as $link) {
    echo $link . "\n";
}

Esto devolverá todos los hipervínculos presentes en la página.

Extracción de contenidos por clase o ID

Goutte facilita la extracción o el análisis sintáctico de datos de HTML utilizando clase o ID selectores. Para este ejemplo, utilizaremos el selector Sitio web de Books to Scrape. En concreto, rascaremos información sobre cada libro, ya que todos comparten la misma clase, producto_pod. Así es como aparece en el sitio web:

He aquí un ejemplo de cómo conseguirlo con Goutte:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Extract all <a> tags
$links = $crawler->filter('a')->each(function ($node) {
    return $node->attr('href');
});

// Print all extracted links
foreach ($links as $link) {
    echo $link . "\n";
}

// Extract elements with class 'product_pod'
$products = $crawler->filter('.product_pod')->each(function ($node) {
    return $node->text();
});

// Print all extracted product details
foreach ($products as $product) {
    echo $product . "\n";
}

Navegar entre páginas

Ahora, vamos a explorar cómo navegar o paginar entre páginas. En la página de ejemplo que estamos utilizando, hay un botón "Siguiente" que permite la paginación a la página siguiente. Aprovecharemos este botón para implementar la paginación.

En primer lugar, localizaremos el botón utilizando su etiqueta clase que tiene como valor siguiente . Dentro de este elemento, hay un <a> que contiene la URL de la página siguiente. Extrayendo esta URL, podemos utilizarla para enviar una nueva petición y pasar sin problemas a la página siguiente.He aquí el aspecto y la estructura HTML de la etiqueta siguiente de la página.

Este es el aspecto del código que lo consigue:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');

// Handle pagination using the 'next' button
while ($crawler->filter('li.next a')->count() > 0) {
    $nextLink = $crawler->filter('li.next a')->attr('href');
    $crawler = $client->request('GET', 'https://books.toscrape.com/catalogue/' . $nextLink);
    
    // Extract and print the current page URL
    echo "Currently on: " . $crawler->getUri() . "\n";
}

Con este enfoque, se puede automatizar la navegación entre páginas y seguir raspando datos.

Manejo de formularios con Goutte

Goutte también es capaz de manejar formularios. Para demostrar esta funcionalidad, utilizaremos este sitio web, que tiene un único campo de entrada, como se muestra en la imagen siguiente:

Este es el aspecto del código para enviar este formulario:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'https://www.scrapethissite.com/pages/forms/');

// Submit the search form with a query
$form = $crawler->selectButton('Search')->form();
$form['q'] = 'Canada';

$crawler = $client->submit($form);

// Extract and print the results
$results = $crawler->filter('.team')->each(function ($node) {
    return $node->text();
});

foreach ($results as $result) {
    echo $result . "\n";
}

Este script rellena un campo de formulario llamado q con el valor raspado web y lo envía. A partir de aquí, puede extraer el contenido de la página de resultados de búsqueda como en los ejemplos anteriores.

Tratamiento de errores y buenas prácticas

Tratamiento de errores de red

Añada siempre un tratamiento de errores para gestionar situaciones inesperadas, como una conexión de red fallida o URL inexistentes.

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();

try {
    $crawler = $client->request('GET', 'https://invalid-url-example.com');
    echo "Page title: " . $crawler->filter('title')->text();
} catch (Exception $e) {
    echo "An error occurred: " . $e->getMessage();
}
}

Respetar Robots.txt

El web scraping debe realizarse siempre de forma ética y responsable. El archivo `robots.txt` es un sencillo archivo de texto que utilizan los sitios web para comunicarse con los rastreadores web, indicando a qué partes del sitio se puede o no acceder. Antes de hacer scraping, es importante comprobar el archivo `robots.txt` para asegurarse de que se siguen las normas del sitio y se respetan sus términos. Ignorar estas directrices puede dar lugar a problemas legales y éticos, por lo que siempre hay que dar prioridad a este paso en el proceso de scraping.

Más información robots.txt aquí.

Limitación de velocidad

Sé cortés y evita enviar demasiadas peticiones en un corto periodo de tiempo, ya que esto puede saturar el servidor y perturbar su rendimiento para otros usuarios. Es una buena práctica incluir un pequeño retraso entre cada petición para minimizar la carga del servidor y asegurar que puede manejar el tráfico eficientemente. Tomar estas medidas no sólo ayuda a mantener la estabilidad del servidor, sino que también demuestra un uso responsable y considerado de los recursos compartidos.

sleep(1); // Esperar 1 segundo entre peticiones

Errores comunes

  • Muchos sitios web modernos se basan en JavaScript para cargar el contenido, lo que significa que las herramientas de scraping tradicionales pueden no capturar todos los datos que necesita. Herramientas como Puppeteer o Selenium pueden simular las interacciones del usuario y cargar el contenido como lo haría un navegador.
  • Asegúrese de que los puntos finales HTTPS que raspa muestran certificados válidos para evitar errores. Los certificados no válidos o caducados pueden hacer que el scraper falle o plantear problemas de seguridad. Comprueba siempre el estado del certificado antes de realizar el scraping y considera el uso de bibliotecas que gestionen estos problemas sin problemas.

Conclusión

El scraping web es una potente herramienta para recopilar datos de forma eficaz, pero requiere un enfoque responsable y reflexivo para evitar los errores más comunes y garantizar un uso ético. Si se adhiere a las mejores prácticas, como respetar los términos de servicio de los sitios web, implementar retrasos apropiados entre las solicitudes y utilizar herramientas capaces de manejar contenido dinámico, puede crear un scraper que funcione eficazmente y minimice el impacto en los servidores. Además, verificar los certificados HTTPS y tener en cuenta las consideraciones de seguridad protegerá su scraper y los datos que recopile. Con una planificación y ejecución adecuadas, el raspado web puede convertirse en un recurso inestimable para la investigación, el análisis y la innovación.