Ejemplos o tutorial para hacer scraping / crawling PHP .

padawanluke Seguir

Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
24 Jun 2013
Mensajes
96
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.
 

ElGranTest

Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
20 Mar 2014
Mensajes
63
É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.
 

Geophertz

Beta
Programador
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
24 Jun 2014
Mensajes
67
No creo que te haga falta emplear ningún framework, puedes hacerlo utilizando la función cURL de PHP.
 

padawanluke

Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
24 Jun 2013
Mensajes
96
Muchas gracias a todo, realmente me va a servir de mucho .

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

Gracias gente !!!.
 

padawanluke

Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
24 Jun 2013
Mensajes
96
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 .
 

Chapi

Delta
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
Desde
2 Ago 2011
Mensajes
618
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);
 

luishdez

Beta
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
5 Jun 2014
Mensajes
32
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.
 

xaiborweb

Programador
No recomendado
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
¡Feliz cumpleaños!
Desde
4 Dic 2012
Mensajes
1.049
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;

?>
 

alexander171294

Delta
SEO
Desde
7 Abr 2013
Mensajes
590
Por favor, ten en cuenta 📝 que si deseas hacer un trato 🤝 con este usuario, está baneado 🔒.
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!
 

animatrionix

Gamma
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
6 Mar 2012
Mensajes
183
Hola... busca información acerca de las funciones preg_match y preg_match_all... y curl... eso necesitas para escrapear una web... ^_^
 

lucho1592

Zeta
Social Media
Desde
21 Ene 2014
Mensajes
1.958
Por favor, ten en cuenta 📝 que si deseas hacer un trato 🤝 con este usuario, está baneado 🔒.
Graciasss

Enviado desde mi SM-G530M mediante Tapatalk
 

xaiborweb

Programador
No recomendado
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
¡Feliz cumpleaños!
Desde
4 Dic 2012
Mensajes
1.049
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 ?
 

animatrionix

Gamma
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
6 Mar 2012
Mensajes
183
Hola... yo conozco bastante sobre este tema... enviame mp y te ayudo.
 

xaiborweb

Programador
No recomendado
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
¡Feliz cumpleaños!
Desde
4 Dic 2012
Mensajes
1.049
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
 

turcios

Dseda
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Desde
26 Mar 2015
Mensajes
1.183
es posible usando la librería simplehtmldom.sourceforge.net
 
Arriba