Hacer web scraping en php

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&amp;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.

Deja un comentario