IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web Perl Discussion :

revenir à la page précédente avec mechanize


Sujet :

Web Perl

  1. #1
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut revenir à la page précédente avec mechanize
    Bonjour,

    j'ai fait un script Perl qui remplit automatiquement un formulaire sur internet grâce au module WWW::Mechanize. Pour ce faire, j'ai principalement suivie l'articles suivant :
    http://articles.mongueurs.net/magazines/linuxmag58.html

    Le script que j'ai fait me permets de remplir automatiquement le formulaire, de suivre le lien qui renvoie à la page de résultats et de copier cette page dans un fichier local.
    Je l'ai fait de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #!/usr/bin/perl -w
     
    #================================================================================
    # Interrogation et recuperation automatique des donnees sur le site L2L
    # ATTENTION : Ne pas oublier de creer le dossier /Tmp/All_results_L2L_CX avant de lancer l'analyse.
    #================================================================================
     
    use strict;
    use diagnostics;
    use WWW::Mechanize;
    use Data::Dumper;
    use vars qw($opt_h $opt_f $opt_p $opt_c);
    use Getopt::Std;
     
    ##recuperation des arguments - initialisation
    getopts("hf:p:c:") or die("erreur(s) de saisie dans les options. Faire -h pour obtenir l'aide\n");
     
    if (defined($opt_h))
    {
    	&help;
    	exit;
    }
    elsif (!defined($opt_f) || !defined($opt_p) || !defined($opt_c))
    {
    	die("erreur : parametre manquant, -f, -p et -c doivent etre definis. Faire -h pour obtenir de l'aide\n");
    }
     
    my $url = 'http://depts.washington.edu/l2l/';
    my $bot = WWW::Mechanize->new();
     
    open(LOG, ">>/Users/mathilde/Dossier_partage_VM/LocaFT/logs/analyse_L2L_c$opt_c.log") or die("Impossible d'ouvrir analyse_L2L_c$opt_c.log");
     
    foreach my $type ('gobiol', 'gomole', 'l2lmdb')
    {
    	print "\nAnalyse $type\n";
     
    	$bot->get($url);
    	$bot->form_number(1);
     
    	#remplissage du formulaire
    	$bot->set_fields(dataname => $opt_f, datafile => $opt_p, libmenu => 'hugo', listmenu=> $type);
    	$bot->submit();
     
    	die $bot->res->status_line unless $bot->success;
     
    	$bot->follow_link(text => 'results');
     
    	open(RES, ">/Users/mathilde/Dossier_partage_VM/LocaFT/resultats/analyse_L2L/All_results_L2L_C$opt_c/L2L_$opt_f"."_$type.html") or die("Impossible d'ouvrir ../resultats/analyse_L2L/All_results_L2L_C$opt_c/L2L_$opt_f"."_$type.html\n");
     
    	print(RES Dumper $bot->content());
     
    	close(RES);
    }
     
    close(LOG);
     
    sub help
    {
    	print qq{
    analyse_auto_L2L.pl va sur le site L2L, rempli le formulaire avec les parametres passes en argument, et print les resultats
     
    Parametres :
    	-f : nom du fichier contenant la liste des genes product
    	-p : chemin d'acces au fichier a traiter.
    	-c : contrainte.
     
    };
    }
    Ce script marche bien.

    La page de résultat que je récupère est en fait un tableau contenant un certain nombre d'infos, dont des liens vers d'autres pages pour avoir des infos complémentaire.
    Actuellement, si je clique sur ces liens dans le fichier que j'ai copié en local, je n'obtiens rien puisque je n'ai pas copié les pages correspondant à ces liens.

    Donc maintenant je voudrais améliorer mon script pour que les certains liens du fichier de résultats soient préservé en copiant aussi les pages correspondantes.

    Pour faire ça, je pensais parcourir mon fichier de résultats, suivre les liens qui m'intéressent avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $bot->follow_link(text=>'monText')
    , copier la page correspondante, et revenir à la page de résultats pour suivre le lien d'après etc...

    Mais j'ai pas trouvé de méthode permettant de revenir à la page précédente. Donc avant de me lancer tête baissée dans le code, je voulais savoir s'il existait une méthode permettant de revenir à la page précédente (à la manière du backward du navigateur)?
    A moins qu'il y ait une autre manière de faire plus simple/efficace?

    Toute suggestion serait la bienvenue

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Pour revenir en arrière il y a la méthode back() bien sûr, mais il serait bien plus simple d'utiliser find_all_links() pour trouver tous les liens qui t'intéresse et les visiter tour à tour avec une boucle foreach(){}.

    --
    Jedaï

  3. #3
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    merci du conseil, je test find_all_links() dès que je peux

  4. #4
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    Bonjour,

    je viens de me remettre sur ce problème.
    J'ai commencé à travailler avec find_all_links(), en faisant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    my @list_link_match = $bot -> find_all_links(url_regex => qr/listmatch/i);
     
    foreach my $link (@list_link_match)
    {
    	if(defined($link))
    	{
    		my $url = $link->url();
     
    		$bot -> follow_link(url => $url);
    		open(MATCH, '>', $path.$url) or die("Impossible d'ourvir $path"."$url\n");
     
    		print(MATCH Dumper $bot->content());
     
    		close(MATCH);
    	}
    }
    avant d'en arrivé là, j'ai fait un print de chaque $url, pour vérifier qu'il y avait bien des url récupérés sur ma page.
    Mais avec le code ci-dessus, j'obtiens le message d'erreur suivant :
    Can't call method "url" on an undefined value at
    /Library/Perl/5.8.8/WWW/Mechanize.pm line 707 (#1)
    (F) You used the syntax of a method call, but the slot filled by the
    object reference or package name contains an undefined value. Something
    like this will reproduce the error:

    $BADREF = undef;
    process $BADREF 1,2,3;
    $BADREF->process(1,2,3);

    Uncaught exception from user code:
    Can't call method "url" on an undefined value at /Library/Perl/5.8.8/WWW/Mechanize.pm line 707.
    at /Library/Perl/5.8.8/WWW/Mechanize.pm line 707
    WWW::Mechanize::follow_link('WWW::Mechanize=HASH(0x90a754)', 'url', 'listmatches/negative_regulation_of_cell_proliferation.html') called at ../Tmp/analyse_auto_L2L_listmagtches.pl line 71
    sachant que la ligne 71 correspond à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $bot -> follow_link(url => $url);
    Je ne comprends pas pourquoi il me dit que la valeur url n'est pas définit, sachant que j'arrive à l'imprimer...

    en fait, il arrive à suivre le premier lien qu'il trouve car la première page html est bien créée dans le bon dossier.
    donc il se perdrait après avoir suivi le premier lien...
    Du coup, j'en viens à douter de ma manière d'utiliser find_all_links()...

    comment faire pour copier toutes les pages correspondant à tous les liens qu'on a récupérer ?

  5. #5
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    J'ai continué à chercher du côté de get à la place de follow_link : voici le code (pas de grand changement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    my @list_link_match = $bot -> find_all_links(url_regex => qr/listmatch/i);
     
    foreach my $link (@list_link_match)
    {
    	if(defined($link))
    	{
    		my $url = $link->url();
     
    		#$bot -> follow_link(url => $url);
    		$bot -> get($url);
    		open(MATCH, '>', $path.$url) or die("Impossible d'ourvir $path"."$url\n");
     
    		print(MATCH Dumper $bot->content());
     
    		close(MATCH);
    	}
    }
    et voici l'erreur que j'obtiens à l'exécution :
    mathilde@cgmc134:~/Dossier_partage_VM/LocaFT/bin$ perl ../Tmp/analyse_auto_L2L_listmagtches.pl -f concept100_75321_BCL6 -p /Users/mathilde/Dossier_partage_VM/LocaFT/resultats/analyse_L2L/C0_5000up/concept100_75321_BCL6 -c0

    Analyse gobiol
    Uncaught exception from user code:
    Error GETing http://depts.washington.edu/l2l/cgi-...feration.html: Not Found at ../Tmp/analyse_auto_L2L_listmagtches.pl line 67
    at /Library/Perl/5.8.8/WWW/Mechanize.pm line 2615
    WWW::Mechanize::_die('Error ', 'GET', 'ing ', 'URI::http=SCALAR(0x99593c)', ': ', 'Not Found') called at /Library/Perl/5.8.8/WWW/Mechanize.pm line 2602
    WWW::Mechanize::die('WWW::Mechanize=HASH(0x90a548)', 'Error ', 'GET', 'ing ', 'URI::http=SCALAR(0x99593c)', ': ', 'Not Found') called at /Library/Perl/5.8.8/WWW/Mechanize.pm line 2261
    WWW::Mechanize::_update_page('WWW::Mechanize=HASH(0x90a548)', 'HTTP::Request=HASH(0x92b4e0)', 'HTTP::Response=HASH(0x973810)') called at /Library/Perl/5.8.8/WWW/Mechanize.pm line 2117
    WWW::Mechanize::request('WWW::Mechanize=HASH(0x90a548)', 'HTTP::Request=HASH(0x92b4e0)') called at /Library/Perl/5.8.8/LWP/UserAgent.pm line 393
    LWP::UserAgent::get('WWW::Mechanize=HASH(0x90a548)', 'http://depts.washington.edu/l2l/cgi-bin/temp/uploads/concept1...') called at /Library/Perl/5.8.8/WWW/Mechanize.pm line 375
    WWW::Mechanize::get('WWW::Mechanize=HASH(0x90a548)', 'listmatches/negative_regulation_of_cell_proliferation.html') called at ../Tmp/analyse_auto_L2L_listmagtches.pl line 67
    Si j'ai bien compris, il ne trouve pas l'url que j'ai mis en gras. Ce qui est bizarre, c'est que l'url devrait être :
    alors qu'il cherche
    il y a donc un "listmatches" en trop. Mais je ne l'ajoute nul part dans le code, comment peut il être ajouté alors que je suis directement les liens récupérés par find_all_links() ?
    Je suis un peu perdue là...

    EDIT: des balises [url] sont automatiquement mise dans le message, donc on voit pas l'url au complet.
    Donc, voici l'url que le module cherche:
    .../cgi-bin/temp/uploads/concept100_75321_BCL627/listmatches/listmatches/negative_regulation_of_cell_proliferation.html
    et voici celle qu'il devrait chercher:
    .../cgi-bin/temp/uploads/concept100_75321_BCL627/listmatches/negative_regulation_of_cell_proliferation.html
    comme dit plus haut, il y a un "listmatches" en trop...

  6. #6
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    personne n'a d'idée pour m'aider ?

  7. #7
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    bien, j'ai trouvé la solution : en fait, il fallait utiliser à la fois follow_link() et back() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    #!/usr/bin/perl -w
     
    #================================================================================
    # Interrogation et recuperation automatique des donnees sur le site L2L
    # ATTENTION : Ne pas oublier de creer le dossier /Tmp/All_results_L2L_CX avant de lancer l'analyse.
    #================================================================================
     
    use strict;
    use diagnostics;
    use WWW::Mechanize;
    use Data::Dumper;
    use vars qw($opt_h $opt_f $opt_p $opt_c);
    use Getopt::Std;
     
    ##recuperation des arguments - initialisation
    getopts("hf:p:c:") or die("erreur(s) de saisie dans les options. Faire -h pour obtenir l'aide\n");
     
    if (defined($opt_h))
    {
    	&help;
    	exit;
    }
    elsif (!defined($opt_f) || !defined($opt_p) || !defined($opt_c))
    {
    	die("erreur : parametre manquant, -f, -p et -c doivent etre definis. Faire -h pour obtenir de l'aide\n");
    }
     
    my $path = "/Users/mathilde/Dossier_partage_VM/LocaFT/Tmp/analyse_L2L/All_results_L2L_C$opt_c/";
     
    my $url = 'http://depts.washington.edu/l2l/';
    my $bot = WWW::Mechanize->new();
     
    open(LOG, ">>/Users/mathilde/Dossier_partage_VM/LocaFT/logs/analyse_L2L_c$opt_c.log") or die("Impossible d'ouvrir analyse_L2L_c$opt_c.log");
     
    foreach my $type ('gobiol', 'gomole', 'l2lmdb')
    {
    	print "\nAnalyse $type\n";
     
    	$bot->get($url);
    	$bot->form_number(1);
     
    	#remplissage du formulaire
    	$bot->set_fields(dataname => $opt_f, datafile => $opt_p, libmenu => 'hugo', listmenu=> $type);
    	$bot->submit();
     
    	die $bot->res->status_line unless $bot->success;
     
    	#clique sur le lien results pour recuperation de la page de resultats.
    	$bot->follow_link(text => 'results');
     
    	#impression de la page de resultats dans le dossier All_results_L2L
    	open(RES, ">", $path."L2L_$opt_f"."_$type.html") or die("Impossible d'ouvrir $path"."L2L_$opt_f"."_$type.html\n");
     
    	print(RES Dumper $bot->content());
     
    	close(RES);
     
    	my @list_link_match = $bot -> find_all_links(url_regex => qr/listmatch/i);
     
     	foreach my $link (@list_link_match)
     	{
     		if(defined($link))
     		{
    			my $url = $link->url();
     
    			$bot -> follow_link(url => $url);
    			open(MATCH, '>', $path.$url) or die("Impossible d'ourvir $path"."$url\n");
     
    			print(MATCH Dumper $bot->content());
     
    			close(MATCH);
     
    			$bot -> back();
     		}
     	}
    }
     
    close(LOG);
     
    sub help
    {
    	print qq{
    analyse_auto_L2L.pl va sur le site L2L, rempli le formulaire avec les parametres passes en argument, et print les Tmp
     
    Parametres :
    	-f : nom du fichier contenant la liste des genes product
    	-p : chemin d'acces au fichier a traiter.
    	-c : contrainte.
     
    };
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment revenir à la page précédente en cliquant sur un lien
    Par veevee dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/04/2007, 19h29
  2. problème de script php pour revenir à la page précédente
    Par mandyben dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/09/2006, 10h12
  3. Revenir à la page précédente
    Par Llaur76 dans le forum Struts 1
    Réponses: 13
    Dernier message: 11/07/2006, 20h29
  4. [JSP] page précédente avec window.history.go(-1)
    Par marti dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 08/06/2006, 15h05
  5. revenir à la page précédente
    Par sam01 dans le forum Langage
    Réponses: 1
    Dernier message: 08/04/2006, 00h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo