recupération page web en perl - Perl - Programmation
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+,
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:') ?
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+,
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.
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+,
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
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+,
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');
Marsh Posté le 26-05-2008 à 12:34:23
yuxi a écrit : voila un exemple de code pour me connecter |
Ca ne risque pas de marcher:
Tu fais la requete avant de configurer les droits d'acces!
Essayes quelque chose comme ceci:
Code :
|
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+,
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é...
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+,
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 ??
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...
Marsh Posté le 26-05-2008 à 15:54:47
Citation : en fait, je vais t'expliquer, |
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 :
|
A+,
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+,
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
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+,
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+,
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.
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+,
Marsh Posté le 26-05-2008 à 22:49:21
et avec la fin de code suivante?:
Code :
|
ainsi qu'en ajoutant la ligne:
Code :
|
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+,
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...
Marsh Posté le 27-05-2008 à 09:22:03
ça veut dire quoi,
CAN'T LOCATE OBJECT METHOD "NEW" VIA PACKAGE "LWP::UserAgent" at...
???
Marsh Posté le 27-05-2008 à 09:46:22
Et? C'était quoi?
A+,
Marsh Posté le 27-05-2008 à 09:59:22
ReplyMarsh 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)
Marsh Posté le 27-05-2008 à 11:10:51
ReplyMarsh 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+,
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+,
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.
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é..
Marsh Posté le 27-05-2008 à 12:46:26
Citation : dans perl/lib/LWP/authen j'ai Ntlm.pm... |
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+,
Marsh Posté le 27-05-2008 à 14:00:09
Bon, si tu as installé le module NTLM, ceci devrait marcher, non?:
Code :
|
A+,
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 ...
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...