Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Shop Recherche
1869 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Recherche sur une page web

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Recherche sur une page web

n°1792816
seb-info
Posté le 27-09-2008 à 20:20:45  profilanswer
 

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:

mood
Publicité
Posté le 27-09-2008 à 20:20:45  profilanswer
 

n°1793004
gilou
Modérateur
Modzilla
Posté le 28-09-2008 à 12:05:21  profilanswer
 

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é!  --
n°1793009
seb-info
Posté le 28-09-2008 à 12:11:58  profilanswer
 

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
n°1793011
gilou
Modérateur
Modzilla
Posté le 28-09-2008 à 12:16:30  profilanswer
 

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é!  --
n°1793129
seb-info
Posté le 28-09-2008 à 21:24:40  profilanswer
 

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
n°1793329
gilou
Modérateur
Modzilla
Posté le 29-09-2008 à 13:36:49  profilanswer
 

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é!  --
n°1794027
seb-info
Posté le 30-09-2008 à 20:15:35  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Recherche sur une page web

 

Sujets relatifs
fonction de recherche sur page webFiltrer des résultats d'une recherche sans rafraîchir toute la page
[C# .net] Faire une recherche dans une page webmise en page texte de resultat de recherche propre
recherche de script pour page web[HTML/Css] Recherche tous les attributs de mise en page
recherche sur uen pagePage d'attente pour moteur de recherche [résolu]
[PHP] Recherche un scripte multi-pagerecherche script pour aboutir sur une page qd .htaccess faux
Plus de sujets relatifs à : Recherche sur une page web


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR