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.

13 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
  4. Si pones una película que tenga varias versiones (como Mujercitas o El fantasma de la ópera), solamente te muestra la primera versión sin tener en cuenta el año.

    Responder

Deja un comentario