Raspado de datos con PHP: una guía paso a paso

Aprenda a crear y programar con facilidad su propio raspador web en PHP, desde cero.
Web scraping with PHP
Daniel Shashko
Daniel Shashko | SEO Specialist
04-Sep-2022

PHP (Preprocesador de Hipertexto) es un lenguaje de programación para desarrollo web que puede usarse para recopilar datos web. En esta publicación, cubriremos:

¿Por qué usar PHP?

En la actualidad, PHP impulsa ~40% de la web, incluyendo sitios como WordPress, Slack y Facebook. Es uno de los lenguajes de programación más populares del lado del servidor en cuanto se refiere a desarrollo web. Para quienes trabajan con MySQL, sus bases de datos tienen bastante relación. Es un lenguaje relativamente fácil de aprender, con buena documentación y bibliotecas que pueden reducir el tiempo de desarrollo.

Primeros pasos con PHP

Esta guía presentará un método de raspado de datos manual, en el que envía un bot a un servidor web y recopila datos usando PHP como el lenguaje de programación de cimiento. Esto es contrario a usar una herramienta totalmente automatizada para recopilación de datos que puede simplificar y eficientar el proceso.

El raspador web funcionará mediante el envío de una solicitud HTTP al servidor y después recopilando el código del sitio web. Después, le mostraremos cómo analizar la información recuperada.

Aquí se muestra un ejemplo de fragmento de código que podría aparecer en el encabezado de un sitio web donde desea raspar datos:

<html><body><h1>This is a heading!</h1></body></html>

Tras haber recolectado este código, se deberá analizar para que un analista humano pueda leer y comprender el texto. En este ejemplo, tras el análisis, se le mostrará el siguiente mensaje en texto simple:

‘This is a heading!’

Antes de comenzar, asegúrese de tener PHP instalado en su computadora.

Raspado de datos con PHP en 3 pasos simples

Paso uno: Recopilar el código de su sitio web.

Comience ingresando el siguiente código:

<?php
$code = file_get_contents (“http://quotes.toscrape.com”); 
?>

En términos de convenciones de escritura de código:

  • En toda la documentación de PHP, se usa “<?php” y “?>” al inicio y final de los comandos.
  • La segunda línea configura una variable llamada “$code” que corresponde al contenido de la URL en cuestión. En este ejemplo, nos enfocaremos en: “http://quotes.toscrape.com”. Esto ayuda a almacenar el código URL dentro de la variable “$code”.

¿Prefiere una solución de raspado de datos automatizada por completo?

Paso dos: Análisis de la página web

Esta tarea tiene el propósito de recopilar todas las citas de este sitio web:

Texto citado en una página de citas

Hacer clic con el botón derecho sobre su página objetivo y seleccionar ‘view page source’, abrirá una ventana nueva con el código fuente. En nuestro ejemplo, notará que todas las citas están contenidas dentro de etiquetas , con la clase “text” y el atributo itemprop también marcado como ‘text’, como se muestra a continuación:

Ejemplo de código de cita

Comencemos usando PHP para eliminar todo el texto no deseado del código, excepto las citas presentes en las etiquetas , y después lo mostraremos en la pantalla usando la función ‘echo’:

<?php
$code = file_get_contents("http://quotes.toscrape.com");
$code = str_replace(">", "<>", $code);

$splitCode = explode("<", $code);

// Find the first occurance of the opening tag of the quotes: 
$openingTag = array_search('span class="text" itemprop="text"', $splitCode, true);

// Find the first occurance of the closing tag of the quotes 
$closingTag = array_search('/span', $splitCode, true);

// Now, find the text in between the tags 
$i = $openingTag;
$total = "";
while ($i < $closingTag) {
	$total = $total . $splitCode[$i];
	$i = $i + 1;
}
$final = substr($total, 37);
echo $final;
?>

En la línea 2, remplaza todas las ocurrencias de “>” en el código con “<>”. Esto es para que se pueda dividir junto con “<” en la línea 5. Ahora, tiene un conjunto de todas las etiquetas en el código. En la línea 8, nuestro programa encuentra la ubicación de la etiqueta de inicio y en la línea 11, encuentra la ubicación de la etiqueta de cierre.

Ahora, todo lo que necesita hacer es recolectar el texto entre estas dos ocurrencias. Esto es posible creando una variable llamada “i” con el valor de la ubicación de la variable de la etiqueta inicial. Crea una variable donde ingresar el resultado más adelante. En la línea 16, comienza a ejecutar un loop en cada letra después de la etiqueta inicial, agregando la letra al valor total, después incrementa la variable ‘i’. Después de haber pasado la etiqueta final, el loop se detendrá.

A continuación, elimina los primeros 37 dígitos del string final ya que esos primeros 37 dígitos son los que analizamos en la etiqueta – la etiqueta . Por último, recolecta los resultados finales usando la función ‘echo function’.

Al ejecutar el programa, se verá parecido a:

“The world we have created it is a process of our thinking. It cannot be changed without changing our thinking.” 

Esa es la primer cita mostrada en el sitio web donde raspamos datos sin el código no amigable con el usuario (‘non-human-friendly’).

Paso tres: ejecución de loop.

Puede haber notado que solo recopila la primer ocurrencia y ninguna después de esa. Para arreglarlo, podemos simplemente borrar las ocurrencias que acabamos de devolver y repetir el proceso después, hasta que las hayamos recuperado todas. Además, podemos simplificar nuestro código poniendo el proceso de raspado de datos en una función para que se pueda ejecutar cuando sea que lo necesitemos. Intentemos usar este código:

<?php 
$code = file_get_contents("http://quotes.toscrape.com");
$code = str_replace(">", "<>", $code); 

$splitCode = explode("<", $code);

function parseCode($splitCode) {
	// Find the first occurance of the opening tag of the quotes:
	$openingTag = array_search('span class="text" itemprop="text"', $splitCode, true);
	
	// Find the first occurance of the closing tag of the quotes: 
	$GLOBALS[closingTag] = array_search('/span', $splitCode, true);
	
	// Now, find the text in between the tags 
$i = $openingTag;
$total = "";
while ($i < $GLOBALS["closingTag"]) {
	$total = $total . $splitCode[$i];
	$i = $i + 1;
}
// Run the function, then update splitCode to delete the previous occurance 
// that it can be repeated for the next quote, then loop through 3 times 
// (You can change how many times):
parseCode($splitCode);
$splitCode = array_slice($splitCode, $GLOBALS["closingTag"]-1, NULL, TRUE);
parseCode($splitCode);
$splitCode = array_slice($splitCode, $GLOBALS["closingTag"]-1, NULL, TRUE);
parseCode($splitCode);
$splitCode = array_slice($splitCode, $GLOBALS["closingTag"]-1, NULL, TRUE);
parseCode($splitCode);

?>

Puede haber notado que nuestro código previo se ha ingresado en una función llamada ‘parseCode’, que contiene un parámetro llamado ‘$splitCode’, de modo que puede tener acceso al código y después repiten (‘echo’) el resultado. La función ’parseCode’ se ejecuta en la línea 27 y después en la 28, nuestro programa elimina la ocurrencia anterior de la etiqueta final para que se pueda replicar. Las líneas 27 y 28 simplemente se repiten ~ 3 veces para que el programa identifique un patrón y descubra la próxima ocurrencia.

Por último, ingresamos la etiqueta final como una variable global (‘global variable’) con el alcance superglobal ‘$GLOBALS’ y en la línea 21, ingresamos etiquetas <p> alrededor de cada línea que devuelve, para que cree una nueva línea para cada cita que analiza. A continuación, se muestra el resultado:

“The world we have created it is a process of our thinking. It cannot be changed without changing our thinking.”

“There are only two ways to live your life. One is as though nothing is a miracle. The Other is as though everything is a miracle.” 

“Try not to become a man of success. Rather become a man of value.”

El resultado es precisamente lo que buscábamos. No código, solo texto legible. Este proceso puede replicarse para casi cualquier sitio web objetivo, como raspar eBay buscando puntos de datos objetivo como precios de productos, reseñas y SKUs (Unidades de referencia de almacén).

En conclusión

Puede ser efectivo usar PHP para raspar datos web buscando datos objetivo, aunque podría ser un proceso manual lento. Una alternativa viable que las compañías podrían querer considerar es simplemente adquirir conjuntos de datos listos para usarse. Esto ahorra tiempo y recursos, permitiéndole a usted y a su equipo dirigir toda su atención a expandir su negocio, garantizando la satisfacción de los clientes y enfocándose en el desarrollo de los productos centrales.

Daniel Shashko
Daniel Shashko | SEO Specialist

Daniel is an SEO specialist here at Bright Data with a B2C background. He is in charge of ensuring that businesses get exposed to articles that help them become more data-driven. He is fascinated by the intricate inner workings that the digital world is comprised of and how these can be navigated for hypergrowth.