Saltar al contenido
Codifíca.me | Desarrollo web | Programación
Php

Escrapear dominios o url con simple_html_dom | Links Scraper

16 agosto, 2015

Deprecated: Function create_function() is deprecated in /home/nekdyruf/public_html/codi/wp-content/plugins/wp-syntax/geshi/geshi.php on line 4751

En esta entrada vamos a mostrar como escrapear dominios con simple_html_dom, la verdad que esta librería funciona muy bien y es muy sencillo recuperar datos de las webs utilizándola.

En este ejemplo vamos a enviar un array o colección de webs o urls de las que vamos a obtener el título de la página.

Esto es bastante simple valdría con hacer algo así:

llamar a la libreria:

require_once('simple_html_dom.php');

Crear el array o colección de páginas web o urls

$ureles = array(
"https://www.codifica.me"
,"http://otraweb.com"
,"http://otraweb.es"
,"http://vimeo.com"
,"http://youtube.com"
);

Por cada url ejecutar file_get_html

  foreach ($ureles as $element){      
		 $html = file_get_html($element);

Por cada $html que ha devuelto le ejecución de la función encontrar el título de la página y si no está vacio mostrarlo por pantalla

				foreach( $html->find('title') as $element1){
				 if (!empty($element1)) {
				   echo $element1->plaintext . '<br>';
				 }
				}
}

Sencillito ¿no? , bueno pues hasta aquí bien, aunque si quieres hacer lo mismo con 200 urls es posible que el servidor te muestre un error de time out, así que tendrás que lo más sencillo es crear una petición ajax para que vaya ejecutando o enviando al servidor las urls de 10 en 10, aunque esto ya depende de tu servidor y de la capacidad que tenga.

Otro error que también os podéis encontrar cuando intentamos llegar a muchas urls es que alguna esté caida, para eso yo llamo a una funcion para chequear las urls que utiliza la famosa librería curl que practicamente pregunta por la url y en el caso de que esta funcione bien y no devuelva ningún error nos devolverá ‘true’ y podremos continuar con la ejecución del código.

scraping urls

Este es el código básicamente, adáptalo a tu gusto 😉

 
 
require_once('simple_html_dom.php');
 
$ureles = array(
"http://dailymotion.com"
,"http://youtube.com"
,"https://www.codifica.me"
);
 
 
 
$numero=1;
 
 
   foreach ($ureles as $element){        
        $file1 = $element;	
        $html = file_get_html($element)or die('this is not a valid url');
 
	//limpiar urls
	$eliminarUrls= array("http://", "https://", "www.");
	$urlsLimpias= str_replace($eliminarUrls, "", $element);
 
	//urls limpias
 
	echo '<div class="byellow">Sitio ' . $numero . ': <b>' . $urlsLimpias . '</b></div><br>';
 
 
		foreach( $html->find('title') as $element1){
		 if (!empty($element1)) {
		   echo $element1->plaintext . '<br>';
		 }
		}
		echo '<br>';
	$numero=$numero+1;
 
 
   }

Si quieres todo el código con el que realice estas pruebas lo tienes aquí:
[sociallocker]

<html>
<head>
</head>
<body>
 
<?php
 
require_once('simple_html_dom.php');
//htmlspecialchars_decode()
 
 
 
$ureles = array(
"http://dailymotion.com"
,"http://youtube.com"
,"https://www.codifica.me"
);
 
 
 
$numero=1;
 
 
   foreach ($ureles as $element){        
        $file1 = $element;	
	if(url_validate($file1)) {
	    $exists = true;
	}
	else {
	    $exists = false;
	}
	if ($exists){
        $html = file_get_html($element)or die('this is not a valid url');
 
	//limpiar urls
	$eliminarUrls= array("http://", "https://", "www.");
	$urlsLimpias= str_replace($eliminarUrls, "", $element);
 
	//urls limpias
 
	echo '<div class="byellow">Sitio ' . $numero . ': <b>' . $urlsLimpias . '</b></div><br>';
 
 
		foreach( $html->find('title') as $element1){
		 if (!empty($element1)) {
		   echo $element1->plaintext . '<br>';
		 }
		}
		echo '<br>';
	$numero=$numero+1;
        }
 
   }	
 
 
function url_validate($link)
{
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $link);
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 
	   //aumentar el tiempo puede sobrecargar el uso del servidor
	curl_setopt($ch, CURLOPT_HEADER, true);
	curl_setopt($ch, CURLOPT_NOBODY, true);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($ch, CURLOPT_MAXREDIRS, 3); 
	   //numero de redirecciones que va a seguir
	$data = curl_exec($ch);
	curl_close($ch);
	preg_match_all("/HTTP\/1\.[1|0]\s(\d{3})/",$data,$matches);
 
	$code = end($matches[1]);
 
	if(!$data) 
	{
		return(false);
	} 
	else 
	{
		if($code==200) 
		{
			return(true);
		} 
		elseif($code==404) 
		{
			return(false);
		}
	}
}
 
 
 
?>       
</br>
</body>
</html>

[/sociallocker]