INICIO

ESCRAPEAR UNA WEB CON PHP | TUTORIAL SUPER POTENTE

¿Así que quieres escrapear cosas de una web con PHP?

Asumo que tienes nociones básicas de PHP y tal. Por supuesto.

¿Qué vamos a hacer?

Ok.

Lo primero que hay que hacer a la hora de escrapear cosas de una web, es saber qué URL abriremos.

De ahí sacaremos todo el código fuente, y de ese código fuente pillaremos la parte que nos interesa.

Hay varias formas de obtener el código fuente de una URL.

Nosotros nos decantaremos por el uso de PHP cURL.

Cómo pillar el código fuente de una página con cURL

Esto es como es, la verdad. Te muestro cómo lo hago yo y ya pues investigas lo que no sepas.

<?php

$abrir_url="http://...";

// Iniciamos un super curl
$super_curl = curl_init();

// Qué URL queremos abrir
curl_setopt($super_curl,CURLOPT_URL,$abrir_url);

// Simular algún user agent
$agentes_potentes = array(
 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:7.0.1) Gecko/20100101 Firefox/7.0.1',
 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100508 SeaMonkey/2.0.4',
 'Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)',
 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; da-dk) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1'
);
curl_setopt($super_curl,CURLOPT_USERAGENT,$agentes_potentes[array_rand($agentes_potentes)]);

// Establecemos las cabeceras
$cabeceras[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
$cabeceras[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
$cabeceras[] = "Cache-Control: max-age=0";
$cabeceras[] = "Connection: keep-alive";
$cabeceras[] = "Keep-Alive: 300";
$cabeceras[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$cabeceras[] = "Accept-Language: es;q=0.5";
$cabeceras[] = "Pragma: ";
curl_setopt($super_curl, CURLOPT_HTTPHEADER, $cabeceras);

// Que me devuelva el resultado como string
curl_setopt($super_curl,CURLOPT_RETURNTRANSFER,1);

// Timeout
curl_setopt($super_curl,CURLOPT_CONNECTTIMEOUT,50);

// Pillar el asunto y cerrar la conexión
$html = curl_exec($super_curl);
curl_close($super_curl);

// $html contiene el código fuente

?>

Ahora tenemos que tratar ese código fuente, limpiarlo un poquito.

Yo lo convierto todo a UTF-8, pa trabajar en condiciones.

// Recodificar a utf-8 por si las moscas
$html=mb_convert_encoding($html, 'UTF-8', mb_detect_encoding($html, 'UTF-8, ISO-8859-1', true));

// Importante pa evitar un bug de PHP (http://stackoverflow.com/questions/30925533/)
$html=str_replace("\0", '', $html);

// Quitar rastros de cabeceras ISO pestes de nuestro código fuente
$html=str_replace(array('ISO-8859-1','iso-8859-1'),'',$html);

Y esta joya suprema, la tenemos que procesar ahora.

Necesitamos algo que busque en ese código fuente la parte que nos interesa sacar.

Para eso hay muchas formas, pero la mejor es usar XPATH.

XPATH es una herramienta para buscar en nuestro HTML de una forma muy elegante.

// Meter el merengue en una bandeja XPATH
libxml_clear_errors();
libxml_use_internal_errors(true);
$titoDOM=new DOMDocument("4.01", "utf-8");
$titoDOM->loadHTML('<?xml encoding="utf-8" ?>'.$html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$titoXPATH=new DOMXPath($titoDOM);

Y ya podemos hacer consultas XPATH para sacar lo que nos dé la real gana.

$cachito_buscado=$titoXPATH->query("//div[@id='lo_que_sea']");

if($cachito_buscado->item(0)){

$resultado=$cachito_buscado->item(0)->textContent;

}

Con XPATH puedes sacar literalmente cualquier cosa del código fuente, así que dale duro.

¡Suerte!.