recupération page web en perl

recupération page web en perl - Perl - Programmation

Marsh Posté le 26-05-2008 à 11:42:49    

bonjour a tous et a toutes,  
 
Voilà je cherche depuis quelques jours à récupérer une page web via perl et à en extraire les données qui m'intéressent, pour ensuite les annalyser et envoyer un mail.  
 
donc j'ai fait des recherches comme je débute là-dessus, et j'ai trouvé un code, qui fonctionne très bien sauf pour la page qui m'intéresse.  
 
ma page à comme URL : http://'adresse IP'/lmc/.../'page.jsp'
je ne vous donne pas l'adresse exacte volontairement. C'est une page en locale, sur un server windows 2003. Et l'extension du fichier est '.jsp' (javascript).  
 
 
voici une partie de mon code :  
 
use LWP::SIMPLE
use strict;
 
my $content = get("http://localhost/lmc/.../page.jsp" ) ;
print $content ;

 
a la place de localhost, je mets l'adresse ip, de windows server 2003.  
 
mais lorsque je lance ce script, rien ne s'affiche... j'ai tente des script de connexion HTTP: mais j'ai pas réussi non plus.  
 
 sauriez - vous me dire pourquoi cela ne marche pas ????
 
merci d'avance pour votre aide...
 
 

Reply

Marsh Posté le 26-05-2008 à 11:42:49   

Reply

Marsh Posté le 26-05-2008 à 11:54:04    

Utilises LWP, et imprimes le message d'erreur retourné.
Tu peux t'inspirer du code en fin de ce topic: http://forum.hardware.fr/hfr/Progr [...] 4816_1.htm
A+,


Message édité par gilou le 26-05-2008 à 11:54:17

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

Marsh Posté le 26-05-2008 à 12:04:16    

j'ai teste, ton code, en changeant, les url, apres je m'y prends peut etre mal, mais lorsque je lance mon script, en cmd, je n'ai tjs rien qui s'affiche même pas un message d'erreur...
 
en parallèle, connessez vous ce que signifie, l'error:500 : Can't connect to http:80 (bad hostname 'http:') ?
 

Reply

Marsh Posté le 26-05-2008 à 12:09:18    

Ca veut dire qu'il voit "http:80" comme hostname et non pas "xxxx.yyy.zzz" comme ca devrait etre la cas.  
Dans mon code, il faut que tu fasses un print $data apres la ligne 17, si tu veux afficher le message d'erreur.
A+,


Message édité par gilou le 26-05-2008 à 12:17:02

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

Marsh Posté le 26-05-2008 à 12:15:35    

ok merci,
 
voilà, maintenant je sais ce qui va pas, c'est que je ne suis pas autorisée, à y accéder, 401, unauthorized
 
mais, j'ai tester un certains nombre de code d'autorisation d'acces, sans résultat.

Reply

Marsh Posté le 26-05-2008 à 12:16:17    

Tu es sur que tu n'as pas une requete débutant par http://http://..............
Parce que pour ton erreur 500, ca y ressemble beaucoup:
il regarde le debut, vire le premier http://, garde tout le reste jusqu'au premier /, ce qui fait (le second) http:, et considere que c'est le hostname.
Ca colle avec ton message d'erreur.
A+,


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

Marsh Posté le 26-05-2008 à 12:20:46    

oui, ça je suis d'accord, j'avais mis, ça car avant, j'avais une erreur, de type 400, url non absolue.. et j'ai trouvé sur un forum qu'il fallait mettre deux fois http:...  
 
sinon, ton code, me renvoie erreur 401, non authorisé.
 
j'avais vu des code, pour windows, avec host:port, domaine\\login et passxord...  
mais j'ai pas réussi, a m'identifier

Reply

Marsh Posté le 26-05-2008 à 12:22:52    

Pour être autorisé, il faudra configurer le user-agent defini ici:
my $http_engine = LWP::UserAgent->new();
avec des parametres propres a ton environnement, avant de faire ta requete.
Essayes deja d'ajouter une cache a cookies, des fois que les cookies soient necessaires a ton script jsp: ajoutes la ligne suivante  
$http_engine->cookie_jar({}); #in memory cookie jar
avant ou apres celle sur le time out
Ca pourrait ameliorer les choses
A+,


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

Marsh Posté le 26-05-2008 à 12:24:43    

voila un exemple de code pour me connecter
 
 
use warnings;  
use LWP;
use strict;
print "Content-type: text/html\n\n";
my $browser = new LWP::UserAgent;
my $request = new HTTP::Request( GET => "http://http://adIP/lmc/.../page.jsp" );
my $response = $browser->request($request);
if ($response->is_success) {
  my $headers = $response->headers();
  print "Encoding : ".$headers->header("Content-Encoding" );                
  print "Content:\n".$response->content."\n";
} else {
  print "Erreur:".$response->status_line."\n";  
}
$request->authorization_basic("login", "password" );
$browser->credentials('host:port', '', 'domaine\\login, 'password');

Reply

Marsh Posté le 26-05-2008 à 12:34:23    

yuxi a écrit :

voila un exemple de code pour me connecter
 
 
use warnings;  
use LWP;
use strict;
print "Content-type: text/html\n\n";
my $browser = new LWP::UserAgent;
my $request = new HTTP::Request( GET => "http://http://adIP/lmc/.../page.jsp" );
my $response = $browser->request($request);
if ($response->is_success) {
  my $headers = $response->headers();
  print "Encoding : ".$headers->header("Content-Encoding" );                
  print "Content:\n".$response->content."\n";
} else {
  print "Erreur:".$response->status_line."\n";  
}
$request->authorization_basic("login", "password" );
$browser->credentials('host:port', '', 'domaine\\login, 'password');

Ca ne risque pas de marcher:
 
Tu fais la requete avant de configurer les droits d'acces!
 
Essayes quelque chose comme ceci:

Code :
  1. use warnings; 
  2. use LWP;
  3. use strict;
  4. print "Content-type: text/html\n\n";
  5. my $browser = new LWP::UserAgent;
  6. $browser ->cookie_jar({});
  7. my $request = new HTTP::Request( GET => "http://adIP/lmc/.../page.jsp" ); #un seul http://
  8. $request->authorization_basic("login", "password" ); #configures les droits avant de faire la requete
  9. my $response = $browser->request($request);
  10. if ($response->is_success) {
  11.   my $headers = $response->headers();
  12.   print "Encoding : ".$headers->header("Content-Encoding" );               
  13.   print "Content:\n".$response->content."\n";
  14. } else {
  15.   print "Erreur:".$response->status_line."\n"; 
  16. }


Noter que tu peux aussi passer la requete comme:
my $request = new HTTP::Request( GET => "http://login:password@adIP/lmc/.../page.jsp" ); #un seul http://
et ne pas faire l'appel a request->authorization_basic("login", "password" );  
Les deux procedes etant equivalents en principe
 
A+,


Message édité par gilou le 26-05-2008 à 13:48:01

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

Marsh Posté le 26-05-2008 à 12:34:23   

Reply

Marsh Posté le 26-05-2008 à 13:59:39    

même la, erreur, 400, unauthorized..

Reply

Marsh Posté le 26-05-2008 à 14:07:50    

use strict;
use locale;
use LWP::Simple;
use Encode;
use HTML::Entities;
 
 
my $URL = ('http://petanquelanester.free.fr/seniors.php');
my $page = get( $URL );
 
if ( not defined($page) ){
    die "Problème lors du téléchargement !\n";
}
 
my $codage_page = "latin1";
if ($page =~ /\bcharset\s*=\s*([\w-]+)/i) {
    $codage_page = $1;
    eval { decode ($codage_page, "test" ) };
    if ( defined ($@) ) {
 $codage_page = "latin1";
    }
}
 
my $page_unicode = decode( $codage_page, $page );
my $texte_unicode = supprime_html( $page_unicode );
my $texte = normalise_latin1( $texte_unicode );
 
print $texte,"\n";
 
sub supprime_html {  
     
    my @balises_a_ignorer =
     ("applet","code","embed","head","object","script","server" );
 
    my $html = shift @_;  
    $html =~ s/\n+/ /g;
    $html =~ s/\r+/ /g;
 
    decode_entities($html);
     
    foreach my $balise (@balises_a_ignorer) {
 $html=~s/<$balise.*?<\/$balise>//ig;
    }
 
    $html =~ s/<!--.*?-->//g;     #commentaires
    $html =~ s/<\/?p\/?>/\n/ig;   #paragraphes
    $html =~ s/<br\/?>/\n/ig;     #retours à la ligne
    $html =~ s/<\/tr>/\n/ig;      #lignes de tableau
    $html =~ s/<\/?h[1-6]>/\n/ig; #titres
    $html =~ s/<\/?div.*?>/\n/ig; #sections
     
    $html =~ s/<.*?>//g;          #autres balises
    $html =~ s/\s*\n\s*/\n/g;     #espaces en début/fin de ligne
    $html =~ s/ +/ /g;            #séquences de plusieurs espaces  
 
    return $html;
}
 
sub normalise_latin1 {
    my $chaine = shift @_;
    $chaine =~ s/[\x{2019}\x{2018}]/\'/g;
    $chaine =~ s/[\x{201C}\x{201D}]/\"/g;
    $chaine =~ s/[\x{2013}\x{2014}]/-/g;
    $chaine =~ s/\x{2026}/.../g;
    $chaine =~ s/\x{0152}/OE/g;
    $chaine =~ s/\x{0153}/oe/g;
    $chaine =~ s/[^\x{0000}-\x{00FF}]//g;
    return $chaine;
}
 
ça, c'etait mon tout premier code, qui fonctionne correctement, j'aurai aimé rajouter, seulement, l'authentification, pour acceder a mon adresse, qui est sur un server windows..
 
désolé, je suis débutante dans la matière, mais, j'apprends, relativement, vite, mais là, je ne comprends, pas, car je n'ai pas acces, avec le code que tu m'as montrer.. a croire que c'est bloqué...


Message édité par yuxi le 26-05-2008 à 14:09:40
Reply

Marsh Posté le 26-05-2008 à 14:46:39    

Citation :

ça, c'etait mon tout premier code, qui fonctionne correctement, j'aurai aimé rajouter, seulement, l'authentification, pour acceder a mon adresse, qui est sur un server windows..


C'est pas tres clair ce que tu dis ici:
acceder a mon adresse? tu veux acceder a une page sur un serveur http
quand tu parles de l'authentification, depuis un browser standard (internet explorer, firefox), tu fais quoi pour acceder a cette page? c'est en sachant cela qu'on va pouvoir regler ce pb d'authentification, a priori.
A+,


Message édité par gilou le 26-05-2008 à 14:46:51

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

Marsh Posté le 26-05-2008 à 14:54:39    

en fait, je vais t'expliquer,  
 
la page que je dois récupérer ne se trouve pas sur internet.. c'est de l'intranet... mais qui commence part http://...
 
pour l'ouvrir, je tape dans le navigateur, http:// suivi de l'adresse ip de la machine, ou de "localhos", puis le chemin : /lmc/.../page.jsp
 
lorsque je fais ça, on me demande de m'authentifier,  
pour cela, je dois mettre:
 le domaine \\login
le  mot de passe
 
puis je suis dessus...
 
mais je dois créer un programme pour récupérer les données de la page, car le code de celle-ci je ne l'ai pas sous la main..  
c'est pourquoi j'ai choisi perl ... puis je dois analyser le contenu, et envoyé un mail, suivant certaines conditions.
 
as tu compris ce que je dois faire ??

Reply

Marsh Posté le 26-05-2008 à 14:54:56    

en tout cas c'est gentil de ta part de m'aider

Reply

Marsh Posté le 26-05-2008 à 14:57:15    

le navigateur que j'utilise c'est internet explorer... si ça peut t'aider,
 
l'os, windows server 2003, ou XP...

Reply

Marsh Posté le 26-05-2008 à 15:54:47    

Citation :

en fait, je vais t'expliquer,  
 
la page que je dois récupérer ne se trouve pas sur internet.. c'est de l'intranet... mais qui commence part http://...

OK, donc ce n'est pas au niveau $request->authorization_basic("login", "password" );  que ca va se jouer, mais au niveau $browser->credentials('host:port', '', 'domaine\\login, 'password');  
Il va donc falloir que tu fasses:
$browser->credentials('adIP', '', 'domaine\\login, 'password');  
Ou le premier parametre est l'adresse de la machine, le second est sans importance je crois donc chaine vide,'domaine\\login le couple domaine windows server, login, le login que tu as dessus, et password, le password que tu as.
Et il faudra virer l'authentification au niveau de $request, inutile et qui pourrait poser probleme

Code :
  1. use warnings;
  2. use LWP;
  3. use strict;
  4. print "Content-type: text/html\n\n";
  5. my $browser = new LWP::UserAgent;
  6. $browser->credentials('adIP', '', 'domaine\\login, 'password');
  7. $browser ->cookie_jar({});
  8. my $request = new HTTP::Request( GET => "http://adIP/lmc/.../page.jsp" ); #un seul http://
  9. my $response = $browser->request($request);
  10. if ($response->is_success) {
  11.   my $headers = $response->headers();
  12.   print "Encoding : ".$headers->header("Content-Encoding" );             
  13.   print "Content:\n".$response->content."\n";
  14. } else {
  15.   print "Erreur:".$response->status_line."\n";
  16. }


A+,


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

Marsh Posté le 26-05-2008 à 16:00:09    

Si ca colle pas du premier coup, tu peux essayer avec:
$browser->credentials('adIP:80', '', 'domaine\\login, 'password');
D'apres certains commentaires sur le web, il faut ajouter le :80 apres l'adresse IP sinon ca ne marche pas avec certains serveurs (avec IIS par exemple)
A+,


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

Marsh Posté le 26-05-2008 à 16:01:49    

rrrr..  
tjs pareil, erro 401: unauthorized...
 
décidément... je sais pas si je vais y arriver... je cherche ce que ça signifie exactement... pour ensuite essayer de le resoudre


Message édité par yuxi le 26-05-2008 à 16:16:52
Reply

Marsh Posté le 26-05-2008 à 17:32:56    

Normalement, dans le reponse a l'erreur 401, il te file la valeur du second parametre que tu passes a $browser->credentials('adIP:80', '', 'domaine\\login, 'password'); et que j'ai laissé a vide.
Tu as quoi comme message d'erreur au complet?
A+,


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

Marsh Posté le 26-05-2008 à 17:41:33    

Au fait, si tu tapes ceci avec ton browser: domaine\\login
N'y aurait il pas un probleme d'interpretation du \\ comme un simple \ par perl? tu as essayé avec domaine\\\\login dans la ligne correspondante?
$browser->credentials("adIP", "", "domaine\\\\login", "password" ); ??
A+,


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

Marsh Posté le 26-05-2008 à 18:37:38    

justement, en realite, il n'y en a qu'un seul, c'est pourquoi j'en mais deux.

Reply

Marsh Posté le 26-05-2008 à 19:19:53    

OK. Ca me semble plus orthodoxe. C'est quoi le message complet avec l'erreur 401?
A+,


Message édité par gilou le 26-05-2008 à 19:20:53

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

Marsh Posté le 26-05-2008 à 20:48:55    

erreur 401 : unauthorized  
 
c'est tout....

Reply

Marsh Posté le 26-05-2008 à 22:49:21    

et avec la fin de code suivante?:

Code :
  1. if ($response->is_success) {
  2.   my $headers = $response->headers();
  3.   print "Encoding : ".$headers->header("Content-Encoding" );           
  4.   print "Content:\n".$response->content."\n";
  5. } else {
  6.   print "Erreur:".$response->as_string."\n";
  7. }


 
ainsi qu'en ajoutant la ligne:

Code :
  1. $| = 1; # to flush next line


avant la ligne
my $request = new HTTP::Request( GET => "http://adIP/lmc/.../page.jsp" ); #un seul http://
(j'avais pas vu qu'il manquait le $| = 1; dans ton code)
A+,


Message édité par gilou le 26-05-2008 à 22:53:15

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

Marsh Posté le 27-05-2008 à 09:14:22    

dommage que l'on ne puisse pas faire d'imprime ecran, depuis l'invite de commande...
 
mais j'ai erreur 401, suivi de code html, avec des lignes, qui me disent, vous n'etes pas authorise a afficher cette page, vous n'etes pas authorise a afficher ce repertoire....  
 
que des trucs comme ça...

Reply

Marsh Posté le 27-05-2008 à 09:22:03    

ça veut dire quoi,  
 
CAN'T LOCATE OBJECT METHOD "NEW" VIA PACKAGE "LWP::UserAgent" at...
 
???

Reply

Marsh Posté le 27-05-2008 à 09:23:28    

c'est bon, j'ai trouvé ^^

Reply

Marsh Posté le 27-05-2008 à 09:46:22    

Et? C'était quoi?
A+,


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

Marsh Posté le 27-05-2008 à 09:59:22    

c'est quand la balise USE LWP; n'est pas mise, c'est tout.

Reply

Marsh Posté le 27-05-2008 à 10:04:37    

par contre, j'ai tjs le même probleme, mais je cherche.

Reply

Marsh Posté le 27-05-2008 à 10:10:11    

saurais tu me dire ce que signifie :
 
Client-warning = Unsupported authentification SCHEME 'ntlm'
 
???  
 
merci, (j'ai ça dans mon message d'erreur)

Reply

Marsh Posté le 27-05-2008 à 11:10:51    

j'ai une phrase qui dit : can't locate athen/NTLM.pm @inc ...

Reply

Marsh Posté le 27-05-2008 à 12:07:35    

yuxi a écrit :

c'est quand la balise USE LWP; n'est pas mise, c'est tout.


Ca c'est parce que tu ne lisais pas les messages de warning, sinon, ca aurait du te sauter aux yeux d'emblée.
Tu as bien  
use warnings;
use strict;
en debut de ton code, parce que develloper un truc sans...
A+,


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

Marsh Posté le 27-05-2008 à 12:12:16    

yuxi a écrit :

j'ai une phrase qui dit : can't locate athen/NTLM.pm @inc ...

Il cherche un package pas installé dans ta distribution, c'est pas athen, mais authen!!
le package est decrit ici: http://search.cpan.org/~buzz/NTLM-1.03/NTLM.pm
ou alors plus probablement, si c'est celui avec LWP, celui decrit ici: http://cpan.uwinnipeg.ca/htdocs/li [...] /Ntlm.html mais qui depend du précédent (ce pourquoi je soupconne le precedent de ne pas être installé dans ta distrib)
selon la distrib de perl que tu utilises, il y a differentes manieres de mettre a jour.
Si tu utilises la distrib active state sur pc, il faut passer par ppm
 
Pour une explication de NTLM: http://en.wikipedia.org/wiki/NTLM
A+,


Message édité par gilou le 27-05-2008 à 12:16:27

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

Marsh Posté le 27-05-2008 à 12:39:31    

je pensais que c'etait installe automatiquement,  
 
j'ai telecharge, activeperl 5.8.. dernière version
 
j'ai déplacer le dossier PERL dans le lecteur C:
 
dans perl/lib/LWP/authen j'ai Ntlm.pm...  
apres il est peut etre mal installé je sais pas.

Reply

Marsh Posté le 27-05-2008 à 12:42:16    

j'avais été, ce site, mais je n'y comprend pas grand chose...
 
j'avais teste le scriopt, LWP::AUTHEN::NTLM
mais j'avais l'erreur, dont je t'ai parlé..

Reply

Marsh Posté le 27-05-2008 à 12:46:26    

Citation :

dans perl/lib/LWP/authen j'ai Ntlm.pm...  
apres il est peut etre mal installé je sais pas.


Oui, mais tu n'as pas Authen::NTLM qui est dans autre package.
Il faut que tu lances ppm dans une boite DOS, et que tu installes le package NTLM, pas installé par défaut.
A+,


Message édité par gilou le 27-05-2008 à 12:47:05

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

Marsh Posté le 27-05-2008 à 14:00:09    

Bon, si tu as installé le module NTLM, ceci devrait marcher, non?:

Code :
  1. use warnings;
  2. use strict;
  3. use LWP::UserAgent;
  4. use HTTP::Request;
  5. use HTTP::Response;
  6. use HTTP::Status;
  7. print "Content-type: text/html\n\n";
  8. my $browser = new LWP::UserAgent(keep_alive=>1);
  9. $browser->credentials('adIP:80', '', 'domaine\\login', 'password');
  10. $browser ->cookie_jar({});
  11. $| = 1; #autoflush
  12. my $request = new HTTP::Request( GET => "http://adIP/lmc/.../page.jsp" ); #un seul http://
  13. my $response = $browser->request($request);
  14. if ($response->is_success) {
  15.   my $headers = $response->headers();
  16.   print "Encoding : ".$headers->header("Content-Encoding" );           
  17.   print "Content:\n".$response->content."\n";
  18. } else {
  19.   print "Erreur:".$response->status_line."\n";
  20. }


A+,


Message édité par gilou le 27-05-2008 à 14:07:40

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

Marsh Posté le 27-05-2008 à 14:17:53    

je vais t'embeter mais comment, je l'installe .???  
 
comment je lance ce fichier..
 
ce que j'ai fais, cd c:\perl\lib\LWP\Authen
donc je suis placée dans le dossier Authen
apres j'ai tape Ntlm.pm
et ça n'a rien fait ...
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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