Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Utilisation de WWW::Merchanize

5 réponses
Avatar
Mag
Bonjour,

j'ai une petite question a poser, j'utilise WWW::Mechanize
pour faire des requetes sur un formulaire, j'ai donc un :

$m->get( 'http://local.formulaire.int/stats.php');
$m->set_fields(
ip => $ip,
desi => $desi,
submit => inserer,
);
$m->click;
die $m->res->status_line unless $m->success;

je peux aussi l'ecrire comme cela:


$m->post(
"http://local.formulaire.int/stats.php?ip=$ip&desi=$desi&submit=inserer");

Les deux marches mais j'ai un gros probleme, j'ai l'impression que
systematiquement il charge la page stats.ph avant de faire la requete.
hors cette page est "longue" et du coup entre chaque insertion j'ai
9 a 15 secondes ...

Ai je un moyen de lui dire d'envoyer le requete et ne pas attentre le
chargement de la page entre chaque requete ? (le resultat affiché ne
m'interessant pas)

merci d'avance

5 réponses

Avatar
Paul Gaborit
À (at) Fri, 08 Feb 2008 17:38:37 +0100,
Mag écrivait (wrote):
Bonjour,

j'ai une petite question a poser, j'utilise WWW::Mechanize
pour faire des requetes sur un formulaire, j'ai donc un :

$m->get( 'http://local.formulaire.int/stats.php');
$m->set_fields(
ip => $ip,
desi => $desi,
submit => inserer,
);
$m->click;
die $m->res->status_line unless $m->success;

je peux aussi l'ecrire comme cela:


$m->post(
"http://local.formulaire.int/stats.php?ip=$ip&desi=$desi&submit=inserer");


J'ai l'impression que vous mélangez allègrement requête 'post' et
requête 'get'...

Les deux marches mais j'ai un gros probleme, j'ai l'impression que
systematiquement il charge la page stats.ph avant de faire la requete.
hors cette page est "longue" et du coup entre chaque insertion j'ai
9 a 15 secondes ...


C'est plutôt le contraire : il envoie la requête et attend la réponse
du serveur. Le serveur met donc 9 à 15 secondes à répondre...

Ai je un moyen de lui dire d'envoyer le requete et ne pas attentre le
chargement de la page entre chaque requete ? (le resultat affiché ne
m'interessant pas)


Le résultat affiché ne vous intéresse peut-être pas mais le "statut"
de la réponse renvoyée devrait vous intéresser (surtout si c'est n'est
pas 200). C'est le seul moyen pour vous d'être sûr que votre requête a
bien été prise en compte ou non.

Vous pouvez gérer plusieurs requêtes en parallèle (si le serveur le
supporte) via LWP::Parallel (mais WWW::Mechanize n'utilise que LWP).
Vous pouvez aussi utiliser plusieurs threads (si votre perl le permet)
ou plusieurs processus.

Mais, encore faut-il que le serveur à l'autre bout accepte la charge.
Si ça se trouve en lui envoyant deux requêtes à la fois vous attendrez
les deux réponses entre 18 et 30 secondes au lieu d'attendre entre 9
et 15 secondes pour chacune ! ;-)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Mag
À (at) Fri, 08 Feb 2008 17:38:37 +0100,
Mag écrivait (wrote):
Bonjour,

j'ai une petite question a poser, j'utilise WWW::Mechanize
pour faire des requetes sur un formulaire, j'ai donc un :

$m->get( 'http://local.formulaire.int/stats.php');
$m->set_fields(
ip => $ip,
desi => $desi,
submit => inserer,
);
$m->click;
die $m->res->status_line unless $m->success;

je peux aussi l'ecrire comme cela:


$m->post(
"http://local.formulaire.int/stats.php?ip=$ip&desi=$desi&submit=inserer");


J'ai l'impression que vous mélangez allègrement requête 'post' et
requête 'get'...



Possible ;=) je ne sais pas trop la difference ;=)


Les deux marches mais j'ai un gros probleme, j'ai l'impression que
systematiquement il charge la page stats.ph avant de faire la requete.
hors cette page est "longue" et du coup entre chaque insertion j'ai
9 a 15 secondes ...


C'est plutôt le contraire : il envoie la requête et attend la réponse
du serveur. Le serveur met donc 9 à 15 secondes à répondre...

Ai je un moyen de lui dire d'envoyer le requete et ne pas attentre le
chargement de la page entre chaque requete ? (le resultat affiché ne
m'interessant pas)


Le résultat affiché ne vous intéresse peut-être pas mais le "statut"
de la réponse renvoyée devrait vous intéresser (surtout si c'est n'est
pas 200). C'est le seul moyen pour vous d'être sûr que votre requête a
bien été prise en compte ou non.

Vous pouvez gérer plusieurs requêtes en parallèle (si le serveur le
supporte) via LWP::Parallel (mais WWW::Mechanize n'utilise que LWP).
Vous pouvez aussi utiliser plusieurs threads (si votre perl le permet)
ou plusieurs processus.

Mais, encore faut-il que le serveur à l'autre bout accepte la charge.
Si ça se trouve en lui envoyant deux requêtes à la fois vous attendrez
les deux réponses entre 18 et 30 secondes au lieu d'attendre entre 9
et 15 secondes pour chacune ! ;-)


Justement, la réponse ne m'intéresse pas réellement y compris le status.
alors comment aller plus vite ? lui dire de ne pas attendre les 15s

il y a aussi un autre élément, quand je le fait de mon poste via le
formulaire, le temps d'attente entre le moment ou je clique sur le
bouton d'insertion et le moment ou s'affiche la page de confirmation est
de 2 a 3 secondes pas plus, alors que via le script c'est 10s
Cette requete consomme aussi 100% du cpu pendant les 10s comme si il
cherchait a analyser la reponse.

merci d'avance


Avatar
Paul Gaborit
À (at) Mon, 11 Feb 2008 18:16:17 +0100,
Mag écrivait (wrote):
J'ai l'impression que vous mélangez allègrement requête 'post' et
requête 'get'...



Possible ;=) je ne sais pas trop la difference ;=)


Le problème est que du point de vue du serveur, ce n'est pas la même
chose et qu'il peut se comporter différement selon qu'on fait un
'post' ou un 'get'. Ce n'est peut-être pas le cas ici mais il faut
quand même le vérifier...

Justement, la réponse ne m'intéresse pas réellement y compris le status.
alors comment aller plus vite ? lui dire de ne pas attendre les 15s


Désolé mais la réponse vous intéresse sûrement (ou alors ce que vous
faites n'a aucun intérêt) : au minimum le status retourné car c'est le
seul moyen pour vous de vous assurer que votre requête a été
correctement prise en compte par le serveur...

il y a aussi un autre élément, quand je le fait de mon poste via le
formulaire, le temps d'attente entre le moment ou je clique sur le
bouton d'insertion et le moment ou s'affiche la page de confirmation
est
de 2 a 3 secondes pas plus, alors que via le script c'est 10s


Il est possible que votre navigateur utilise du javascript (à la sauce
AJAX) pour soumettre le formulaire ce qui peut améliorer
considérablement les performances... Vérifiez si il y a ou non du
javascript utilisé par le formulaire !

Cette requete consomme aussi 100% du cpu pendant les 10s comme si il
cherchait a analyser la reponse.


Il est fort possible que WWW::Mechanize cherche à analyser la réponse
et même le formulaire initial (c'est même indispensable)... Dans ce
cas, utiliser directement LWP (ou LWP::Parallel), vous y gagnerez
grandement.


--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
Mag
Merci paul pour l'aide que vous m'apportez

<..>
il y a aussi un autre élément, quand je le fait de mon poste via le
formulaire, le temps d'attente entre le moment ou je clique sur le
bouton d'insertion et le moment ou s'affiche la page de confirmation
est
de 2 a 3 secondes pas plus, alors que via le script c'est 10s


Il est possible que votre navigateur utilise du javascript (à la sauce
AJAX) pour soumettre le formulaire ce qui peut améliorer
considérablement les performances... Vérifiez si il y a ou non du
javascript utilisé par le formulaire !



Oui, il y a du javascript dans la page, meme beaucoup



Cette requete consomme aussi 100% du cpu pendant les 10s comme si il
cherchait a analyser la reponse.


Il est fort possible que WWW::Mechanize cherche à analyser la réponse
et même le formulaire initial (c'est même indispensable)... Dans ce
cas, utiliser directement LWP (ou LWP::Parallel), vous y gagnerez
grandement.


mis avec LWP, je concerve la partie "authentification" et les cookies ?

ou dois je faire un mixe entre les deux ? du style j'ouvre la session
via WWW::Merchanise puis je lance la requete en LWP

Désolé d'abuser, mais auriez vous un exemple LWP ?

merci
Mag


Avatar
Paul Gaborit
À (at) Tue, 12 Feb 2008 06:53:27 +0100,
Mag écrivait (wrote):
Merci paul pour l'aide que vous m'apportez

<..>
il y a aussi un autre élément, quand je le fait de mon poste via le
formulaire, le temps d'attente entre le moment ou je clique sur le
bouton d'insertion et le moment ou s'affiche la page de confirmation
est
de 2 a 3 secondes pas plus, alors que via le script c'est 10s


Il est possible que votre navigateur utilise du javascript (à la sauce
AJAX) pour soumettre le formulaire ce qui peut améliorer
considérablement les performances... Vérifiez si il y a ou non du
javascript utilisé par le formulaire !


Oui, il y a du javascript dans la page, meme beaucoup


Il faudrait maintenanty vérifier si ce javascript poste lui-même des
requêtes et lesquelles... pour les reproduire en Perl.

Cette requete consomme aussi 100% du cpu pendant les 10s comme si il
cherchait a analyser la reponse.


Il est fort possible que WWW::Mechanize cherche à analyser la réponse
et même le formulaire initial (c'est même indispensable)... Dans ce
cas, utiliser directement LWP (ou LWP::Parallel), vous y gagnerez
grandement.


mis avec LWP, je concerve la partie "authentification" et les cookies ?


On peut tout conserver ou reprodruire (si WWW::Mechanize sait le
faire, on doit pouvoir le faire avec LWP).

ou dois je faire un mixe entre les deux ? du style j'ouvre la session
via WWW::Merchanise puis je lance la requete en LWP

Désolé d'abuser, mais auriez vous un exemple LWP ?


La documentation de LWP (et des modules qui l'accompagnent) me semble
une bonne base de départ :

<http://search.cpan.org/~gaas/libwww-perl-5.808/lib/LWP.pm>

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>