• Publicidad

Cargar página HTML

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

Re: Cargar página HTML

Notapor explorer » 2011-06-11 03:37 @192

Voy a intentar responderte, pero falta mucha información, que solo viendo el servidor se podría resolver.

En vez de URI::URL, es mejor usar URI.

En el primer código, estás construyendo la URL por medio de una función, en la línea 9:

$url->query_form(acciones='agdrfe');

pero lo correcto es hacerlo así:

$url->query_form(acciones => 'agdrfe');

Por eso, no sale luego cuando lo pintas en la línea 13.

Un detalle... las comillas que le ponemos en la línea 9, luego, el módulo URI, las quita en el URL, porque no forman parte de los caracteres que se pueden transmitir de forma directa (hay que codificarlas), aparte, del hecho importante de que se suelen usar para transmitir los valores de los argumentos. Si te fijas en la línea 2 del primer resultado, aparece variable=variable1, sin comillas, ya que no son necesarias.

En el segundo código, en la línea del POST (la 5), estás, incorrectamente, colocando unas comillas simples. Ya hemos dicho que nunca se ponen directamente en el URL. Lo correcto es:

my $req = POST 'http://www.loquesea.com/index.php&acciones=agdrfe',

(He puesto comillas simples en toda la URL porque veo que toda ella es una constante. Si, en cambio, 'agdrfe' fuese una variable Perl -por ejemplo, $accion-, habría que usar comillas dobles)

Lo mismo pasa en la línea 7 del último código: las comillas pueden ser la razón por la que diga que el URL no existe.

Otro detalle, el control de sesiones. En el primer ejemplo, parece que la sesión se controla con el parámetro sid en la URL, pero al mismo tiempo, en la respuesta, está solicitando la grabación de una cookie, donde te está indicando el identificador del servidor a usar. Entonces, además de resolver el problema de acceso, se te plantea el caso de que debes usar módulos que gestionen o envíen cookies.

Por defecto, LWP::UserAgent no usa la jarra de galletas, pero en este caso, sí que la necesitas. En el manual de LWP::UserAgent, viene la línea que debes poner si quieres activar la jarra de galletas:

$ua->cookie_jar({ file => "$ENV{HOME}/.cookies.txt" });

Con esto, se crea un fichero llamado .cookies.txt colgando del raíz de tu directorio principal, donde se guardarán las galletas que reciba y de donde saldrán, en las peticiones. Así, las cookies de sesión o configuración, se transmiten de forma automática.
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

Publicidad

Re: Cargar página HTML

Notapor marcoamoncada » 2011-06-11 10:33 @481

Tu pronta respuesta fue muy rápida y acertada, ya que de los 3 ejemplos que envié nos enfocaremos con el primero, solamente.

Te voy a decir sobre el ejemplo número 2, si yo quito la dirección desde '?' hasta el final, no hay problema, pero cuando intento me da que no existe, con seguridad la dirección o no, muy independiente que tenga o no tenga comillas. Y creo haber descubierto que es por el '=', pero solo enfoquémonos al numero 1. Gracias por auxiliarme en este ejemplo.

La dirección esta en un servidor digamos que infranet, y solamente se puede entrar a el, desde ciertas localidades, por que, no son todas, en varios países. La dirección es http://www.huevoscalibales.cm/index.php, por eso no lo vi muy necesario nombrarlo.

En el ejemplo Prueba-7.pl, aunque van más, pero nombrémoslo así, el código fuentes es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. # GET method form
  3. use HTML::TreeBuilder;
  4. use HTML::FormatText;
  5. use LWP::Simple;
  6. use URI::URL;
  7.  
  8. $url=url("http://www.huevoscalibales.cm/index.php");
  9. $url->query_form(acciones=>'agdrfe');
  10. #$content=get($url);
  11. #print $content;
  12.  
  13. print "Url        :",$url,"\n";
  14.  
  15. # POST method form
  16. use HTTP::Request::Common qw(POST);
  17. use LWP::UserAgent;
  18.  
  19. $ua=LWP::UserAgent->new();
  20. $ua->cookie_jar({ file => "$ENV{HOME}/.cookies.txt" });
  21. my $req= POST $url, [user=>'????????',password=>'????????????'];
  22. $content=$ua->request($req)->as_string;
  23. print $content;
  24.  
  25. my $inicio=index($content, 'Location') + 10;
  26. my $fin=index($content, 'amover_si_fuerz=2') - $inicio + 17;
  27. print "inicio: $inicio fin: $fin \n";
  28. my $fragmento = substr $content, $inicio, $fin;
  29. $fragment=get($fragmento);
  30. print "fragment: <$fragmento>\n";
  31. print $fragment;
  32.  
  33.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


En esta línea está como lo nombraste, no recuerdo por qué, en el foro le quité el >. Sería un dedo check.$url->query_form(acciones=>'agdrfe');

La línea que me has mencionado de la cookie no sé dónde ponerla porque lo he probado en muy diferentes lugares, y cuando mando a desplegar la página, al final, me dice que la sesión ha caducado. He detectado que se firma, pero no logra abrir más páginas por el sitio, y necesito hacerlo para capturar la información.

No sé si pudieras auxiliarme.

He buscado infinidad de páginas en la web, y aún no hallo la respuesta.

Son capturas sumamente sencillas, y muy repetitivas, así que en el trabajo me han solicitado, que eso se haga en forma automática, y estoy algo atrasado, porque, solamente se da una cantidad, y se le da clic, y otra más. Lleva mucho tiempo hacer eso.

Gracias.
marcoamoncada
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2011-06-06 22:41 @986

Re: Cargar página HTML

Notapor explorer » 2011-06-11 11:36 @525

Yo, para recoger información de la web, suelo usar Scrappy o WWW::Mechanize.

Ellos se encargan de la gestión de las cookies de forma automática (bueno, hay que decirles que usen cookies).

La línea tuya del cookie jar está en el sitio correcto.

El tema de la sesión: debes guardar tanto las cookies (lo hará LWP::UserAgent) como el valor de sid, que debes asegurarte de que se lo pasas por la URL. Si sí lo haces y no funciona, quizás hay que mirar otros sitios.

Por ejemplo, a veces, se dejan variables de sesión en los <form>, dentro de campos <input> de tipo hidden, dentro del código HTML de la página.
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: Cargar página HTML

Notapor marcoamoncada » 2011-06-11 23:11 @008

Eso creí, que le faltarían inputs que estén escondidos, pero creé una pagina que solamente pide el usuario y el password, y la página abre.

Entonces, yo creo que por ese lado no es problema.

De hecho, la página abre, pero lo que yo quiero es poder ver el código HTML, para modificar los datos y mandar la página que los acepte.

Esas dos opciones de Scrappy, y el otro, no lo pude abrir porque, solicita que esté otros elementos instalados, lo cual busqué en Internet pero no los hallo, como por ejemplo

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl Php/Prueba/perl/Prueba-1.pl
  2. Can't locate Scrappy.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at Php/Prueba/perl/Prueba-1.pl line 2.
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4



De todos modos los estaré buscando a ver si los hallo. De todos modos si habrá quien me guie lo agradeceré.

Gracias
marcoamoncada
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2011-06-06 22:41 @986

Re: Cargar página HTML

Notapor explorer » 2011-06-12 04:40 @236

El error dice que no has instalado Scrappy...

Aquí tienes una guía para instalar módulos y distribuciones en Perl.

De los dos, el más fácil de usar y personalizar es WWW::Mechanize. Y de hecho, es el que más uso.

Estos módulos sirven para lo que quieres: imitar el uso de una página a través de Perl, como si fuera un humano. Te rellenarán los formularios, y pulsarán botones y enlaces.

La limitación es que no funciona el JavaScript, por lo que, si la página depende de algunos procedimientos JavaScript (para recibir información del usuario o para crear partes de la página o para verificar información enviada por el usuario, etc, etc) entonces esto no te sirve.

Pero no está todo perdido. Está el módulo WWW::Scripter que permite rascar sitios web que hagan uso de JavaScript. Pero no garantiza un acceso en todos los casos.

La solución más drástica consiste en programar el acceso a estas páginas a través de un navegador de verdad, como el Internet Explorer o el Mozilla Firefox. Por ejemplo, WWW::Mechanize::Firefox. O Win32::IEAutomation en el caso de Internet Explorer en Windows. Pero, lo dicho, es la última solución a adoptar, ya que es muy pesado tener un navegador funcionando para conseguir esto. Aunque... también es la más compatible.

En cuanto a la comunicación con el servidor, hay unas pocas ocasiones en las cuales no te queda más remedio que usar un trazador de red, como el tcpdump, por ejemplo, para sacar los paquetes de información que se intercambian entre cliente y servidor.

A veces, no te puedes ni fiar de lo que ves en el código HTML :)

Dices que mandaste una página con usuario y contraseña y que funcionó. ¿Lo hiciste creando un HTML aparte, con esos valores?

Si te ves muy desesperado, mándame por mensaje privado el enlace que quieres rascar.
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: Cargar página HTML

Notapor marcoamoncada » 2011-06-23 23:23 @016

#!/usr/bin/perl
# GET method form
use HTML::TreeBuilder;
use HTML::FormatText;
use LWP::Simple;
use URI::URL;

$url=url("http://www.huevoscalibales.cm/index.php");
$url->query_form(acciones=>'agdrfe');
#ya se firma, por los mensaje que me indica, creo que ya se firma
#$content=get($url);
#print $content;

print "Url :",$url,"\n";

# POST method form
use HTTP::Request::Common qw(POST);
use LWP::UserAgent;

$ua=LWP::UserAgent->new();
$ua->cookie_jar({ file => "$ENV{HOME}/.cookies.txt" });
my $req= POST $url, [user=>'????????',password=>'????????????'];
#ya se firma, por los mensaje que me indica, creo que ya se firma
$content=$ua->request($req)->as_string;
print $content;

my $inicio=index($content, 'Location') + 10;
my $fin=index($content, 'amover_si_fuerz=2') - $inicio + 17;
print "inicio: $inicio fin: $fin \n";
my $fragmento = substr $content, $inicio, $fin;
$fragment=get($fragmento);
#cuando mando este comando, pierde la coneccion, por que, no le envio los parametros, ya que como estan solamente en "dos", o terminal, no los retiene, creo que me hace falta las cockies, para que los parametros que le paso sean sostenidos

print "fragment: <$fragmento>\n";
print $fragment;

me das un ejemplo, donde se genere las cockies, por que creo que ese es el problema
marcoamoncada
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2011-06-06 22:41 @986

Re: Cargar página HTML

Notapor explorer » 2011-06-24 03:33 @189

Mirando los ejemplos sobre cookies que hay en lwpcook, prueba a cambiar la llamada a get() por

$res = $ua->request(HTTP::Request->new(GET => $fragmento));

pero... yo juraría que no debería hacer falta tanto. Según lwpcook, solo es necesario crear la jarra de galletas, para que el módulo haga uso de él.

Me temo que el problema está en otro sitio.
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: Cargar página HTML

Notapor marcoamoncada » 2011-06-24 06:36 @316

Eso era todo, ya puedo entrar a la página, y con el comando

print $res->as_string;

pude ver el html. Sacaré los datos y las columnas que necesito.

Fue de mucha ayuda, GRACIAS.
marcoamoncada
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2011-06-06 22:41 @986

Anterior

Volver a Básico

¿Quién está conectado?

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