• Publicidad

Cómo extraigo enlaces de Google

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Cómo extraigo enlaces de Google

Notapor erv-Z » 2009-08-17 21:29 @937

Buenas, quisiera saber qué módulo debo ocupar para extraer links de Google y cómo funciona dicho módulo.

Saludos.
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Publicidad

Re: Cómo extraigo enlaces de Google

Notapor explorer » 2009-08-18 03:55 @204

Bienvenido a los foros de Perl en Español, erv-Z.

Google tiene muchos servicios de los que se pueden sacar enlaces. No has dicho qué servicio quieres usar. De momento, aquí tienes unos cuantos módulos.

Ten también en cuenta que algunos servicios requieren que te des de alta como desarrollar o como usuario autorizado de su API. Y que está limitado el número de peticiones diarias que puedes hacer. Si no, podrían bloquearte el servicio o limitarlo en cuanto a información o tráfico.
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: Cómo extraigo enlaces de Google

Notapor erv-Z » 2009-08-22 11:26 @518

Mira, este es un buscador que hice, pero no funciona bien, no sé por qué. A ver si me podéis decir cuál es mi error.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use LWP::UserAgent;
  2. use HTTP::Request;
  3. use LWP::Simple;
  4.  
  5. print "Modo de uso:\n";
  6. print "Perl name.pl <busqueda> <numeros de paginas>\n";
  7. print "perl name.pl inurl:noticias.php?id=1 50\n";
  8.  
  9. my $ua = new LWP::UserAgent;
  10. $ua->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12");
  11.  
  12. for($i=1;$i<$ARGV[1];$i++){
  13.  my $busqueda = new HTTP::Request GET =>"http://www.google.es/#q=".$ARGV[0]."&hl=es&start=".$i."&sa=N&fp=";
  14. my $resultado = $ua->request($busqueda);
  15. $ua->timeout(7);
  16. my $result = $resultado->content;
  17.  
  18. while ($result =~ m/<h2 class=(.*?)><a href=\"(.*?)\" class=(.*?)>/g){
  19. my $sites=$result;
  20.  
  21. print $sites\n;
  22. }
  23. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2009-08-22 16:44 @739, editado 1 vez en total
Razón: Ortografía
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Cómo extraigo enlaces de Google

Notapor netsoul » 2009-08-22 12:49 @575

A ver... No olvides de usar use strict y use warnings para ver qué errores hay. ¿Por qué usas LWP::Simple si ya tienes HTTP::Request y LWP::UserAgent?. Además creo que Google no soporta LWP::Simple, (no sé).

Hay bastantes módulos que hacen el trabajo para lo que quieras hacer. ;)

Si quieres hacer por medio de HTTP::Request, doy una pista, en el request que haces a Google tiene la cadena /#q=, y no el clásico /search?hl=es&source=hp&q=
With Perl
Imagination is more important than knowledge. Albert Einstein.
netsoul
Perlero nuevo
Perlero nuevo
 
Mensajes: 150
Registrado: 2008-05-04 01:11 @091

Re: Cómo extraigo enlaces de Google

Notapor erv-Z » 2009-08-22 13:21 @597

Ok, man, hice algunos arreglos e hice una búsqueda automática, a ver si funciona, pero nada.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use LWP::UserAgent;
  2. use HTTP::Request;
  3.  
  4. my $ua = new LWP::UserAgent;
  5. $ua->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12");
  6.  
  7.  
  8. my $busqueda = new HTTP::Request GET =>"http://www.google.es/search?hl=es&q=ola&start=50&sa=N";
  9. my $resultado = $ua->request($busqueda);
  10. $ua->timeout(7);
  11. my $result = $resultado->content;
  12.  
  13. while ($result =~ m/<h2 class=(.*?)><a href=\"(.*?)\" class=(.*?)>/g){
  14. my $sites=$result;
  15.  
  16. print $sites\n;
  17. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2009-08-22 16:46 @740, editado 1 vez en total
Razón: Ortografía
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Cómo extraigo enlaces de Google

Notapor netsoul » 2009-08-22 13:28 @602

Mmmm... a ver... ¿Has revisado la expresión regular?. :wink:

En la línea 16 tienes un error de concatenación. ;)
With Perl
Imagination is more important than knowledge. Albert Einstein.
netsoul
Perlero nuevo
Perlero nuevo
 
Mensajes: 150
Registrado: 2008-05-04 01:11 @091

Re: Cómo extraigo enlaces de Google

Notapor erv-Z » 2009-08-22 13:48 @616

¿Y qué debería ir en la línea 16 y por qué?
Última edición por explorer el 2009-08-22 16:49 @742, editado 1 vez en total
Razón: Ortografía
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Cómo extraigo enlaces de Google

Notapor ubuntu » 2009-08-22 13:52 @619

Buenas

supongo que netsoul quiso decir esto

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print $sites\n;
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


por esto otro :

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "$sites\n";
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


si me equivoco corregirme, saludos.
Avatar de Usuario
ubuntu
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2009-08-19 07:30 @354

Re: Cómo extraigo enlaces de Google

Notapor netsoul » 2009-08-22 14:09 @631

Hay un hilo que podría ayudar.
With Perl
Imagination is more important than knowledge. Albert Einstein.
netsoul
Perlero nuevo
Perlero nuevo
 
Mensajes: 150
Registrado: 2008-05-04 01:11 @091

Re: Cómo extraigo enlaces de Google

Notapor explorer » 2009-08-22 17:40 @778

El programa no funciona porque Google ha cambiado la forma de responder, el código HTML de las páginas de búsqueda.

Un extracto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
<h3 class=r><a href="http://www.microsiervos.com/archivo/peliculas-tv/ola-gigante-filmada-desde-abajo.html" class=l onmousedown="return clk(this.href,'','','res','57','')">
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Por eso, la condición del while() siempre falla y no saca nada.

Tendrías que modificar la expresión regular para capturar esos nuevos enlaces.

Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use LWP::UserAgent;
  3. use HTTP::Request;
  4.  
  5. my $ua = new LWP::UserAgent;
  6. $ua->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12");
  7.  
  8. my $busqueda = new HTTP::Request GET =>"http://www.google.es/search?hl=es&q=ola&start=50&sa=N";
  9. my $resultado = $ua->request($busqueda);
  10. $ua->timeout(7);
  11. my $result = $resultado->content;
  12.  
  13. while ($result =~ m/<h3 class=.*?<a href="([^"]+).*?>(.*?)<\/a>/g) {
  14.     my ($enlace, $texto) = ($1, $2);
  15.     print "$enlace - $texto\n";
  16. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


que queda más corto así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use LWP::Simple qw($ua get);
  6.  
  7. $ua->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12");
  8.  
  9. my $resultado = get("http://www.google.es/search?hl=es&q=ola&start=50&sa=N");
  10.  
  11. while ($resultado =~ m/<h3 class=.*?<a href="([^"]+).*?>(.*?)<\/a>/g) {
  12.     my ($enlace, $texto) = ($1, $2);
  13.     print "$enlace - $texto\n";
  14. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero, para hacer Web scraping, prefiero WWW::Mechanize:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use WWW::Mechanize;
  6.  
  7. my $mech = WWW::Mechanize->new();
  8.  
  9. $mech->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12");
  10.  
  11. $mech->get("http://www.google.es/search?hl=es&q=ola&start=50&sa=N");
  12.  
  13. my @enlaces = $mech->find_all_links( class => 'l' );
  14.  
  15. for my $enlace (@enlaces) {
  16.     print $enlace->url() , " : ";
  17.     print $enlace->text(), "\n";
  18. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


De todas formas, lo correcto es lo indicado al final por netsoul: usar un módulo concreto para Google.
Última edición por explorer el 2009-08-22 17:45 @781, editado 2 veces en total
Razón: Typo, estilo
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

Siguiente

Volver a Intermedio

¿Quién está conectado?

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

cron