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

Excelente!!
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