Introducción: por qué PHP es la herramienta ideal para hacer scraping
\n\nCuando 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\nEn 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\nSi alguna vez quisiste automatizar la recolección de precios de la competencia, noticias o contactos, estás en el lugar correcto. ¡Empecemos!
\n\nScraping vs. Parsing: ¿cuál es la diferencia?
\n\nAntes 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\nEn 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
También puedes usar librerías (hablaremos de ellas más adelante), pero para empezar, las funciones nativas son suficientes.
\n\nInstalación y preparación del entorno
\n\nNecesitarás PHP versión 7.4 o superior con las extensiones curl y dom. Puedes verificar si están instaladas así:
php -m | grep -E "curl|dom"\n\nSi no aparece nada, instálalas con el gestor de paquetes:
\n\nsudo apt install php-curl php-xml\n\nTodo listo. Ahora crearemos nuestro primer script para hacer scraping.
\n\nEjemplo 1: Scraping simple con cURL y DOMDocument
\n\nSupongamos 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\nObserva 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.
Ejemplo 2: Trabajar con formularios y solicitudes POST
\n\nA 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,