• Publicidad

Problema al descargar página web

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

Problema al descargar página web

Notapor vematom » 2010-09-26 04:39 @235

Algunas páginas web (especialmente las que tienen vínculos a series o películas) están llenas de publicidad y tienes que tocar muchas veces al ratón hasta llegar a donde quieres. Por eso me planteé escribir una aplicación Perl que me permita extraer los enlaces de una página web, para luego "aislar" específicamente los que me interesan. Para comenzar escribí lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use warnings;
  3. use LWP::Simple;
  4. use HTML::SimpleLinkExtor;
  5.  
  6. my ($html,$extor,@all_links,$file);
  7. $file="/home/turcga/prueba.html";
  8. $html=("http://www.seriesyonkis.com/");
  9. getstore ($html,$file);
  10. #$extor = HTML::SimpleLinkExtor->new();
  11. #$extor->parse($html);
  12. #@all_links   = $extor->links;
  13. #print join "\n" , @all_links;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Cuando visualizo $file me encuentro con la página inicial de Google, ¿por qué? ¿Es algún tipo de protección anti-robots de la mencionada página? Cuando uso otras direcciones web funciona sin problemas.

Pues parece ser que sí, que la página web a la que intento acceder de alguna forma comprueba qué navegador la está visitando. Usé el siguiente código copiado de Internet:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.   use LWP::UserAgent;
  2.   my $ua = LWP::UserAgent->new;
  3.   $ua->agent("MyApp/0.1 ");
  4.   my $req = HTTP::Request->new(POST => 'http://www.seriesyonkis.com/');
  5.   $req->content_type('application/x-www-form-urlencoded');
  6.   $req->content('query=libwww-perl&mode=dist');
  7.   my $res = $ua->request($req);
  8.   if ($res->is_success) {
  9.       print $res->content;
  10.   }
  11.   else {
  12.       print $res->status_line, "\n";
  13.   }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y obtengo un "301 Moved Permanently", pero si modifico el nombre del useragent, por ejemplo $ua->agent("Mozilla"); funciona perfectamente. También funciona bien si escribo "MyApp/0.1" (o sea, sin el último espacio) ¿Alguien puede verter algo de luz en este misterio?
vematom
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-09-02 15:40 @694

Publicidad

Re: Problema al descargar página web

Notapor explorer » 2010-09-26 09:57 @456

Efectivamente, algunas páginas tienen un sistema para intentar detectar que las peticiones vengan de un sistema automático, en lugar de un ser humano.

No les gusta que sea de forma automática, porque estos sitios, normalmente, viven de la publicidad que insertan en sus páginas. Y la publicidad es solo efectiva si la ve un ser humano, claro.

Y, sí, una solución es la de "falsear" el campo del nombre del agente que está haciendo la petición web, pero solo funcionará en determinados sitios web. En otros, la protección es mucho mayor.
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

pagina con javascript

Notapor vematom » 2010-09-27 14:43 @655

He seguido con mi intento de crear una aplicación en Perl que me descargue los enlaces "limpios" de Megaupload para bajarme series de la página seriesyonkis.com, y por lo tanto evitar la publicidad.

He escrito lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.   use LWP::UserAgent;
  2.   use HTML::SimpleLinkExtor;
  3.  
  4.   my $ua = LWP::UserAgent->new;
  5.   $ua->agent("Mozilla");
  6.   my $req = HTTP::Request->new(POST => 'http://www.seriesyonkis.com/temporada/como-conoci-a-vuestra-madre/191/');
  7.   my $res = $ua->request($req);
  8.   $extor = HTML::SimpleLinkExtor->new();
  9.   $extor->parse($res->content);
  10.   @all_links   = $extor->links;
  11.   foreach $all_links(@all_links) {if ($all_links=~ /capitulo-/){push (@enlaces,$all_links)}}
  12.  
  13.   foreach  $enlaces(@enlaces)
  14.      {my $req = HTTP::Request->new(POST => $enlaces);
  15.       my $res = $ua->request($req);
  16.       $extor = HTML::SimpleLinkExtor->new();
  17.       $extor->parse($res->content);
  18.       @links   = $extor->links;
  19.       foreach $links(@links) {if ($links=~ /\/descargar/)
  20.          {push (@enlaces1,$links);last}}}
  21.   print join "\n" , @enlaces1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo que hago es, 1º, me conecto a la página web donde está la primera temporada de esta serie y extraigo todos los enlaces de la misma. 2º, recorro el array de enlaces y guardo en el array @enlaces los que contengan "capitulo-". 3º, visito cada uno de esos vínculos, extraigo todos los enlaces de cada uno y guardo en el array @enlaces1 los vínculos de descarga de cada capítulo. El last() de la penúltima línea es porque hay varios vínculos de descarga con varios idiomas y solo me interesa el primero (español).

Al llegar a este punto ya tengo en el array @enlaces1 todos los vínculos de la primera temporada de esta serie y se supone que al visitar cada uno, obtendré el esperado enlace final a la página de MegaUpload que contiene cada uno de ellos, pero... al cargar esa última página no encuentro los enlaces a MegaUpload. Cuando cargo esta última página con mi navegador Firefox y uso la opción "ver código fuente" veo lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <html><head><title>Descargar video de megaupload</title><script type="text/javascript" src="../../n.js"></script></head>
  2. <body>
  3. <script type="text/javascript">sy1();</script>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si no me equivoco, la página se genera ejecutando el código JavaScript que se encuentra en "../../n.js".

¿Qué puedo hacer para cargar esta última página y poder así extraer los deseados vínculos?

No sé si me he explicado bien, espero que se me entienda. Por último, si bien lo que he escrito "funciona" ¿sobra alguna línea? ¿se podría hacer de una forma más elegante y/o efectiva? Una última pregunta: al enviar el código que escribimos ¿qué es preferible, el corta y pega que he hecho o adjuntar el fichero *.pl?

Por si es de utilidad para responder, los vínculos a la última página que se obtienen son como el siguiente:
http://www.seriesyonkis.com/lista-series/descargar/n/%C8%C9%C8%A4%B7%AA%CD%CE/?id=%C8%C9%C8%A4%B7%AA%CD%CE
¿serán todos esos caracteres parámetros que utiliza la aplicación JavaScript para cargar la página adecuada?
vematom
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-09-02 15:40 @694

Re: Problema al descargar página web

Notapor explorer » 2010-09-27 15:06 @671

Y... ¿cómo vas a pasar la prueba del captcha que MegaUpload pone en todas las páginas de descarga? ¿O ya eres usuario Premium?

Desde Perl es complicado ejecutar código de JavaScript de una página web. Ten en cuenta que ese código debería ser ejecutado por un navegador web.

Existen módulos que pueden ejecutar JavaScript, pero nunca he sido capaz de hacerlo funcionar correctamente.

En los casos extremos, lo mejor es gobernar un navegador web, a distancia, desde Perl, como por ejemplo, WWW::Mechanize::Firefox.

Lo que yo hacía era analizar el código JavaScript, para ver si llegaba a algún vínculo o construía la página de forma especial. En muchos casos, se podía saltar la protección del primer JavaScript y llegar al último enlace. Hoy en día puede ser algo endiablado. Y además, hay un captcha, que hay que descifrar.

Los códigos Perl es mejor publicarlos en el propio mensaje. Solo adjuntarlos cuando sean muy grandes (>300 líneas).
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: Problema al descargar página web

Notapor vematom » 2010-09-27 15:23 @682

Hay una aplicación (sé que funciona en Windows, no sé si la hay para Linux) que se llama Jdownloader. Le puedes suministrar n vínculos de MegaUpload, RapidShare, etc... y él solo se encarga de los captchas (no sé cómo lo hace) e incluso te resetea el router solita para que cambies de dirección IP cuando has alcanzado el tope de descarga para una de esas páginas. Es una maravilla.

Con respecto al JavaScript, si a tí te ha resultado difícil yo no lo voy ni a mirar. A lo mejor a través de lo del Mechanize::Firefox puedo llegar, pero si no es así, con el punto al que he llegado me ahorro un montón de tiempo visitando páginas web y chupándome publicidad estática, ventanas emergentes, etc...

Gracias.
vematom
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2010-09-02 15:40 @694

Re: Problema al descargar página web

Notapor explorer » 2010-09-27 15:36 @692

Yo, para evitar publicidad y ventanas emergentes, suelo usar Firefox con el complemente AdBlockPlus. Y para las descargas, yo uso el complemento SkipScreen. No elimina el captcha ni automatiza la bajada múltiple de ficheros, pero ahorra bastante tiempo para bajar unos pocos ficheros.

No he probado ningún complemento más de los 64 disponibles para Firefox. Pero... no creo que ninguno de ellos llegue a las prestaciones del programa que indicas (tampoco he mirado mucho :) )

Lo mejor... buscar a otra persona que lo haga por ti ;) (yo ya encontré a uno :D )
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 Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado