• Publicidad

Arreglos vacíos

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Arreglos vacíos

Notapor dthhack » 2012-02-22 14:47 @657

Bueno, mi problema es el siguiente: encontré un crawling web en Perl en el foro, el cual lo que quiero hacer es que cada URL que obtenga la guarde en un arreglo; así llenar cada posición del arreglo con una URL.

También sería hacer un arreglo dinámico en Perl, que me diga si encontró 20 URL que se detenga el llenado del arreglo.


ESTE ES EL SCRIPT DEL CRAWLING:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use LWP::UserAgent;
  2. use HTML::LinkExtor;
  3. my @urls = ('http://127.0.0.1/');
  4. my %visited;
  5. my $browser = LWP::UserAgent->new();
  6. $browser->timeout(5);
  7.  
  8. while (@urls) {
  9.   my $url = shift @urls;
  10.  
  11.   next if $visited{$url};
  12.  
  13.   my $request = HTTP::Request->new(GET => $url);
  14.   my $response = $browser->request($request);
  15.  
  16.   if ($response->is_error()) {print $response->status_line, "\n";}
  17.   my $contents = $response->content();
  18.  
  19.   $visited{$url} = 1;
  20.  
  21.   my ($page_parser) = HTML::LinkExtor->new(undef, $url);
  22.   $page_parser->parse($contents)->eof;
  23.   my @links = $page_parser->links;
  24.  
  25.   foreach my $link (@links) {
  26.         next if $$link[2] !~ /127.0.0.1/;
  27.         print "$$link[2]\n";
  28.         push @urls, $$link[2]; 
  29.   }
  30.   sleep 1;
  31. }
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


Gracias...
dthhack
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-02-22 14:24 @642

Publicidad

Re: Arreglos vacíos

Notapor explorer » 2012-02-22 16:35 @732

El "llenado" del arreglo se suele hacer con un push(), como ves en la línea 28.

Si quieres que pare cuando llegue a 20, se puede insertar la siguiente línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         last if @urls == 20;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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

Re: Arreglos vacíos

Notapor dthhack » 2012-02-23 15:26 @684

Ok, gracias, ya lo pude solucionar. Ahora me falta una cosilla más, si me puedes ayudar. Bueno, las URL obtenidas se van a agregar a un archivo de texto. ¿Cómo hacer que el archivo me guarde las URL hacia abajo pero de la forma que se abra el archivo y me guarde una, luego se abra y me guarde la siguiente, así sucesivamente pero sin que me sobreescriba la URL anterior?

Gracias.
dthhack
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-02-22 14:24 @642

Re: Arreglos vacíos

Notapor explorer » 2012-02-23 22:50 @993

Te basta con abrir el archivo de salida con el modo de "agregar al final", ('>>'), en lugar de solo "escribir" ('>').
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

Re: Arreglos vacíos

Notapor dthhack » 2012-02-24 07:54 @371

Gracias, master, por la ayuda; me funcionó bien...
dthhack
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-02-22 14:24 @642

Re: Arreglos vacíos

Notapor dthhack » 2012-02-24 13:44 @614

Maestro, tengo otra consultilla sobre esta parte del código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  next if $$link[2] !~ /127.0.0.1/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Eso está bien pero si yo quisiera poner una URL más larga como esta: http://127.0.0.1/XAMPP/Test/ debería quedar así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. next if $$link[2] !~ /127.0.0.1\/XAMPP\/Test\//;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Con esa funciona bien, pero mi problema es el siguiente: hice que me pidiera la URL para el crawling, luego modifico el código next if $$link[2] !~ /Url-para-Crawling/;...

Pero me gustaría saber cómo hacerlo para no estar siempre modificando el código, si hay alguna expresión que me tome la misma URL ingresada para el crawling y la modifique como se requiere en el next... Si hay alguna forma que me pueda ayudar lo agradecería muchísimo.

Gracias.
dthhack
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-02-22 14:24 @642

Re: Arreglos vacíos

Notapor explorer » 2012-02-24 18:59 @832

Pues si algo es variable, eso significa que debemos guardarlo en una variable...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $URL = <>;     # leemos la URL por el teclado o entrada estándar
  2. chomp $URL;       # quitamos el retorno de carro
  3.  
  4. ...;
  5.  
  6.     next if $$link[2] !~ /$URL/;       # salta a la siguiente si el enlace no concuerda con la $URL buscada
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Humm... aquí tengo una duda... no sé si estará bien... Quizás haya que escapar el contenido de $URL antes de meterla en la expresión regular.

Cuestión de probar...
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

Re: Arreglos vacíos

Notapor dthhack » 2012-02-28 09:43 @446

La última cosa. Por ejemplo, en código me guarda como 6 veces la misma URL. ¿Cómo podré hacer que solo me guarde solo una en el archivo.log?

Si comento esta instrucción
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. push @urls, $$link[2];
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
me guarda solo una URL pero no me hace el crawling a los demás directorios que contiene la web, pero si no la comento me hace el crawling como debe ser pero me guarda repetitivas veces una misma URL.

Si me puede dar una ayudita más, por favor... Gracias.

ESTE ES EL CÓDIGO DONDE SE GENERA EL REPORTE:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.           foreach my $link (@links)
  2.           {
  3.                 next if $$link[2] !~ /$ver/;
  4.                 my $contenido = get ($$link[2]);
  5.                         $contok++;
  6.                         print "-> OK  [   FOUND   ] $$link[2]\n";
  7.                         push @urls, $$link[2];
  8.                         $registro=join("\n",$$link[2]);
  9.                         open(reporte,">> URL.log");
  10.                         print reporte $registro;
  11.                         print reporte "\n";
  12.                         close (reporte);
  13.           }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
dthhack
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-02-22 14:24 @642

Re: Arreglos vacíos

Notapor explorer » 2012-02-28 10:07 @463

Si el objetivo es tener los URL una sola vez, entonces esa es misión de un hash.

Antes de hacer el push(), debes comprobar si existe $visto{$$link[2]}. Si no existe, pues hace el push() y actualizas el valor de %visto.
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

Re: Arreglos vacíos

Notapor dthhack » 2012-02-29 09:44 @447

Así está el código pero para comprobar con hash $visto{$$enlace[2]} ¿con qué lo comparo? Para verificar si existe o ¿hay que darle algún valor a $visto? Porque yo pensaba hacerlo con un array pero no me funciona, y además lo estaba usando de este modo exists $visto{$$enlace[2]}; arriba del $contok++;.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach my $link (@links) {
  2.     next if $$link[2] !~ /$ver/;
  3.     my $contenido = get( $$link[2] );
  4.  
  5.     if ( ( $contenido =~ m/lo_que_se_busca/ ) and ( $contenido =~ m/lo_que_se_busca/ ) ) {
  6.         $contok++;
  7.         print "    -> OK  [   FOUND   ] $$link[2]\n";
  8.         push @urls, $$link[2];
  9.         $registro = join( "\n", $$link[2] );
  10.         open( reporte, ">> FOUND.log" );
  11.         print reporte $registro;
  12.         print reporte "\n";
  13.         close(reporte);
  14.  
  15.     }
  16.     else {
  17.         $contnot++;
  18.         print "    -> NOT [ NOT FOUND ] $$link[2]\n";
  19.         push @urls, $$link[2];
  20.         $registro = join( "\n", $$link[2] );
  21.         open( noreporte, ">> NOT-FOUND.log" );
  22.         print noreporte $registro;
  23.         print noreporte "\n";
  24.         close(noreporte);
  25.     }
  26. }
  27.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Gracias... Disculpen las molestias. ¡Je!
dthhack
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-02-22 14:24 @642

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron