• Publicidad

Extracción de URL desde una página ASP y JSON

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

Re: Extracción de URL desde una página ASP y JSON

Notapor juank_93 » 2011-12-22 18:24 @808

¡je,je,je!, qué cosas, no me había fijado en la versión anterior...
esa me quita muchos embrollos...

Y pues el netcat lo utilizo en el puerto 23 con Remote Control, Firebug que me muestra "lo oculto
detrás del proceso" y para utilizarlo con Perl hay dos formas (supongo que hay más pero
solo he implementado estas dos)

Incorporarlo al proceso con un

system "nc opciones_de_netcat comando_a_enviar_al_navegador"

Utilizar el fuente que viene con él y leerlo con el módulo de Perl para C/C++.

Por supuesto no he terminado el proceso porque sino no estaría dando problemas acá :D

Estos comandos el Remote control los percibe solo si son en JavaScript, como el
objeto location y sus diferentes propiedades, etc...

De nuevo reitero que mi intención es utilizar los módulos de telnet (que supongo es lo indicado
ya que por algo existen) y no tener que liarme con netcat, pero cuando envío
el comando en JavaScript el navegador lo ejecuta, pero no me informa nada en
el script y la conexión se cierra antes de poder analizar los json.

Les agradezco infinitamente la ayuda.
juank_93
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2011-12-17 09:22 @432

Publicidad

Re: Extracción de URL desde una página ASP y JSON

Notapor explorer » 2011-12-23 13:27 @602

El error está en el waitfor(). Estás indicando un prompt que no tiene Remote Control. De hecho, Remote Control no tiene prompt. Simplemente, responde con una línea a cada entrada que recibe.

Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@casa:~/Documentos/Desarrollo> telnet localhost 32000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
document.links.length
{"result":124}
document.links.item(1).href
{"result":"http://perlenespanol.com/tutoriales/"}
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Entonces, lo que hay que hacer es indicar que el prompt, en realidad, es el siguiente avance de línea que recibamos.

Aquí hay un programa que permite cargar una página y recuperar todo el código HTML de la página, y luego los enlaces, por separado.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6.  
  7. ### Módulos
  8. use JSON;
  9. use Net::Telnet;
  10. use Try::Tiny;
  11.  
  12. ### Objetos
  13. my $json   = JSON->new;
  14. my $telnet;
  15. try {
  16.     $telnet = Net::Telnet->new (
  17.         Host   => 'localhost',
  18.         Prompt => '/\n/',
  19.         Port   => 32000,
  20.     );
  21. }
  22. catch {
  23.     die "ERROR: No pude conectarme: $_\n";
  24. };
  25.  
  26. ### Constantes
  27. my $URL = 'http://perlenespanol.com/foro/index.php';
  28.  
  29. ### Variables
  30. my $res;
  31.  
  32. ### Programa
  33. ## Carga inicial de la página
  34. $res = comando("window.location = '$URL'");
  35. $res eq $URL  or  die "ERROR en la carga de la página. Se recibió [$res]\n";
  36.  
  37. ## Esperamos a que termine la carga de la página
  38. do {                                                    # Repetimos...
  39.     sleep 1;                                            # Cada segundo...
  40.  
  41.     $res = comando('document.readyState');              # pedimos estado de la carga de la página
  42.                                                         # puede ser 'uninitialized', 'loading', 'interactive' y 'complete'
  43.     $res or die "ERROR: No tenemos respuesta de la carga de la página\n";
  44.  
  45.     say "$res...";
  46.  
  47. } while ($res ne 'complete');                           # mientras no esté completada la carga
  48.  
  49. ## Operaciones
  50. # Todo el código HTML de la página
  51. my $html = comando('document.body.innerHTML');
  52. say "[$html]";
  53.  
  54. # Extracción de todos los enlaces
  55. my $numero = comando('document.links.length');
  56.  
  57. for my $i (0 .. $numero-1) {
  58.     my $enlace = comando("document.links.item($i).href");
  59.     say "$i:$enlace";
  60. }
  61.  
  62.  
  63. ### Subrutinas
  64. ## Ejecuta un comando en Firefox y devuelve la respuesta JSON decodificada
  65. sub comando {
  66.     my $comando = shift;
  67.     my $res;
  68.     $telnet->cmd(                                       # ejecutamos comando en el Firefox
  69.         String => $comando,
  70.         Output => \$res,                                # salida en formato JSON
  71.     );
  72.     my $respuesta_ref = $json->decode($res);            # que decodificamos
  73.     return $respuesta_ref->{'result'};                  # y devolvemos su contenido
  74. }
  75.  
  76. __END__
Coloreado en 0.005 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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Extracción de URL desde una página ASP y JSON

Notapor juank_93 » 2011-12-23 16:48 @741

Muchísimas gracias por el código, funciona perfectamente con cualquier página
que le indico al script, excepto por la que necesito :evil: me aparece lo mismo
que cuando utilizo expresiones regulares sobre el método GET

javascript:CambiarFoto(0)
javascript:CambiarFoto(1)
javascript:CambiarFoto(2)
etc...

Igual voy a tomarme un poco más de tiempo para investigar, hurgar un poco en tu código y
aprender de él. También sobre el módulo Try::Tiny acerca del cual no sé nada.
Gracias y les estaré comentando si veo algo que pueda ayudar.

Gracias.
juank_93
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2011-12-17 09:22 @432

Re: Extracción de URL desde una página ASP y JSON

Notapor explorer » 2011-12-23 20:33 @898

Bueno, pues entonces lo que puedes hacer es mandar ejecutar esa subrutina en el Firefox. Será como si hubiera pulsado el usuario para cargar las imágenes.

Lo que no sabemos es que es lo que realmente quieres hacer. A lo mejor hay una forma más sencilla de obtener lo que quieres.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Extracción de URL desde una página ASP y JSON

Notapor juank_93 » 2011-12-23 22:17 @970

Así es, al enviar esta orden en el navegador cambia la imagen.

Lo que deseo hacer es tomar la URL de las imágenes, y procesarlas con wget.

Pero para pasárselas a wget debo tenerlas en http://.../img.jpg.
juank_93
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2011-12-17 09:22 @432

Re: Extracción de URL desde una página ASP y JSON

Notapor explorer » 2011-12-25 07:36 @358

Pues ya lo tienes: le mandas la orden de cambiar la imagen, y a continuación preguntas el valor de la propiedad 'src' del <img> que almacena la imagen en pantalla.

Aunque... lo ideal sería averiguar la fórmula que usa para generar esos enlaces, analizando la subrutina de carga, y descargando entonces directamente las imágenes.

Recuerda también que si vas a hacer descargas masivas, debes avisar al propietario de la web y pedirle permiso.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Extracción de URL desde una página ASP y JSON

Notapor juank_93 » 2011-12-25 17:40 @777

Pues entonces solo me queda desarrollar el código para esto y terminaría, pero sería interesante
saber lo segundo, ahora bien, ¿es posible hacerlo desde el lado del cliente?

Lo digo porque la página es en su mayoría dinámica (lo digo por observación de su comportamiento),
los enlaces y algunos <div> son generados con ASP y creería que lo que dices está totalmente oculto al cliente...

Al fin y al cabo no me interesan tanto las imágenes; lo hago porque desde que empecé
con Perl nunca nada me había llevado tanto tiempo y neuronas (cerca de un mes analizando
enlaces, descargando una y otra vez su index; incluso monté un servidor local para ver los
html en acción localmente) y pues me encantaría descubrir lo que se encuentra detrás del telón,
si es posible del lado del cliente, desde Windows.

Otra cosa a tener en cuenta es... no tengo ni la más remota idea de ASP... Solo lo que he
podido ver con este pequeño proyecto...

Gracias por todo y pues voy a añadir a la rutina lo último que dices, uno todos los pedacitos y
lo pruebo a ver qué tal va...
juank_93
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2011-12-17 09:22 @432

Re: Extracción de URL desde una página ASP y JSON

Notapor explorer » 2011-12-26 08:09 @381

Cuando me refiero a averiguar cómo hace la carga de la foto, me refiero a estudiar qué hace la subrutina de JavaScript CambiarFoto().

Dices que la página se genera con ASP, pero no tienes acceso al servidor (porque si no, tendrías acceso directo a las imágenes y no existiría el problema iniciado en este hilo).

Entonces... poco nos interesa saber el lenguaje que crea la página, si no tenemos acceso a él. Solo podemos ver lo que recibimos: los códigos HTML y JavaScript que llegan a nuestro navegador.

Si la página se genera de forma dinámica, será por acción del código JavaScript de la página, que usará procedimientos para generar nuevo código, mover objetos por la página, y pedir más información al servidor.

Entre ellas estará la subrutina CambiarFoto(). Ella sabrá de dónde y cómo tiene que hacer para presentar una nueva imagen. Si está escrito de forma más o menos clara, y sabemos algo de JavaScript, podemos llegar a saber qué es lo que hace. Si no, no pasa nada: le pedimos a Firefox que la ejecute por nosotros, como hemos visto antes, y luego le pedimos la información que ha generado.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Extracción de URL desde una página ASP y JSON

Notapor juank_93 » 2011-12-26 23:10 @007

¡Ah, Ok! Perdon, es que no lo capté así.

Bien, pues cargo la página, cargan los iconos, estilos a los menús y texto.
Después de estar completa la carga del código HTML, el servidor manda
un post a otra página ASP local http://www.sevidor/ws/wsGal.asmx/getLstGalerias
y el resultado del post es una lista tipo Id:url que se despliega en un div reemplazando
el id por la URL real.

Discúlpenme si estoy diciendo cosas repetidas pero es que de tanto trabajar en esto ya ni sé.
Por cierto, no sé si lo anterior tiene lógica ya que lo digo por lo que he observado con
Firebug; no tengo ni idea de JavaScript, solo HTML básico y Perl.

Gracias por la ayuda y paciencia.
juank_93
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2011-12-17 09:22 @432

Re: Extracción de URL desde una página ASP y JSON

Notapor juank_93 » 2012-01-01 18:54 @829

Muchísimas gracias por todos los consejos y ayudas...

Ya logré que mostrará el resultado que yo esperaba, tuve que quitarle el escáner
de enlaces que me diste por uno con expresiones regulares; hice un híbrido con el
que ya tenía de get y este último de telnet ya me muestra los resultados esperados
(en total 250 lineas de código).

Pongo la parte que daba problemas...


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $camb ( 0 .. $contador - 1 ) {
  2.     my $cambiarfoto = comando("JavaScript&#058;Gal_cambFot($camb)");
  3.     my $html        = comando('document.body.innerHTML');
  4.     my ($carga)     = ($html);
  5.  
  6.     my ($enlaces_img) = ( $carga =~ /<img src="http:\/\/www.servidor.com\/images\/(.*?)"/is );
  7.  
  8.     print "http://www.servidor.com/images/$enlaces_img\n";
  9.  
  10.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Muchísimas gracias por todo... :roll:
juank_93
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2011-12-17 09:22 @432

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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

cron