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;
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.
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
Revisa el codigo, algo debes de estar haciendo mal
Excelente muchas gracias 😀
De nada, gracias por aportar
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
Hola. Gracia por la ayuda.
Como puedo hacer para debaguer por pantalla el contenido que obtuvo ?
Gracias nuevamwnte
Una manera rapida es pintar por pantalla con la funcion var_dump(variable)
Si tengo mas Divs en la web, y quiero que me muestren todos? Cómo lo haría?
Tendrias que obtener todos los div y pintarlos recorriendolos con un bucle
Hola.
Gracias por el aporte, el problema es que solo me devuelve un valor y en la web hay multiples campos con el mismo class que quiero scrapear ¿como se hace?
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.
Hola: ¿Cómo se podría obtener el argumento -o sinopsis- de la película?
Gracias
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.