Hacer web scraping en php

5/5 - (1 voto)

Ultimamente muchos contactos me estan preguntado si se podria obtener partes concretas del codigo de una web y por este motivo me he decidido a crear esta entrada para explicar como hacer web scraping de una manera sencilla.

Para la prueba voy a utilizar la web filmafinity, peor podeis utilizar la que querais.

Lo primero que haremos es obtener la url que queremos tratar y la guardamos en una variable (en el ejemplo usare un busqueda de la pelicula Hinchas Radicales).

$url = file_get_contents('https://www.filmaffinity.com/es/advsearch.php?stext=hinchas+radicales&toyear=2020');

A continuación crearemos una clase DOMDocument y cargaremos el html, para tratar los objetos del dom.

//creamos nuevo DOMDocument y cargamos la url
$dom = new DOMDocument();
@$dom->loadHTML($url);

Ahora cargarempos los elementos html con los que queramos trabajar, en el ejemplo obtendre todas las etiquetas div.

//obtenemos todos los div de la url
$divs = $dom->getElementsByTagName( 'div' );

Llegado este punto con un bucle for recorremos todos los divs para conseguir los datos que queremos mostrar, en el ejemplo titulo y puntuación de la pelicula.

//recorremos los divs
foreach( $divs as $div ){
    //si encentramos la clase mc-title nos quedamos con el titulo
    if( $div->getAttribute( 'class' ) === 'mc-title' ){
        $title = $div->nodeValue;
    }
    //si encentramos la clase mr-rating nos quedamos con la puntuacion
    if( $div->getAttribute( 'class' ) === 'mr-rating' ){
        $rating = $div->nodeValue;
        break;
    }
  }

Y por ultimo pintamos por pantalla las variables scrapeadas $title y $rating.

  //pintamos el resultado
  echo 'Titulo: '. $title;
  echo '<br>';
  echo 'Puntuación:' . $rating;
Resultados

El codigo del ejemplo seria este.

<?php
$url = file_get_contents('https://www.filmaffinity.com/es/advsearch.php?stext=hinchas+radicales&toyear=2020');


//creamos nuevo DOMDocument y cargamos la url
$dom = new DOMDocument();
@$dom->loadHTML($url);

//obtenemos todos los div de la url
$divs = $dom->getElementsByTagName( 'div' );

//recorremos los divs
foreach( $divs as $div ){
    //si encentramos la clase mc-title nos quedamos con el titulo
    if( $div->getAttribute( 'class' ) === 'mc-title' ){
        $title = $div->nodeValue;
    }
    //si encentramos la clase mr-rating nos quedamos con la puntuacion
    if( $div->getAttribute( 'class' ) === 'mr-rating' ){
        $rating = $div->nodeValue;
        break;
    }
  }

  //pintamos el resultado
  echo 'Titulo: '. $title;
  echo '<br>';
  echo 'Puntuación:' . $rating;
 ?>

Con este simple codigo podeis obtener el contenido de cualquier web con solo cambiar la url y las etiquetas que querais obtener.

11 comentarios en «Hacer web scraping en php»

  1. saludos buen código tengo una duda a la hora de traerme valores numérico como el precio del dólar siempre me ignora esa parte y no me trae los valores solo tres puntos … osea lo ignora y solo me estoy trayemdo esa clase donde muestra ese valor me muestra solo los 3 puntos en vez del valor numerico y algun concepto que siempre esta al lado del precio agradezco tu ayuda gracias

    Responder
  2. Me encanto muy simple y bien explicado es una ayuda grande un abrazo a distancia muchísimas gracias me gustaría trabajar con su persona para más proyectos estoy a tu disposición me gusta aprender

    Responder
  3. Hola.
    Gran aporte.
    Lo he probado en una pagina donde hay un listado de productos y deseo obtener el nombre de ellos. Funciona correctamente pero solamente obtiene 1 registro.
    ¿Como se haría para obtener todos los resultados? Hablas de hacer un bucle pero no he sido capaz.
    Gracias.

    Responder

Deja un comentario