• Publicidad

Cargar varias páginas en Perl

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

Cargar varias páginas en Perl

Notapor BigBear » 2013-06-09 19:25 @851

Estoy haciendo una función para cargar varias páginas al mismo tiempo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use threads;
  2.  
  3. my $nave = LWP::UserAgent->new;
  4. $nave->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201Firefox/2.0.0.12");
  5. $nave->timeout(5);  
  6.  
  7. print toma("http://www.google.com");
  8.  
  9. sub toma {
  10.  
  11. my $hilo = threads->new(\&tomarapido($_[0]);
  12. $hilo->join();
  13.  
  14. sub tomarapido {
  15. return $nave->get($_[0])->content;
  16. }
  17.  
  18. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


La primera pregunta de muchas es cómo arreglo la línea esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $hilo = threads->new(\&tomarapido($_[0]);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿ Alguien me podría explicar cómo lo hago ?

P.D. : a simple vista veo otro error. En él hago un return() que la función toma, que nunca va a devolver para usar en print().
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Cargar varias páginas en Perl

Notapor danimera » 2013-06-09 22:51 @994

Veo raro el porqué creas un objeto thread $hilo por cada llamada a la función.

A vuelo de pajaro no entiendo qué quieres que te imprima, no entiendo qué tiene que retornar la función toma(). Podrías separar también las funciones, ¿no? Tienes una dentro de otra.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Cargar varias páginas en Perl

Notapor BigBear » 2013-06-10 09:10 @423

Sí, lo que trato de hace es cargar varias páginas al mismo tiempo porque las voy a usar con un for(). Algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $num(1..50) {
  2. $code = toma("http://localhost/test.php?id=".$num);
  3. if($code=~/Funciono/) {
  4. print "Yeah : $num\n";
  5. }
  6. }
  7.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Se me ocurrió esta idea cuando vi este código en Python:
Sintáxis: [ Descargar ] [ Ocultar ]
Using python Syntax Highlighting
  1. import httplib
  2. import time
  3. import threading
  4.  
  5. #open textfile containing pages
  6. f=open("pages2.txt","r")
  7.  
  8. #screenlock for threads
  9. screenlock=threading.Semaphore(value=1)
  10.  
  11. def fuzz(name,page):
  12.     try:
  13.         con=httplib.HTTPConnection(str(name))
  14.         screenlock.acquire()
  15.         print "Checking "+page+"\n"
  16.  
  17.         #send request
  18.         con.request("GET",str(page))
  19.  
  20.         #check response
  21.         res=con.getresponse()
  22.         if str(res.status)=="200":
  23.             print page+" "+"found\n"
  24.             found+=1
  25.         else:
  26.             print res.status,res.reason+"\n"
  27.     except Exception,prob:
  28.         print prob
  29.     finally:
  30.         con.close
  31.         screenlock.release()
  32.        
  33.  
  34. site=raw_input("Website:")
  35.  
  36. #read list of files and directories
  37. pages=f.read()
  38. pages=pages.split(",")
  39. for page in pages:
  40.  
  41.     #create thread for each page
  42.     t=threading.Thread(target=fuzz,args=(site,page))
  43.     t.start()
  44.    
  45. f.close()
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Espero no tener que mudarme a Python para hacer lo que quiero.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Cargar varias páginas en Perl

Notapor explorer » 2013-06-10 09:58 @457

Trabajar con Threads siempre es un dolor...

En CPAN tienes los módulos LWP::Parallel (en la distribución Bundle::ParallelUA) y Parallel::Downloader, que facilitan mucho este tipo de tareas.
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 varias páginas en Perl

Notapor BigBear » 2013-06-10 10:02 @459

¡Que desgracia! No quería mudarme a Python. :( Igual, gracias por las respuestas.

Tengo dos preguntas más:

¿ Cuántas peticiones threads puedo usar en una página al mismo tiempo? Porque creo que el array (350 paths) entero al mismo tiempo haría que banneaían mi IP.

Y la que más me inquieta, porque tengo pensado usar un sleep cada 50 threads para evitar el problema de la última pregunta pero quería saber si a pesar usar un sleep no detendría también el thread actual en vez de seguir activo (el thread).
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Cargar varias páginas en Perl

Notapor explorer » 2013-06-10 16:11 @716

Doddy escribiste:¡Que desgracia! No quería mudarme a Python.
No lo entiendo:
  • Python es un buen lenguaje. Si sabes resolver un programa en Python, pues lo haces en él
  • No hay problemas en usar threads en Perl. Solo que hay que conocer cómo trabajar con ellos. Y que la tendencia actual es la de no complicarse tanto y usar otros sistemas de procesamiento en paralelizacion , como el fork(). Por eso te he enlazado dos módulos en CPAN que resuelven el problema en unas pocas líneas.

Doddy escribiste:¿ Cuántas peticiones threads puedo usar en una página al mismo tiempo? Porque creo que el array (350 paths) entero al mismo tiempo haría que banneaían mi IP.
Depende de qué página sea. De lo que sí estoy convencido es que tu no tienes un ordenador con 350 núcleos de procesamiento :) ¿Crees que si arrancas 350 peticiones realmente se van a ejecutar a la vez? Pues eso depende del número de núcleos de tus procesadores.

En los sistemas que yo monto, se suele poner un límite de 250 procesos Apache para responder peticiones, así que ese es el límite. A partir de esa cantidad, no obtendrás respuestas.
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 varias páginas en Perl

Notapor BigBear » 2013-06-10 16:56 @747

Nunca dije que Python fuera malo. De hecho es el mejor lenguaje que he conocido. De hecho logré hacer con él mi primer juego en pygame llamado UrbanWar.

No sabía que los threads dependían del procesador. Entonces, estoy frito (tengo un Sempron 140) :(

También te pregunté esa duda rara que si uso un sleep() en Perl o Python pararía el thread actual o si seguiría funcionando. Que tenía pensado hacerlo cada 50 threads (ahora no estoy seguro). ¿ Qué conclusión tienes de eso ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Cargar varias páginas en Perl

Notapor explorer » 2013-06-10 17:51 @785

Doddy escribiste:No sabía que los threads dependían del procesador. Entonces, estoy frito (tengo un Sempron 140) :(
Es lo que significa "thread": hebra o hilo de ejecución. Tu puedes lanzar 350 hilos de ejecución, pero si tu procesador solo tiene un núcleo, el sistema operativo deberá parar un hilo cada vez para permitir entrar al otro. El resultado es que es una ejecución "simultánea" de forma aparente: depende de la velocidad del procesador el que nos engañe en nuestra apreciación de que hace varias cosas a la vez. Si le pedimos muchas, pues notaremos que no puede atender a todas, así que algunas tareas veremos que se paran de forma momentánea.

En mi Linux, en este momento, tengo 436 hilos de procesos ejecutándose de forma simultánea, pertenecientes a 120 tareas (aplicaciones) distintas. Bueno, realmente, de todos esos, solo siete están ejecutándose en este momento: htop, amule, ktorrent, firefox, thunderbird, boinc y gkrellm. El resto están esperando para cuando ocurra algún evento. Si aumento el número de aplicaciones, empezaré a notar retrasos en la ejecución de las tareas.

Doddy escribiste:También te pregunté esa duda rara que si uso un sleep() en Perl o Python pararía el thread actual o si seguiría funcionando. Que tenía pensado hacerlo cada 50 threads (ahora no estoy seguro). ¿ Qué conclusión tienes de eso ?
Claro que lo pararía. Un hilo de ejecución es como cualquier otro programa. Si le pides que se pare, pues se para.

Lo que no sabemos es qué es lo que realmente quieres hacer. ¿Qué es tan importante como para solicitar 350 recursos de forma simultánea? ¿No los puedes pedir de cinco en cinco, por ejemplo?
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 varias páginas en Perl

Notapor danimera » 2013-06-10 19:44 @863

De verdad es algo raro, no comprendo a fondo por qué quieres hacer ese poco de llamado, ¿quizás por práctica?

Yo trabajo con desarrollo de webspider y me ayuda un poco aveces trabajar con hilos, pero a la larga, como dice explorer, si solo tienes un procesador... la solución en el fondo no sería exacta...

Creo que ya con lo que haces en Perl lo tienes solucionado... :D Puedes hacerlo en Python y en Perl y comparar tus resultados.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Cargar varias páginas en Perl

Notapor explorer » 2013-06-10 20:31 @896

danimera escribiste:si solo tienes un procesador... la solución en el fondo no sería exacta...
A ver... Sí que tiene sentido hacer varias peticiones simultáneas, por ejemplo, cuatro o cinco, porque se supone que los archivos descargados pueden recorrer distintas rutas por Internet, por lo que interesa no esperar a bajar los archivos uno a uno (el filezilla funciona de esa manera: puedes configurar el número máximo de conexiones simultáneas con el servidor).

Tradicionalmente, los spiders abren un máximo de dos conexiones de forma simultánea: las esperas en la bajada de un archivo se trasladan en bajadas en el otro archivo, por lo que siempre estamos bajando información y no saturamos al servidor.

También los servidores ponen limitaciones al número de conexiones simultáneas que dejan hacer a los clientes, pero evitar los ataques de denegación de servicio.

El programa Python que ha publicado antes, veo que lo que hace es pedir un sitio web por el teclado, y luego, abrir un archivo donde están guardados los nombres de los archivos a bajar, aunque me parece que ni siquiera los baja, solo comprueba que se pueden bajar bien.

Eso se hace fácil con cualquiera de los dos módulos enlazados antes.
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 30 invitados