PHP ne sert pas qu’à créer des sites dynamiques. Il peut aussi devenir un allié pour recopilar datos en línea.
Gracias a las bibliotecas especializadas, podrá configurar un rascador eficaz. Veamos cómo.

Requisitos previos para el scraping con PHP
Antes de empezar, asegúrate de :
- ✅ D’avoir des programación básica con PHP.
- ✅ D’avoir des conocimientos de HTML y CSS para seleccionar los datos que deben extraerse.
- ✅ Saber utilizar Marque. C’est un outil pour gérer les dépendances de PHP pour installer les bibliothèques de scraping comme Guzzle, Symfony DomCrawler ou Goutte.
- ✅ D’avoir un servidor web local para ejecutar su código (XAMPP, WAMP o MAMP).
- ✅ D’avoir un editor de código para escribir sus scripts PHP.
¿Qué herramientas son esenciales para el web scraping con PHP?
PHP por sí solo no es suficiente. Aquí están los bibliotecas que hacen que el raspado sea rápido y eficaz.
1. Guzzle : El cliente HTTP
Guzzle es la biblioteca más utilizada para enviar peticiones HTTP. Pour l’installer avec Marqueabra su terminal, vaya a la carpeta de su proyecto y escriba el comando :
composer require guzzlehttp/guzzle
Composer descarga la biblioteca y la hace utilizable directamente en su código.
He aquí un ejemplo de código sencillo para récupérer le contenu d’une URL :
request('GET', $url);
// Recuperar el código HTTP
$statusCode = $response->getStatusCode();
// Recuperar el contenido de la página
$content = $response->getBody()->getContents();
echo "Código HTTP : " . $statusCode . PHP_EOL;
echo "Contenido de la página:" . PHP_EOL;
echo $content;
} catch (\Exception $e) {
echo "Error: " . $e->getMessage();
}
2. Symfony DomCrawler et Goutte : L’Extraction de Données
Hay dos bibliotecas muy utilizadas para navegar y analizar HTML:
- Symfony DomCrawler que le permite navegar por HTML utilizando selectores CSS y dirigirse a elementos específicos.
- Drop que es un wrapper para Guzzle y DomCrawler, simplifica enormemente el proceso de scraping.
Ejemplo con Symfony DomCrawler :
request('GET', 'https://exemple.com');
$html = $response->getBody()->getContents();
$crawler = new Crawler($html);
// Selección por clase
$crawler->filter('.my-class')->each(function ($node) {
echo $node->texto() . PHP_EOL;
});
// Selección por ID
$crawler->filter('#mon-id')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
// Selección por etiqueta
$crawler->filter('h1')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
Ejemplo con Goutte
request('GET', 'https://exemple.com');
// Selección por clase
$crawler->filter('.ma-class')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
// Selección por ID
$crawler->filter('#mon-id')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
// Selección por etiqueta
$crawler->filter('p')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
3. Otras bibliotecas y herramientas
Pour aller plus loin, voici d’autres options :
- 🔥 PHP-Scraper : c’est une bibliothèque PHP qui facilite l’extraction d’informations depuis des pages web en gérant les complexités du HTML et des sélecteurs. Elle est très utilisée par les développeurs dans leurs projets via Composer.
Instalación de # con Composer
compose require fabpot/goutte
request('GET', 'https://example.com');
$title = $crawler->filter('title')->text();
echo "Título de la página: " . $ítulo;
- 🔥 Datos brillantes : c’est une plateforme professionnelle pour la collecte de données à grande échelle avec des proxys intégrés.

- 🔥 ScraperAPI : c’est un service de scraping web basé sur le cloud, accessible via une API. Au lieu d’utiliser des bibliothèques locales pour faire tout le travail, vous envoyez une simple requête à l’API de ScraperAPI en spécifiant l’URL de la page à scraper.
¿Cómo puedo crear un raspador web sencillo en PHP?
He aquí un tutorial para crear un scraper funcional en PHP :
Paso 1: Instalación de las dependencias
Utilice Marque instalar Drop gracias a la :
compose require fabpot/goutte
Étape 2 : Récupérer le contenu d’une page
Hacer una Solicitud HTTP GET y rhojear el contenido HTML de la página utilizando Goutte con el comando :
request('GET', $url);
// Recuperar el HTML en bruto si es necesario
$html = $crawler->html();
echo substr($html, 0, 500) . '...'; // vista previa
Paso 3: Extraer los datos
Une fois que vous avez récupéré le contenu HTML de la page, l’objectif est d’extraire des données spécifiques.
👉 Aquí hay un ejemplo de código PHP para scraper les titres d’une page blog con Goutte, utilizando un selector CSS para orientar el <h2> en los elementos <article>.
<?php
require 'vendor/autoload.php';
use Goutte\Client;
$client = new Client();
$url = 'https://exemple.com/blog'; // Remplacez par l'URL de votre page cible
// Faire une requête GET pour récupérer la page
$crawler = $client->request('GET', $url);
// Sélectionner les éléments <h2> dans <article> avec le sélecteur CSS
$titres = [];
$crawler->filter('article h2')->each(function ($node) use (&$titres) {
// Récupérer le texte du titre
$titres[] = trim($node->text());
});
// Afficher les titres extraits
print_r($titres);
?>
En este ejemplo:
- Utilizamos el selector CSS
artículo h2para orientar los títulos de los artículos en<h2>à l’intérieur des balises<article>. - El texto de cada título se extrae mediante la función
texto(), et nous l’ajoutons au tableau$ítulos. - Los títulos se muestran con
print_r($itulos);.
Él Selectores CSS (o XPath) también puede utilizarse para extracto atributos d’éléments HTML. Par exemple, si chaque titre de blog est un lien dans une balise <a>, nous pouvons extraire l’attribut href para obtener las URL de los artículos.
👉 Aquí hay un ejemplo con Goutte para extraer el enlaces artículos :
request('GET', $url);
// Seleccionar los enlaces en los títulos
$itulos = [];
$crawler->filter('artículo h2 a')->each(function ($node) use (&$itles) {
$itle = trim($node->text());
$link = $node->attr('href'); // Extraer atributo href
// Añadir el título y la URL a la tabla
$itulos[] = [
title' => $itle,
url' => $lien,
];
});
// Mostrar los resultados
print_r($itulos);
?>
En este ejemplo:
- Seleccionamos los enlaces contenidos en el
<a>à l’intérieur des balises<h2>en los elementos<article>. - Nous récupérons l’attribut
hrefde cada enlace con elattr('href'). - Los títulos y sus URL se añaden a la tabla
$ítulosy luego se muestra conprint_r($itulos);.
👉 El cuadro $ítulos contendrá elementos tanto con el título y el enlace de cada elemento. He aquí un ejemplo del formato de los datos devueltos:
Matriz
(
[0] => Array
(
[title] => Título del artículo 1
[url] => /artículo1
)
[1] => Array
(
[title] => Título del artículo 2
[url] => /artículo2
)
)
En este ejemplo:
- Cada elemento de la matriz es una matriz asociativa con dos claves:
títulopour le titre de l’article etURLpour l’URL correspondante. - Los datos extraídos se presentan en forma de tabla de dos niveles, en la que cada entrada contiene un título y su enlace asociado.
Etapa 4: Estructuración y almacenamiento de datos
Una vez extraídos los datos, es importante organizarlos correctamente. Para ello, vamos a estructurarlos en un archivo Tabla PHPy luego exportarlos en un formato estructurado como JSON Donde CSV.
request('GET', $url);
// Extraer títulos y URLs en una tabla estructurada
$data = [];
$crawler->filter('articulo h2 a')->each(function ($node) use (&$data) {
$data[] = [
title' => trim($node->text()), // Extraer título
url' => $node->attr('href'), // Extraer el atributo href (URL)
];
});
// Mostrar los datos extraídos
print_r($data);
?>
Una vez organizados los datos, puede exportarlos en el formato JSONque es útil para las API o para su uso en aplicaciones web:
<?php
// Exporter les données en JSON
file_put_contents('export.json', json_encode($data, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE));
echo "Les données ont été exportées en JSON dans 'export.json'.";
?>
El expediente export.json se creará en un formato legible, que podría tener este aspecto:
[
{
"title": "Título del artículo 1",
"url": "/article1"
},
{
"title": "Título del artículo 2",
"url": "/artículo2"
}
]
Si desea exportar los datos como una tabla CSV, puede utilizar fputcsv para escribir los datos en un archivo CSV :
<?php
// Exporter les données en CSV
$fp = fopen('export.csv', 'w');
// Ajouter l'en-tête (titres des colonnes)
fputcsv($fp, ['title', 'url']);
// Ajouter chaque ligne de données
foreach ($data as $row) {
fputcsv($fp, [$row['title'], $row['url']]);
}
// Fermer le fichier
fclose($fp);
echo "Les données ont été exportées en CSV dans 'export.csv'.";
?>
El expediente export.csv se verá así:
título,url
Título del artículo 1,/artículo1
Título del artículo 2,/artículo2
¿Cómo puedo hacer frente a los problemas comunes de web scraping en PHP?
Lors d’une opération de web scraping en PHPSin embargo, pueden surgir problemas. He aquí las soluciones para los más comunes.
1. Gestión de errores
- Errores de conexión
Parfois, la requête n’arrive même pas au serveur. Vous pouvez tomber sur “Pas de réseau”, “URL invalide”, “Serveur inaccessible”etc. En este caso, un try/catch pour éviter que votre script s’arrête brutalement.
👉 Aquí tienes un ejemplo usando Guzzle :
request('GET', 'https://example.com/api/data');
// Comprueba si la petición se ha realizado correctamente
if ($response->getStatusCode() === 200) {
// Procesar la respuesta en caso afirmativo
$body = $response->getBody();
echo "Datos recibidos : " . $body;
}
} catch (RequestException $e) {
// Capturar errores de conexión y petición
if ($e->hasResponse()) {
// Mostrar el código de error si está disponible
echo "Error de solicitud: " . $e->getResponse()->getStatusCode();
} else {
// Si la conexión falla (por ejemplo, servidor inalcanzable)
echo "Error de conexión: " . $e->getMessage();
}
}
}
// Llamar a la función
make_request_with_guzzle();
?>
- Códigos de estado HTTP
Aunque la conexión funcione, el servidor puede responder con un error (404 = página no encontrada, 500 = error de Internetetc.). Puede comprobar el código de estado con getStatusCode().
request('GET', 'https://example.com/api/data');
// Comprueba el código de estado de la respuesta
$status_code = $response->getStatusCode();
// Comprueba si la solicitud se ha realizado correctamente
if ($status_code === 200) {
// Procesar la respuesta en caso afirmativo
$body = $response->getBody();
echo "Respuesta correcta con código: " . $status_code . "
";
echo "Datos recibidos: " . $body;
} elseif ($status_code === 404) {
echo "Error 404 : Página no encontrada
";
} elseif ($status_code === 500) {
echo "Error 500 : Error interno del servidor
";
} else {
echo "Código de estado: " . $status_code . "
";
}
} catch (RequestException $e) {
// Capturar errores de conexión y petición
if ($e->hasResponse()) {
// Mostrar el código de error HTTP si está disponible
echo "Error HTTP: " . $e->getResponse()->getStatusCode() . "
";
} else {
// En caso de fallo de conexión (por ejemplo, servidor inalcanzable)
echo "Error de conexión: " . $e->getMessage();
}
}
}
// Llamar a la función
make_request_with_guzzle();
?>
- Errores de análisis sintáctico
Le parsing, c’est l’analyse du HTML par votre scraper. Si la page est mal formée, DomCrawler ou Goutte peuvent planter ou ne rien renvoyer.
Pour gérer ce genre d’erreur, il faut toujours vérifier que le contenu existe avant d’essayer de l’extraire. Utilisez des conditions (cuenta(), filter()...) pour vous assurer que l’élément ciblé est bien présent. Puis, entourez le parsing dans un try/catch para evitar que el script se bloquee.
request('GET', 'https://example.com');
// Comprueba que el elemento de destino existe antes de intentar extraerlo
$elements = $crawler->filter('div.target-element');
if ($elements->count() > 0) {
// El elemento está presente, podemos extraerlo
$content = $elements->first()->text();
echo "Contenido extraído: " . $content;
} else {
// No se encuentra el elemento
echo "No se ha encontrado el elemento de destino en la página;
}
} catch (Exception $e) {
// Captura errores de análisis
echo "Error al analizar la página: " . $e->getMessage();
}
}
// Llamar a la función
función scrape_website();
?>
2. Evitar las limitaciones
Algunos sitios utilizan medidas de protección para dificultar el scraping.
- Bloqueo por IP Puede utilizar proxies como los de la plataforma Bright Data.
- ❗ JavaScript por defecto, PHP no puede ejecutar JavaScript. Pour ce faire, l’utilisation d’un navigateur sans tête (headless browser) est nécessaire.
- ❗ Robots.txt Antes de proceder al desguace, es importante consultar este expediente para actuar de forma legal y responsable.
preguntas frecuentes
¿Es legal el web scraping?
📌 El legalidad del web scraping es un tema complejo. En Francia, como en todas partes, todo depende del marco jurídico, de los datos recogidos y de la forma en que se utilicen.
¿Cuál es la diferencia entre web scraping y web crawling?
- la raspado web est le fait d’extraire des données précises sur un site.
- la rastreo web es el acto de navegar por las páginas para indexarlas.

¿Cómo hago scraping de un sitio que requiere autenticación (login)?
Para raspar un sitio que requiere autenticación, debe simular la conexión. Con PHP, la solución más común es Guzzle.
Se envían los identificadores mediante una petición POST y se mantiene la sesión abierta para recuperar las páginas protegidas.
¿Cómo se gestiona el scraping de sitios con páginas dinámicas cargadas en AJAX?
⚠ Como recordatorio, PHP no puede ejecutar código JavaScript del lado del cliente.
Para raspar este tipo de página con PHP, puede utilice BrowserShotuna biblioteca que utiliza un navegador real en segundo plano (Headless Chrome/Chromium) para cargar la página y ejecutar el JavaScript.
Otra solución es integrar PHP con herramientas basadas en Node.jscomo Puppeteer para generar el HTML renderizado y luego recuperar los datos de PHP.
Para todo tipo de web scraping con páginas dinámicas, también puede utilizar herramientas especializadas denominadas navegadores sin cabeza.
¿Existen alternativas a PHP para el web scraping?
Sí, varias lenguas son populares:
- Python con sus potentes bibliotecas como BeautifulSoup y Scrapy.
- Node.js que es muy eficaz para el scraping de sitios web dinámicos, utilizando librerías como Puppeteer o Cheerio.

Comment programmer un “scraper” de manière éthique et responsable ?
Para raspar de forma ética, es necesario :
- ✔ Compruebe el archivo robots.txt para conocer las normas.
- ✔ Limite la frecuencia de sus solicitudes para no sobrecargar el servidor del sitio.
- ✔ Respetar las condiciones d’utilisation du site.
- ✔ No recopilar datos personales sin autorización.
✅ En resumen raspado web es una práctica poderosa, pero debe utilizarse de forma metódica y responsable.
👉 Y tú, ¿has creado alguna vez un scraper en PHP o en otro idioma? Comparta sus experiencias en la sección de comentarios.





