A little PHP magic…Web crawler.

Un poco de magia con php…

Php es un lenguaje sumamente poderoso con una sintaxis parecida a nuestro amado ( odiado por algunos ) C. Los usuarios de Mac contamos con una instalación de php sin tener que mover un dedo. ( Sí , para los que no lo sabían OSX viene con php instalado ) . De hecho se activa cuando activamos el WebSharing. Podemos usarlo sin el websharing gracias al Interpretador por consola, esto es simple.

$php script.php


Bueno terminando con eso… qué es un web crawler o spider ? Es un bot que recorre un sitio, varios sitios, miles o millones de sitios buscando información, qué clase de información ? esto depende de lo que le pidamos. Yo voy a mostrar el uso de un crawler para buscar imágenes. ( podrían ser links, etc etc )

Empecemos:

Primero tenemos que escoger nuestro “target URL”, y después utilizar a nuestro amigo “Curl” para que guarde en la variable “$html” la información que hay en la página que vamos a revisar… . El userAgent debería ser auto explicativo.

$target_url = $domain.$path.$expression;

$userAgent = 'Googlebot/2.1 (http://www.googlebot.com/bot.html)';

// hacer el curl request a nuestro target_url
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
curl_setopt($ch, CURLOPT_URL,$target_url);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$html= curl_exec($ch);
if (!$html)
{
   echo "<br/>cURL error number:" .curl_errno($ch);
   echo "<br/>cURL error:" . curl_error($ch);
   exit;
}

Habiendo entendido esto es hora de organizar el documento HTML, para lograr esto podemos utilizar los famosos:
$dom = new DOMDocument();
@$dom->loadHTML($html);

La extensión DOM sirve para operar a través de documentos XML a través del API DOM. La función loadHTML sirve para parsear el contenido HTML que contiene el string de nuestra fuente. Al contrario de loadXML , el HTML no tiene que estar necesariamente bien formateado para cargarlo.

$dom va a ser una instancia de lo que sería un objeto DOMDocument ( la clase DOMDocument ).

Para seguir tendríamos que entender algo así.

	$xpath = new DOMXPath($dom);
	$imgs = $xpath->evaluate("/html/body//img");

Acá lo que se hace es crear un Xpath basandose en nuestra instancia $dom declarada anteriormente, $imgs va a contener todas las imagenes que se encuentren dentro del arbol /html/body//img , se pueden buscar otras cosas como links /html/body/a , o que se yo, el método evaluate es muy poderoso, al igual que query. ( notar que DOMXpath devuelve un resultado escrito o una lista del tipo DOMNodeList).

Ahora voy a separar todas las imagenes que contengan el string “hola” dentro de su path… esto es muy simple:

	for($i=0; $i < $imgs->length; $i++)
		{
			$img = $imgs->item($i);
			$image = $img->getAttribute('src');

			if(preg_match("/hola/", $image))
			{
				$imagen_final = $image;
			}
		}

El for debiese ser trivial de comprender… en el fondo para acceder a cada item de imgs, utilizamos imgs->item(número de item). Cuando hago $image = $img->getAttribute(’src’); , lo que hacemos es que extraemos el atributo src, ( que vendría siendo el path completo de la imagen ) ( una imagen en html se inserta así : ). Con el Preg_match, utilizamos expresiones regulares para ver si tenemos un match del string dado ( hola ) , en nuestra imagen.

Eso es todo , nuestra imagen finalmente quedará en $imagen_final.

Esto es un ejemplo muy simple de lo que se puede hacer con DOM, los invito a investigar un poco más, yo mismo estoy aprendiendo asi que tampoco me considero un experto en el tema.

Saludos!

Links:
PHPBuilder
PHP.net

~ por Nicolas Goles en Abril 23, 2008.

2 comentarios to “A little PHP magic…Web crawler.”

  1. Excelente!!

  2. una pregunta, no se si me podrias ayudar. tengo un script que toma todos los links de una pagina y los inserta en una base de datos. la pregunta seria como hago para insertar tambien el nombre del link

Escribe un comentario