Robot web en perl et ajax

Robot web en perl et ajax - Perl - Programmation

Marsh Posté le 24-01-2010 à 02:50:01    

Salut,
 
je développe pas mal de bot en perl, principalement grace a WWW::Mechanize ( mech pour les intimes ).
Je me trouvait souvent bloqué dès que le contenu que je cherchait à récupérer était généré par du javascript.
Entre temps, j'ai fais la découverte de Selenium http://seleniumhq.org/, qui permet de créer des scénarios évolués avec simulations de mouvements divers comme si un utilisateur réel était en train de naviguer.
 
Je trouve cette solution tout a fait intéressante et enrichissante en terme de possibilités pour mes scripts, en revanche je sollicite votre expérience pour savoir si il existe un module qui aurait un moteur javascript embarqué ( ou qui peux en embarquer un ), et qui éviterait d'avoir un service qui "bind" un port ( 4444 par défaut ) sur un serveur.
En quelque sorte, un module qui fasse abstraction du javascript comme le fait le module Crypt::SSLeay avec le SSL. En gros, si le bot tombe sur une page avec du simple javascript à exécuter, et bien il l'exécute sans sourciller. Mais peux être suis-je en train de rêver :)
 
Merci d'avance, sputnick.


Message édité par sputnick le 24-01-2010 à 05:39:51
Reply

Marsh Posté le 24-01-2010 à 02:50:01   

Reply

Marsh Posté le 25-01-2010 à 03:08:04    

Bon, je me réponds à moi même, WWW::Scripter semble faire le coup.
 
Par contre je n'obtiens que ceci au lieu de la valeure générée par le javascript :  

Citation :


counter--:--


 
Voici une URL si vous voulez tester : http://www.sputnick-area.net/scripts/js.html
 
Et voici mon script :

Code :
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use WWW::Scripter;
  5. my $tps;
  6. my $mech = new WWW::Scripter;
  7. $mech->use_plugin('JavaScript');
  8. $mech->agent_alias( 'Linux Mozilla' );
  9. $mech->cookie_jar({});
  10. $mech->get("http://www.sputnick-area.net/scripts/js.html" );
  11. print $mech->content( format => 'text' );


 
J'arrive tres bien à le faire de cette façon là, mais c'est pas ce qui m'interesse : ( j'implement les calculs du JS en perl )

Code :
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use WWW::Mechanize;
  5. my $tps;
  6. my $mech = WWW::Mechanize->new( autocheck => 1 );
  7. $mech->agent_alias( 'Linux Mozilla' );
  8. $mech->cookie_jar({});
  9. $mech->get("http://www.sputnick-area.net/scripts/js.html" );
  10. my @arr = split /\n/, $mech->content;
  11. for (@arr) {
  12.     $tps = $1, last if /var\s+tps\s+=\s+(\d+)\s/;
  13. }
  14. my $m = (($tps%3600)/60); $m = sprintf("%1.f", $m);
  15. my $s = (($tps%3600)%60); $s = sprintf("%1.f", $s);
  16. print $m < 10 ? "0$m" : $m, $s < 10 ? ":0$s" : ":$s\n";


Reply

Marsh Posté le 25-01-2010 à 13:24:33    

Tu serais sous Windows, Win32::IE::Mechanize  ferait automatiquement le boulot du fait de son implémentation. Mais je ne crois pas qu'il y ait grand chose pour ce faire avec perl sous Linux (il faut ajouter a la fois une implementation DOM et un interpréteur javascript).
J'ai regardé WWW::Scripter et WWW::Scripter::Plugin::JavaScript. Peut être qu'en recupérant le code entre les balise javascript et en appelant eval dessus, cela ferait avancer les choses, mais j'ai pas testé. Mon implem (active state) n' a pas les modules WWW::Scripter::Plugin::JavaScript et JE de dispo, donc je n'ai pas été voir plus loin.
A+,


Message édité par gilou le 25-01-2010 à 13:36:38

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed