Raspado de datos con PHP: La guía definitiva [+ alternativa]

Raspado de datos PHP

¿Estás buscando una manera de realizar raspado de datos de forma eficiente usando PHP? 

Pues te hemos preparado esta guía definitiva para que aprendas a realizar web scraping o raspado de datos con PHP paso a paso. ¡Comencemos!

 

Los requisitos previos

Primero, es necesario contar con los siguientes requisitos:

  • Asegúrese de haber instalado la última versión de PHP.
  • Configurar un composer que usaremos para instalar las diversas dependencias de PHP para las bibliotecas que destinaremos al raspado de datos.
  • Un editor de su elección.

Habiendo asegurado estos requisitos, procederemos a crear un directorio:

mkdir php_scraper

cd php_scraper

Ejecute los siguientes dos comandos en su terminal para inicializar el archivo composer.json:

composer init — require=”php >=7.4″ — no interaction

composer update

Ahora necesitaremos un cliente HTML para PHP: En esta guía nos enfcaremos en cómo usar dos; XML y XPath

Raspado de datos con PHP usando Guzzle

Guzzle es un cliente PHP HTTP que le permite enviar solicitudes HTTP de forma rápida y sencilla. Tiene una interfaz simple para construir cadenas de consulta.

Para este proceso, también necesitaremos XML y XPath.

Comience instalando Guzzle a través de composer ejecutando el siguiente comando en su terminal:

composer requires guzzlehttp/guzzle

Una vez que haya instalado Guzzle, creamos un nuevo archivo PHP al que agregaremos el código. lo llamaremos guzzle_requests.php.

Para esta demostración, rasparemos datos del sitio web Bookstoscrape.com. Debería poder seguir los mismos pasos que definimos aquí para raspar cualquier sitio web de su elección.

Queremos extraer los títulos de los libros y mostrarlos en el terminal.

El primer paso para raspar un sitio web es comprender su diseño HTML. En este caso, puede ver el diseño HTML de esta página haciendo clic con el botón derecho en la página, justo encima del primer producto de la lista, y seleccionando Inspeccionar.

En la fuente de la página, podrá ver que la lista está contenida dentro del elemento <ol class=”row”>. El siguiente hijo directo es el elemento <li>.

Lo que queremos es el título del libro. está dentro de la <a>, que a su vez está dentro del <h3>, que está dentro de <artícle>, que finalmente está dentro del elemento <li>.

Para inicializar Guzzle, XML y Xpath, agregue el siguiente código guzzle_requests.php al archivo:

<?php

# scraping books to scrape: https://books.toscrape.com/

require ‘vendor/autoload.php’;

$httpClient = new \GuzzleHttp\Client();

$response = $httpClient->get(‘https://books.toscrape.com/’);

$htmlString = (string) $response->getBody();

//add this line to suppress any warnings

libxml_use_internal_errors(true);

$doc = new DOMDocument();

$doc->loadHTML($htmlString);

$xpath = new DOMXPath($doc);

El fragmento de código anterior cargará la página web en una cadena. Luego analizamos la cadena usando XML y la asignamos a la variable $xpath.

Lo siguiente que se haría es orientar el contenido de texto dentro de la etiqueta <a> . Para ello, agregue el siguiente código al archivo:

$titles = $xpath->evaluate(‘//ol[@class=»row»]//li//article//h3/a’);

$extractedTitles = [];

foreach ($titles as $title) {

$extractedTitles[] = $title->textContent.PHP_EOL;

echo $title->textContent.PHP_EOL;

}

En el fragmento de código anterior,//ol[@class=”row”] obtiene la lista completa.

Cada elemento de la lista tiene una etiqueta <a> a la que nos dirigimos para extraer el título real del libro. Solo tenemos una etiqueta <h3> que contiene <a>, lo que facilita orientarla directamente.

Usamos el loop foreach para extraer el contenido del texto y repetirlo en la terminal.

En este paso, puede optar por hacer algo con los datos extraídos, tal vez asignar los datos a una variable de matriz, escribir en un archivo o almacenarlos en una base de datos.

Puede ejecutar el archivo usando PHP en la terminal ejecutando el siguiente comando. Recuerde, la parte resaltada es cómo nombramos nuestro archivo:

php guzzle_requests.php

Si puede ver párrafos de texto como resultado, lo está haciendo todo correctamente.

Ahora bien, ¿y si quisiéramos saber también el precio del libro?

El precio está en una etiqueta  <p>, dentro de una etiqueta <div>. Como puede ver, hay más de una etiqueta <p> y más de una etiqueta <div>.

Para encontrar el objetivo correcto, utilizaremos los selectores de clase CSS que, por suerte para nosotros, son únicos para cada etiqueta. Aquí está el fragmento de código para obtener también la etiqueta de precio y concatenarla con la cadena de título:

$titles = $xpath->evaluate(‘//ol[@class=»row»]//li//article//h3/a’);

$prices = $xpath->evaluate(‘//ol[@class=»row»]//li//article//div[@class=»product_price»]//p[@class=»price_color»]’);

foreach ($titles as $key => $title) {

echo $title->textContent . ‘ @ ‘. $prices[$key]->textContent.PHP_EOL;

}

Todo su código debería verse así y listo para ejecutarse:

<?php

# scraping books to scrape: https://books.toscrape.com/

require ‘vendor/autoload.php’;

$httpClient = new \GuzzleHttp\Client();

$response = $httpClient->get(‘https://books.toscrape.com/’);

$htmlString = (string) $response->getBody();

//add this line to suppress any warnings

libxml_use_internal_errors(true);

$doc = new DOMDocument();

$doc->loadHTML($htmlString);

$xpath = new DOMXPath($doc);

$titles = $xpath->evaluate(‘//ol[@class=»row»]//li//article//h3/a’);

$prices = $xpath->evaluate(‘//ol[@class=»row»]//li//article//div[@class=»product_price»]//p[@class=»price_color»]’);

foreach ($titles as $key => $title) {

echo $title->textContent . ‘ @ ‘. $prices[$key]->textContent.PHP_EOL;

Alternativa: adquiere un conjunto de datos con Bright Data

El raspado de datos con PHP para muchos puede ser una solución eficaz. Sin embargo, otros pueden considerarlo complicado y muy lento. Por ello, queremos también recomendarte una alternativa: adquirir conjunto de datos.

Los conjuntos de datos son básicamente bases de datos clasificada que te permite manejar información de redes sociales, tiendas ecommerce, directorios y hasta empresas en el sector inmobiliario.

Todo esto permite acelerar el proceso de obtención de datos para mejorar la efectividad de su empresa a la vez que le ahorra tiempo y dinero. 

Y si bien hoy la adquisición de estos conjuntos de datos puede ser un proceso fácil, existen empresas que no ofrecen lo mejor. Por ello queremos hablarle de Bright Data, el líder en el mercado de servicios web.

Bright Data cuenta con conjuntos de datos o datasets de las páginas más populares del mundo listos para su negocio. Además, ofrece un servicio de raspado de datos automáticos que también es una alternativa perfecta si prefiere no optar por realizarlo con PHP u otro programa que tome más tiempo de lo que su empresa esté dispuesta a invertir.