Ejemplos o tutorial para hacer scraping / crawling PHP .

  • Autor Autor padawanluke
  • Fecha de inicio Fecha de inicio
P

padawanluke

Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Que tal, necesito hacer scraping o crawling como lo conozcan con php, algo simple buscar los titulos y precio de productos de una web paginada .
El tema es que lo necesito hacer rapido, estuve viendo ejemplo y frameworks, pero si alguno sabe de algun tuto o ejemplo, o mejor algun framework facil de implementar me seria de gran ayuda.
No estoy pidiendo que me hagan el codigo, solo si saben de algun recurso web que ya conozcan que funca bien.

Saludos.
 
Échale un vistazo a esta herramienta. https://www.kimonolabs.com/


A mi me ha salvado en unas cuantas ocasiones.

Te lo instalas como extensión en el navegador y seleccionas aquello que quieres scrapear con el ratón. Es a prueba de tontos.

Puedes indicarle incluso los botones de paginación.

Hasta aquí se puede hacer todo sin ningún conocimiento de nada.

Luego los datos extraídos te los puedes descargar desde su web en Json,csv y xml creo, o hacer una consulta desde tu propio código PHP al API que te han generado y obtener la respuesta en estos mismos formatos.
 
No creo que te haga falta emplear ningún framework, puedes hacerlo utilizando la función cURL de PHP.
 
Muchas gracias a todo, realmente me va a servir de mucho .

Voy a ver los tutoriales , e intentar hacerlo con CURL .

Gracias gente !!!.
 
Que tal gente, bueno estuve probando pero no logro hacerlo andar al crawler , creo que le estoy fallando en las expresiones regulares, paso el codigo para que me ayuden a ver en que le estoy pifiando .

Es un ejemplo muy simple, quiero extraer el nombre de la seccion de un articulo de un diario online.

PHP:
<?php 
$ch = curl_init();

curl_setopt($ch,CURLOPT_URL,'http://www.clarin.com/mundo/Gobierno-violencia-Gaza-asesinados-conflicto_0_1178282536.html');
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0');
curl_setopt($ch,CURLOPT_HTTPHEADER,array("Accept-Language: es-es,en"));
curl_setopt($ch,CURLOPT_TIMEOUT, 10);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);	

//Guardar pagina
$result = curl_exec($ch); 
curl_close($ch); //Cerramos la conexion CURL.

//Saco la seccion
preg_match_all("(<div class=\"nav-tags-titulo\"><h2>(.*)</h2></div>)siU", $result, $matches1);

$section = $matches1[1][0];
echo "Seccion: " . $section;

la variable $matches1 esta vacia, efectivamente es un array asi que creo que vuelca vacio le preg_match_all pero no me trae el titulo de la seccion.
El codigo html donde quiero buscar es exactamente este:
HTML:
<div class="nav-tags-titulo"><h2>mundo</h2></div>

En donde lo que quiero extraer es la palabra "mundo" , y no lo puedo lograr, sigo investigando porque imagino que peude ser el tema de las expresiones regulares que no las conozco muy bien, aunque bien podria ser algunos de los parametros que les pase al curl, pero no sabria en este momento en donde estoy fallando .

Gracias .

- - - Actualizado - - -

Gente encontre el problema, yo habia quitado los espacios y los saltos de linea, el preg_match_all se fija en eso, asi que reemplase

PHP:
preg_match_all("(<div class=\"nav-tags-titulo\"><h2>(.*)</h2></div>)siU", $result, $matches1);

Por esto:

PHP:
preg_match_all("(<div class=\"nav-tags-titulo\">
            <h2>(.*)</h2>
        </div>)siU", $result, $matches1);

Y funciono correctamente.

Bueno seguire investigando y probando .
 
Insertar CODE, HTML o PHP:
preg_match_all("(<div class=\"nav-tags-titulo\">
            <h2>(.*)</h2>
        </div>)siU", $result, $matches1);

Tener eso en el codigo es una mugre.

Insertar CODE, HTML o PHP:
preg_match_all('@<div[^>]*class="nav-tags-titulo"[^>]*>.*?<h2>(.*)</h2>.*?</div>@si', $result, $matches);
 
Si quieres un buen consejo ( con respeto no sigas ninguno de esos ejemplos anteriores ).

No uses Regex para parsear DOM ( no debe hacerse ) cualquier cambio atributo nuevo etc hará que deje de funcionar, Además que será complejo de formar y mantener.

Usa una librería ya hecha para parsear DOM, por ejemplo DOM parser que ya trae PHP o (recomendado) https://github.com/fabpot/goutte es una librería que usa Guzzle para scrapping, tiene todas las funciones para parsear DOM, Enviar formularios etc.
 
Que tal gente, bueno estuve probando pero no logro hacerlo andar al crawler , creo que le estoy fallando en las expresiones regulares, paso el codigo para que me ayuden a ver en que le estoy pifiando .

amigo también estoy empezando a trabajar con curl pero copio el ejemplo básico que compartiste y me arroja el siguiente error: https://gyazo.com/5512d90c6cb4696ef2701133521130ed
de casualidad sabes por que puede estar pasando ?

PHP:
<?php
	$ch = curl_init(); 

	curl_setopt($ch,CURLOPT_URL,'http://www.clarin.com/mundo/Gobierno-violencia-Gaza-asesinados-conflicto_0_1178282536.html'); 
	curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0'); 
	curl_setopt($ch,CURLOPT_HTTPHEADER,array("Accept-Language: es-es,en")); 
	curl_setopt($ch,CURLOPT_TIMEOUT, 10); 
	curl_setopt($ch,CURLOPT_FOLLOWLOCATION, 1); 
	curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);     

	//Guardar pagina 
	$result = curl_exec($ch);  
	curl_close($ch); //Cerramos la conexion CURL. 

	//Saco la seccion 
	preg_match_all("(<div class=\"nav-tags-titulo\">
            <h2>(.*)</h2>
        </div>)siU", $result, $matches1);  

	$section = $matches1[1][0]; 
	echo "Seccion: " . $section;

?>
 
Si quieres un buen consejo ( con respeto no sigas ninguno de esos ejemplos anteriores ).

No uses Regex para parsear DOM ( no debe hacerse ) cualquier cambio atributo nuevo etc hará que deje de funcionar, Además que será complejo de formar y mantener.

Usa una librería ya hecha para parsear DOM, por ejemplo DOM parser que ya trae PHP o (recomendado) https://github.com/fabpot/goutte es una librería que usa Guzzle para scrapping, tiene todas las funciones para parsear DOM, Enviar formularios etc.

Ehm, parsear HTML con regex, es la mejor manera de hacerlo sin librerías, pero las regex deben estar bien armadas, esas expresiones regulares que hay aquí son realmente rústicas y como dices a cualquier cambio chau.

Personalmente opino como tu, la mejor manera es utilizar una librería que ya exista y haya sido probada con anterioridad, de modo que te aseguras el buen funcionamiento.

Saludos!
 
Hola... busca información acerca de las funciones preg_match y preg_match_all... y curl... eso necesitas para escrapear una web... ^_^
 
Graciasss

Enviado desde mi SM-G530M mediante Tapatalk
 
Hola... busca información acerca de las funciones preg_match y preg_match_all... y curl... eso necesitas para escrapear una web... ^_^

pero con esas funciones hasta el momento solo e visto como extraer datos específicos ejemplo:
PHP:
preg_match_all("(<title>(.*)</title>)SiU", $html, $mathes1);
     $titulo = $mathes1[1][0];
     echo $titulo;

pero por ejemplo estoy en una pagina y quiero obtener la url, imagen y titulo de cada post no encuentro ejemplos y podrías citar alguno ?
 
Hola... yo conozco bastante sobre este tema... enviame mp y te ayudo.
 
seria excelente que compartieran un ejemplo que entre por todas las url de un sitemap o paginación y saque el titulo, url, imagen de cada post y lo guarder en una base de datos, para poder guiarnos de hay
 
es posible usando la librería simplehtmldom.sourceforge.net
 
Atrás
Arriba