Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Básico » Extracción de URL desde una página ASP y JSON  RESUELTO Responder al tema
Nuevo tema


Página 1 de 2  [ 22 mensajes ]  Ir a página 1, 2  Siguiente
 
Nota 2011-12-17 09:47 @449

Perlero Nuevo
Registrado: 2011-12-17 09:22 @432
Mensajes: 12
Extracción de URL desde una página ASP y JSON
Muy buenos días, mi nombre es Juan Carlos y soy nuevo por acá...

Deseo saber como puedo "Extraer" las URL de una página ASP que utiliza JSON,
en una página con HTML simple. Lo que yo hago es extraerlas con expresiones regulares
pero como las URL no se muestran (solo se muestran los Id a través de un POST) pues no he podido avanzar...

Miré en CPAN y me encontré con el módulo JSON y leí varias veces sobre éste, pero no he encontrado la forma de aplicarlo a mi problema.

En firebug me despliega un POST y en la pestaña de JSON de este POST me muestra las URL enlazadas con el Id que les acabé de comentar (esto es lo que busco hacer con Perl).

De antemano gracias por la ayuda y perdón por mi ignorancia en el tema.


Nota 2011-12-17 15:43 @696
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Extracción de URL desde una página ASP y JSON
Bienvenido a los foros de Perl en español, juank_93.

Da igual que la página sea ASP y use JSON. Si el resultado es código HTML (y tiene que serlo, para que el navegador del usuario pueda pintar la página), se pueden extraer los enlaces desde ahí.

¿No puedes poner un ejemplo de lo que quieres hacer? Aunque sea falseando los datos. Con unas pocas líneas de ejemplo nos vale.

_________________
JF^D Perl programming


Nota 2011-12-18 19:49 @867

Perlero Nuevo
Registrado: 2011-12-17 09:22 @432
Mensajes: 12
Re: Extracción de URL desde una página ASP y JSON
Muchísimas gracias por responder tan pronto a mi pregunta...

Bien, pues lo que pasa es que cuando carga en Firefox me muestra exactamente como uno
esperaría que mostrara img src="http://servidor.com/directorio/000_imagen.ext"

pero cuando la trato de cargar con Perl me muestra img scr = idimagen::javascript </a>

sin ningún tipo de URL...

Leyendo por ahí pude ver algo de URL amigables y objetos JSON, y efectivamente,
firebug me muestra las URL en la pestaña de JSON...

Algo que he visto es que si cancelo la carga de la página en Firefox el me muestra lo mismo de Perl...

Ya intenté con scraping, JSON, diferentes formas de Get y Post, unas cuantas decenas
de módulos de CPAN y aún nada.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin/perl.exe
  2.  
  3. use strict;
  4.  
  5. use LWP::Simple;
  6. use LWP::UserAgent;
  7. use URI::Escape;
  8. use HTTP::Request::Common;
  9.  
  10.  
  11. my $url = "http://servidor.com/directorio/page1.php";
  12. print "Conectando a $url\n";
  13. my $respuesta = get( $url );
  14.  
  15. my ($encontrados) = ($respuesta =~ /">(.*?)<\/ul>/is);
  16. print "Carga de la url completa...\n\n";
  17.  
  18. my $directorio_contenedor = "DIRECTORIO";
  19.  
  20. if(!-e "$directorio_contenedor") {
  21.    mkdir("$directorio_contenedor") or die "No se puede crear $directorio_contenedor";
  22. }
  23.  
  24.  
  25. my $maxi = "460";
  26. my $cont = "0";
  27. while ($maxi >= $cont) {
  28.   my ($link) = ($encontrados =~ /<a href="(.*?)\/"/is);
  29.  
  30.  


Nota 2011-12-19 07:53 @370
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Extracción de URL desde una página ASP y JSON
El problema es que la página se compone de forma dinámica.

Hay un JavaScript que se ejecuta en el momento de la carga de la página, y termina de rellenar esos enlaces.

Entonces, hay varias soluciones...

  • hacer que sea Firefox el que navegue y solicitarle a él el contenido de la página una vez que termine. Con módulos como WWW::Mechanize::Firefox se puede conseguir
  • investigar la forma en que esos enlaces se construyen. Dices que son peticiones JSON a un servidor. Entonces hay que suplantar esas peticiones con las nuestras, sin olvidarnos de indicar adecuadamente el referer de quien hace la petición, ya que el servidor puede tener como norma de seguridad el no admitir peticiones que no vengan referidas de las propias páginas que él sirve
  • hay otros módulos, como el WWW::Scripter::Plugin::JavaScript que permite ejecutar algo de JavaScript, con lo que puede ayudar a WWW::Scripter

_________________
JF^D Perl programming


Nota 2011-12-19 10:30 @479

Perlero Nuevo
Registrado: 2011-12-17 09:22 @432
Mensajes: 12
Re: Extracción de URL desde una página ASP y JSON
Muchas gracias por la respuesta, ya me bajé el módulo de JavaScript y
el de Firefox pero tengo problemas con el NMAKE. Me muestra:

"syntax error at -e line 1, near "'755'>

y líneas más abajo aparece

Fatal error U1077 Return code 0xff

Esto me pasa con TODOS los módulos que le he intentado instalar...

¿Alguna idea de por qué pasa esto?

Gracias y perdón por las molestias...


Nota 2011-12-19 11:19 @513
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Extracción de URL desde una página ASP y JSON
¿En qué sistema operativo estás?

WWW::Mechanize::Firefox no funciona en Windows, al menos, la última versión.

Si el error te sale con todos los módulos, quizás tengas roto el proceso de instalación. Quizás debas reinstarlo.

_________________
JF^D Perl programming


Nota 2011-12-19 11:40 @528

Perlero Nuevo
Registrado: 2011-12-17 09:22 @432
Mensajes: 12
Re: Extracción de URL desde una página ASP y JSON
Tengo Windows XP Service Pack 3
Mozilla 8.0
Active Perl

Si ese módulo no funciona en Windows, ¿qué otro módulo puedo utilizar similar a ese?

No puedo utilizar Cygwin ya que es muy lento en mi netbook y no me deja hacer nada...

¿Hay otro modo de instalar los módulos sin pasar por nmake? Ya leí lo referente en los foros y dicen lo mismo... Bajas el módulo, lo extraes y ejecutas el .pl que viene allí, luego nmake y ya... pero si hubiese un camino que no requiriera nmake sería muy útil.

Leyendo por ahí me encontré una solución también viable, Remote Control 0.2
es un addon de Firefox para controlarlo por medio de scripts, creería yo que ajustando un par de cosas en Perl podría utilizar un script que...

1. Envíe la orden al navegador de cargar la página
2. Cargue el código fuente como se supone lo debería entregar Firefox (html básico)
3. Procese el fuente con Expresiones regulares
4. Y finalmente muestre lo que tendría que mostrar...


Miro por ese camino y les comento...
igual me serviría de mucho su opinión al respecto...


Nota 2011-12-19 21:52 @953
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Extracción de URL desde una página ASP y JSON
Para instalar módulos con Active Perl, la primera opción es usar el PPM gráfico.

El nmake y demás pasos, es para cuando no se encontraba el módulo en trouchelle.com, lo cual es raro, porque hay un montón.

_________________
JF^D Perl programming


Nota 2011-12-22 14:37 @650

Perlero Nuevo
Registrado: 2011-12-17 09:22 @432
Mensajes: 12
Re: Extracción de URL desde una página ASP y JSON
Lo sé, pero igual en el PPM gráfico no me muestra el módulo que me dices...

Según miré sus configuraciones éste se conecta a la base y solicita los módulos según el
tipo de sistema desde el cual se haga la petición; y pues según lo que dices si el módulo
no corre en Windows pues por eso no lo muestra. Ya he mirado por muchos medios
y la única (probablemente) manera es controlar el navegador para que éste
mande las peticiones y lance los resultados al script...

Esto ya lo logré hacer con control remote y netcat para Windows. El problema que tengo ahora
es en lugar de utilizar netcat, utilizar el módulo Net::Telnet de Perl. Ya logré que envie la orden
de abrir una página X, pero no me muestra el resultado en el script...

Intenté con waitfor(), y con cmd(), y ninguno. La conexión se cierra antes de que el
script reciba la respuesta del navegador.

He aquí lo que llevo en el paso de telnet...


Syntax: [ Download ] [ Hide ]
  1. #!c:/perl/bin/perl.exe 
  2.  
  3.  
  4. use Net::Telnet(); 
  5. $telnet = new Net::Telnet ( Timeout=>10, Errmode=>'die', Port=>23);  #timeout en segundos 
  6. $telnet->open('localhost');  
  7. $telnet->print('window.location = "http://www.google.com.co/"');  
  8. $telnet->waitfor('/\$ $/i');  
  9. $telnet->print('orden');  
  10. $output = $telnet->waitfor('/\$ $/i');  
  11. print $output; 
  12.  
  13.  
  14. ## envío del comando, mostrando la respuesta del navegador. 
  15.     # my @lines = $telnet->cmd("who\n"); 
  16.     # print @lines or die "No se puede imprimir la salida"; 
  17. #($forecast) = $telnet->waitfor('/[ \t]+press return to continue/i'); 
  18. #  print $forecast; 
  19.      
  20. exit() 


Aquí están los dos métodos, por supuesto no los utilizo ambos al mismo tiempo
simplemente pongo como comentario el que no voy a utilizar pero ninguno de los dos
me sirve, me dice que el tiempo de espera se ha agotado según el timeout que le
pongo pero nunca muestra la respuesta del navegador.


¿Tienen idea de por qué pasa esto?


Nota 2011-12-22 17:39 @777
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Extracción de URL desde una página ASP y JSON
Pues el caso... es que la versión anterior sí que funciona en Windows...

Sería interesante saber cómo ejecutas netcat. Dudo que tengas que hacer una conexión al puerto 23.

_________________
JF^D Perl programming


Nota 2011-12-22 18:24 @808

Perlero Nuevo
Registrado: 2011-12-17 09:22 @432
Mensajes: 12
Re: Extracción de URL desde una página ASP y JSON
¡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.


Nota 2011-12-23 13:27 @602
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Extracción de URL desde una página ASP y JSON
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:
Syntax: [ Download ] [ Hide ]
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/"}


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.

Syntax: [ Download ] [ Hide ]
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__

_________________
JF^D Perl programming


Nota 2011-12-23 16:48 @741

Perlero Nuevo
Registrado: 2011-12-17 09:22 @432
Mensajes: 12
Re: Extracción de URL desde una página ASP y JSON
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.


Nota 2011-12-23 20:33 @898
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Extracción de URL desde una página ASP y JSON
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


Nota 2011-12-23 22:17 @970

Perlero Nuevo
Registrado: 2011-12-17 09:22 @432
Mensajes: 12
Re: Extracción de URL desde una página ASP y JSON
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.


Responder al tema  [ 22 mensajes ]  Ir a página 1, 2  Siguiente

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO