Recherche sur une page web

Recherche sur une page web - Perl - Programmation

Marsh Posté le 27-09-2008 à 20:20:45    

Bonjour je suis débutant sur Perl et là j'ai un problème avec l'utilisation du module LWP.
 
J'ai essayé de récupérer le champ du formulaire sur le site de google mais j'ai rien.
 
J'ai un autre problème pour l'utilisation de HTTP::Reponse je mets :
use LWP::UserAgent;
use HTTP::Response;
et j'ai le message comme quoi le module n'est pas présent alors que LWP est bien gérer ...
 
Enfin ma dernière question c'est sur l'utilisation des cookies avec LWP.
J'aimerais savoir utilisé un cookie pour me connecter sur un site web sans avoir à m'authentifier par le formulaire.
 
Donc si jamais vous avez un bout de code qui montrer le chargement d'une page web avec la recherche des formulaires et une authentification avec cookie sa serai géniale. J'ai cherché sur le net je trouve pas d'exemple ou d'info assez claire ( pour moi  :D )
 
Sinon le fichier de cookie à utiliser avec LWP c'est bien :
C:\Documents and Settings\Utilisateur\Application Data\Mozilla\Firefox\Profiles\bugztoy4.default\cookie.txt
 
Merci de l'aide que vous pourrez m'apporter. Avec ça j'aurai un bon coup de pouce  :bounce:

Reply

Marsh Posté le 27-09-2008 à 20:20:45   

Reply

Marsh Posté le 28-09-2008 à 12:05:21    

J'ai extrait un peu de code d'un de mes programmes

Code :
  1. # web management packages
  2. use LWP::UserAgent;
  3. use HTTP::Request;
  4. use HTTP::Response;
  5. use HTTP::Status;
  6. use URI::Heuristic;
  7. ....................................................................................................
  8. my $connection_address = "http://test.perlscript.org";
  9. my $connection_agent = "Testing-Perl-Script/v1.0";
  10. my $http_engine = LWP::UserAgent->new();
  11. $http_engine->agent($connection_agent);
  12. $http_engine->cookie_jar({}); #in memory cookie jar
  13. $http_engine->timeout(50); # As the servers are fast, this should be OK
  14. ....................................................................................................
  15. #ici, $file est un fichier ou je vais sauver l'url distante $raw_url
  16. save_url($file, 0, $raw_url);
  17. ....................................................................................................
  18. sub save_url {
  19.     my ($file, $mode, $raw_url) = @_;
  20.     my $data;
  21.     my $result = fetch_url($raw_url, \$data);
  22.     unless ($result) {
  23.         trace_msg ("Error", "Cannot fetch page $raw_url from site: $data" ) and return 0;
  24.     }
  25.     unless ($debug) {
  26.         open my $FILE, '>', $file
  27.             or ( trace_msg("Error", "Can't open '$file' for writing: $OS_ERROR" ) and return 0);
  28.         binmode $FILE if $mode;
  29.         print $FILE $data;
  30.         close $FILE
  31.             or ( trace_msg("Error", "Can't close '$file' after writing: $OS_ERROR" ) and return 0);
  32.     }
  33.     return 1;
  34. }
  35. ....................................................................................................
  36. sub fetch_url {
  37.     my ($raw_url, $data) = @_;
  38.     my $url = URI::Heuristic::uf_urlstr($raw_url);
  39.     $| = 1; # to flush next line
  40.     my $request = new HTTP::Request(GET => $url);
  41.     $request->referer($connection_address);
  42.     if ($debug) {
  43.         trace_msg("Debug", "Fetching page $raw_url" );
  44.         $$data = "<debug></debug>";
  45.         return 1;
  46.     }
  47.     else {
  48.         trace_msg("User+", "Fetching page $raw_url..." );
  49.         my $response = $http_engine->request($request);
  50.         trace_msg("+User", "...Done\n" );
  51.         if ($response->code != RC_OK) {
  52.             if ($response->code == RC_REQUEST_TIMEOUT) {
  53.                 # Try again a second time if we get a time out
  54.                 my $req = HTTP::Request->new(GET => $url);
  55.                 $req->referer($connection_address);
  56.                 trace_msg("User+", "Retrying to fetch page $raw_url..." );
  57.                 my $response = $http_engine->request($req);
  58.                 trace_msg("+User", "...Done\n" );
  59.                 if ($response->code != RC_OK)
  60.                 {
  61.                     $$data = $response->status_line;
  62.                     return 0;
  63.                 }
  64.                 else {
  65.                     $$data = $response->content;
  66.                     return 1;
  67.                 }
  68.             }
  69.             else {
  70.                 $$data = $response->status_line;
  71.                 return 0;
  72.             }
  73.         }
  74.         else {
  75.             $$data = $response->content;
  76.             return 1;
  77.         }
  78.     }
  79. }


Ca devrait te donner des billes pour ce que tu fais.
Dans fetch_url, je reessaye au moins une fois en cas d'echec, car par experience, on a parfois des echecs au chargement, mais rarement deux echecs successifs (sauf reel probleme).
dans save_url($file, 0, $raw_url); le second parametre est a garder a 0 si tu récupere du html (mode texte), et a mettre a 1 si tu récuperes des images par exemple (mode binaire) [sous linux, le mode 0 devrait passer partout a priori, mais pas sous windows]
Tu peux virer les appels à trace_message de mon exemple. Le code de cette procédure était:

Code :
  1. sub trace_msg {
  2.     my ($level, $message) = @_;
  3.     my $prefix = 1;
  4.     my $suffix = 1;
  5.     if ($trace) {
  6.         if ($level =~ /^\+/o) {
  7.             $prefix = 0;
  8.         }
  9.         if ($level =~ /\+$/o) {
  10.             $suffix = 0;
  11.         }
  12.         if ($level =~ /Error/io) {
  13.             $message = "Error:".$message if ($prefix);
  14.             $message .= "\n" if ($suffix);
  15.             print $message;
  16.         }
  17.         elsif ($level =~ /User/io) {
  18.             $message .= "\n" if ($suffix);
  19.             print $message;
  20.         }
  21.         elsif ($level =~ /Warning/io and $trace < 3) {
  22.             $message = "Warning:".$message if ($prefix);
  23.             $message .= "\n" if ($suffix);
  24.             print $message;
  25.         }
  26.         elsif ($level =~ /Info/io and $trace < 2) {
  27.             $message = "Info:".$message if ($prefix);
  28.             $message .= "\n" if ($suffix);
  29.             print $message;
  30.         }
  31.         elsif ($level =~ /Debug/io and $debug) {
  32.             $message = "Debug:".$message if ($prefix);
  33.             $message .= "\n" if ($suffix);
  34.             print $message;
  35.         }
  36.     }
  37.     return 1;  # for trace_msg(...) and ...
  38. }


A+,


Message édité par gilou le 28-09-2008 à 12:12:41

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

Marsh Posté le 28-09-2008 à 12:11:58    

Merci de la réponse. Manque quelques commentaires :D mais je vais chercher. Et puis si j'ai des problèmes je sais ou me renseigner.


Message édité par seb-info le 28-09-2008 à 12:12:38
Reply

Marsh Posté le 28-09-2008 à 12:16:30    

Pour les cookies, tu as vu la ligne
$http_engine->cookie_jar({}); #in memory cookie jar
Il y a moyen de faire d'autres choses, pour cela, aller voir la doc de LWP a cookie_jar.
Notes que si c'est juste pour des forms, tu as un outil bati au dessus de LWP tres pratique, WWW::Mechanize, qui pourrait peut etre te convenir.
A+,


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

Marsh Posté le 28-09-2008 à 21:24:40    

J'ai regardé WWW::Mechanize cet aprem mais j'ai pas compris fonctionne le module Form dedans.
 
Ton script est un peu trop complet pour la petite utilisation que je veux en faire. A vrai dire c'est mon 1er script Perl :D
 
Voilà ce que j'ai ecrit aujourdhui.

Code :
  1. #! C:\Perl -w
  2. use strict;
  3. use LWP::UserAgent;
  4. use HTTP::Cookies;
  5. use HTML::Form;
  6. # initialisation de l'agent
  7. print "entrer l'url a telecharger : ";
  8. my $url = <>; chomp ($url);
  9. my $ua =
  10.       LWP::UserAgent->new(
  11.         agent => 'Mozilla/4.73 [en] (X11; I; Linux 2.2.16 i686; Nav)',
  12.  cookie_jar => HTTP::Cookies->new(
  13.       file => 'cookies.txt',
  14.       autosave => 1 )
  15.      );
  16. # création de la requête
  17.     my $req = HTTP::Request->new( GET => $url );
  18. # exécute la requête et reçoit la réponse
  19.     my $res = $ua->request($req);
  20.     die $res->status_line if not $res->is_success;
  21. # parse le document a la recherche de formulaire
  22. my $form = HTML::Form->parse( $res->content, $url );
  23. my @inputs = $form->inputs();
  24. #affiche la page web
  25. print $ua->request($req)->as_string;


 
Le problème que je rencontre c'est que je ne vois pas ou sont décrit les champs formulaire et j'obtiens le code source de la page web.
 
J'aimerais pouvoir filtrer le contenu, Perl est fait pour ça mais bon j'ai pas encore les méthodes.
 
Je pense qu'a deux on va y arrivé :D
 
Merci de ton aide.


Message édité par seb-info le 28-09-2008 à 21:25:48
Reply

Marsh Posté le 29-09-2008 à 13:36:49    

Tu as lu la doc de HTML::Form ? ca devrait être clair.
A+,


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

Marsh Posté le 30-09-2008 à 20:15:35    

Je l'ai lu et appliqué et ça n'a pas fonctionné. Logique mon cher Watson ( Gilou ) sinon j'aurai pas post ;)
 
On m'a aidé et mon script fonctionne. Merci de ton aide.
 
Je reviendrai c'est presque sûre, même si je préférerai pas :D


Message édité par seb-info le 30-09-2008 à 20:27:05
Reply

Sujets relatifs:

Leave a Replay

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