• Publicidad

Web Spider

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Web Spider

Notapor esse » 2008-12-31 00:29 @062

Buenas, me presento, es mi primer post, y estoy aprendiendo Perl por mi cuenta ;)

Estoy realizando un programa que se le dé una web y baje todo el código fuente para visualizarlo sin conexión web. Ya obtengo links e imágenes; con el módulo LinkExtor se me hizo más sencillo; ya descargo las imágenes con otro módulo.

Si me pudieran ayudar en lo siguiente: si tengo una url como: http://www.google.com.mx/intl/es_mx/images/logo.gif

Solo obtener las carpetas para poder crearlas y descargar la imagen dentro.

Una última pregunta. ¿Hay algún módulo para descargar archivos, como pdf, swf, doc etc?

De antemano muchas gracias ;)

Si se les hace más fácil, que suba el código que ya tengo solo díganme :)
esse
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2008-12-31 00:15 @052

Publicidad

Notapor explorer » 2008-12-31 01:07 @088

Bienvenido a los foros de Perl en Español, esse.

Para bajar ficheros por HTTP no necesitas ningún módulo especial. Solo tienes que solicitarle al servidor web cada fichero que quieras bajar.

Incluso con un módulo tan sencillo como LWP::Simple te vale para bajar cualquier fichero:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use LWP::Simple;
$fichero = get('http://www.google.com.mx/intl/es_mx/images/logo.gif');
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


En CPAN hay algunos spiders y crawlers, como por ejemplo WWW::Spyder y Gungho.

Quizás sea WWW::Mechanize el sistema más completo para visitar una web, aunque la mayoría de los usuarios, en vez de usar Perl, usan wget.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor esse » 2008-12-31 15:26 @684

Muchas gracias por su respuesta.

Ya que tengo el archivo con get(), ¿cómo lo guardo en un fichero local?

Con las carpetas ¿hay alguna manera de crear un árbol completo? Por ejemplo, si tengo /imagenes/banner/publicidad/ que se cree una carpeta dentro de otra.

Y ¿cómo guardo la imagen dentro de esas carpetas?, ya que si guardo un archivo lo guarda en el directorio desde donde ejecuté el programa.

Gracias.
esse
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2008-12-31 00:15 @052

Notapor explorer » 2008-12-31 15:43 @697

El fichero lo guardas con un open(), print() y close().

Se puede crear un árbol entero con la función mkpath() del módulo File::Path.

Y para guardar un fichero allí dentro solo tienes que agregar el camino delante del fichero, en el open().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor esse » 2009-01-04 17:06 @754

Buenas, gracias a tu ayuda busqué sobre el módulo WWW:Mechanize y se me ha hecho más fácil, ya que tiene un método para buscar todos los links.

Pero surgió otra duda :oops: ¿hay alguna forma de sumar arreglos? Es que por ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$mech = WWW::Mechanize->new(autocheck =>1);
$mech->agent_alias( 'Windows IE 6');
$mech->get("http://www.google.com.mx");
die "cannot get the page: ", $mech->response->status_line
    unless $mech->success;
@links = $mech->find_all_links(
        tag => "a",                          # Busco TODOS los Links
    );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Obtengo todos los links, de ahí quiero descargarlos todos, pero hay que modificar las rutas... es decir, si en el código fuente está el link a imágenes "http://images.google.com.mx" modificarlos por el nombre de archivo en el que lo descargué. Estoy usando números (1.html, 2.html...etc), pero la cosa se complica cuando quiero una profundidad de escaneo... por la recursividad del método que obtiene el código fuente... no sé si me expliqué (en caso de que no, díganme, limpio un poco mi código y lo subo todo).

Entonces sería más fácil, si puedo navegar dentro de todos los links e ir extrayendo todos los links de cada link :S y guardarlos todos en un solo arreglo; el problema es que cada vez que llamo al método find_all_links(), el arreglo se inicializa :(

Espero puedan ayudarme, gracias.
esse
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2008-12-31 00:15 @052

Notapor esse » 2009-01-04 17:45 @781

Leí las funciones de los array y encontré push() :lol: y ya pude sumarlos. ¿Ahora? ¿hay una forma de eliminar elementos repetidos? es que los links se repiten :S
esse
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2008-12-31 00:15 @052

Notapor explorer » 2009-01-04 22:34 @982

Para eso sirven los hash.

En cuanto a lo del Spider, veo que el módulo WWW::CheckSite::Spider usa el método de ir guardando en un pila los enlaces que todavía no ha visitado (método new_stack() del módulo WWW::CheckSite::Util).

Podrías hacer lo mismo... guardarlos en una estructura de datos global, para luego irlos recuperando. Podrías meterlos con push() e irlos sacando con shift().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados