Scraping y extracción de datos en PHP: de básico a experto

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: por qué PHP es la herramienta ideal para hacer scraping

\n\n

Cuando hablamos de extraer datos de sitios web, muchos piensan automáticamente en Python con BeautifulSoup o Scrapy. Pero seamos sinceros: PHP está presente en casi todos los servidores, y si tu proyecto ya está en PHP, montar todo un stack en Python solo para una tarea de scraping no es eficiente. PHP maneja la recolección de datos de forma excelente, especialmente cuando necesitas procesar HTML o JSON rápidamente, consumir una API o extraer contenido de varias páginas.

\n\n

En el sitio pythonlib.ru solemos hablar de Python, pero hoy haremos una excepción. Porque PHP no es solo un lenguaje para "sitios web simples". Es una herramienta potente para el web scraping, capaz de trabajar con cURL, DOMDocument, XPath e incluso simular el comportamiento de un navegador. En este artículo, veremos con ejemplos prácticos cómo hacer scraping en PHP, evitar bloqueos y manejar contenido dinámico.

\n\n

Si alguna vez quisiste automatizar la recolección de precios de la competencia, noticias o contactos, estás en el lugar correcto. ¡Empecemos!

\n\n

Scraping vs. Parsing: ¿cuál es la diferencia?

\n\n

Antes de escribir código, aclaremos los términos. El parsing de datos en PHP es el proceso de extraer información estructurada de HTML, XML o JSON. El scraping de datos en PHP es un concepto más amplio que incluye descargar la página, sortear protecciones y extraer los datos. En pocas palabras: el parsing es "leer", el scraping es "extraer".

\n\n

En PHP, para hacer scraping necesitaremos dos herramientas principales:

\n
    \n
  • cURL — para enviar solicitudes HTTP y recibir respuestas del servidor
  • \n
  • DOMDocument o SimpleXML — para analizar el HTML/XML obtenido
  • \n
\n\n

También puedes usar librerías (hablaremos de ellas más adelante), pero para empezar, las funciones nativas son suficientes.

\n\n

Instalación y preparación del entorno

\n\n

Necesitarás PHP versión 7.4 o superior con las extensiones curl y dom. Puedes verificar si están instaladas así:

\n\n
php -m | grep -E "curl|dom"
\n\n

Si no aparece nada, instálalas con el gestor de paquetes:

\n\n
sudo apt install php-curl php-xml
\n\n

Todo listo. Ahora crearemos nuestro primer script para hacer scraping.

\n\n

Ejemplo 1: Scraping simple con cURL y DOMDocument

\n\n

Supongamos que queremos extraer los títulos de los artículos de un blog. Escribamos un código simple pero funcional:

\n\n
<?php\n// URL para el scraping\n$url = 'https://example-blog.com';\n\n// Inicializar cURL\n$ch = curl_init($url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);\ncurl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');\n\n$html = curl_exec($ch);\ncurl_close($ch);\n\n// Crear DOMDocument y cargar el HTML\n$dom = new DOMDocument();\nlibxml_use_internal_errors(true); // Ignorar errores de parsing HTML\n$dom->loadHTML($html);\nlibxml_clear_errors();\n\n// Usar XPath para buscar los títulos h2\n$xpath = new DOMXPath($dom);\n$titles = $xpath->query('//h2');\n\nforeach ($titles as $title) {\n    echo $title->nodeValue . "\\n";\n}\n?>
\n\n

Observa que configuramos un User-Agent — es la protección mínima contra bloqueos. Sin él, muchos sitios devuelven un error 403. También usamos CURLOPT_FOLLOWLOCATION para seguir redirecciones automáticamente.

\n\n

Ejemplo 2: Trabajar con formularios y solicitudes POST

\n\n

A menudo los datos están detrás de un formulario de búsqueda o de un inicio de sesión. El scraping en PHP permite simular el envío de un formulario:

\n\n
<?php\n$url = 'https://example.com/search';\n$postData = http_build_query([\n    'query' => 'PHP scraping',\n    'submit' => 'Search'\n]);\n\n$ch = curl_init($url);\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\ncurl_setopt($ch, CURLOPT_POST, true);\ncurl_setopt($ch, CURLOPT_POSTFIELDS,                

Blogs

Book Recommendations