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

Langage Perl Discussion :

Problème de récupération de paramètres


Sujet :

Langage Perl

  1. #1
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut Problème de récupération de paramètres
    J'ai a un probleme dans la transmission de paramètres je les récupère comme ceci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my %urls;
    @urls{ @ARGV } = (1) x @ARGV;
     
    my @url = keys %urls;
     
    robot (@url);
    ce qui marche parfaitement si ce n'est que mon script est récursif et ce bloque

    voici le code



    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    #!C:\Program Files\Perl\bin\perl.exe -w
    use strict;
    use URI::URL;
    use HTTP::Request;
    use HTTP::Response;
    use HTTP::Cookies;
    use POSIX;
    use HTTP::Size;
    require LWP::Parallel::UserAgent;
    use HTML::LinkExtor;
     
    #===========================================================================#
    #                          Begin of configuration                           #
    #===========================================================================#
     
     
    my $arg;
    my %urls;
    my @web;
    $| = 1;
    my $VERSION = "Bot/1.1";
     
     
     
     
    my $ua = LWP::Parallel::UserAgent->new('Mozilla/5.0 (compatible; Bot/1.1');
       $ua->max_hosts(50);
       $ua->max_req(50);
       $ua->wait(0);
       $ua->max_redirect(8000000000);
       $ua->protocols_allowed( [ 'http' ] );
       $ua->protocols_forbidden( [ 'file', 'mailto', 'https', 'ftp', 'socks', 'gopher'] );
       $ua->requests_redirectable( [ 'HEAD' ] );
       $ua->timeout(4);
       $ua->env_proxy;
       $ua->nonblock(1);
       $ua->duplicates(1);   
       $ua->remember_failures(1);
       $ua->redirect(1);
     
       my $cookie_jar = HTTP::Cookies->new(
        file => 'lwp_cookies.dat',
        autosave => 1,
      );
     
       $ua->cookie_jar($cookie_jar);
     
     
    #===========================================================================#
    #                               The Robot                                   #
    #===========================================================================#
     
    @urls{ @ARGV } = (1) x @ARGV;
     
    my @url = keys %urls;
     
    robot (@url);
     
     
    sub robot
    {
     foreach my $link ( @_ )
     {
     
     
       my $verif_links = verif_link_format($link);
     
    	 if ( $verif_links == 1 ) {
     
        my $req = HTTP::Request->new( 'GET', $link );
     
     
    	 $req->header('Accept' => [
                         qw(
                          text/html application/xhtml+xml application/msexcel
                          application/msword application/pdf application/rtf
                          application/x-javascript application/x-httpd-php
                          text/rtf text/nux application/sxc application/sxw
                          application/sxd application/mdi application/x-httpd-asp
                          application/x-httpd-aspx application/x-httpd-mspx
                          application/x-httpd-cfm application/x-httpd-jthml
                          application/x-httpd-pm )
     
        ]
    );
     
      my $res = $ua->request($req, $arg, 4096);
     
       if ( $res->is_success ) {
     
          my ($code, $date, $size, %page, $base, $content_type);
     
         $code = $res->content;
     
         $date = date();
     
         $size = size($link);
     
         $base = $res->base;
     
         $content_type = $res->content_type;
     
              %page = (
     
     
                result => [
     
                             "$code", "$link",
                             "$date", "$size KB",
                             "$content_type"
     
                          ]
     
     
                );
     
                #print "$page{'result'}->[0]\n";
                print "$page{'result'}->[1]\n";
                #print "$page{'result'}->[2]\n";
                #print "$page{'result'}->[3]\n";
                #print "$page{'result'}->[4]\n";
     
             my $p = HTML::LinkExtor->new(\&callback);
     
    		     $p->parse($code);
     
     
    		     @web = map { $_ = url($_, $base)->abs; } @web;
    	  foreach (@web) {
    	  robot(@web);
       }
     
       }
        else
       {
         print "Request failed\n";   
       }
      }
       else
      {
        print "Bad link\n";
      }
     }
    }
     
     
    #===========================================================================#
    #                               Extract links                               #
    #===========================================================================#
     
     
      sub callback {
         my($tag, %attr) = @_;
         return if $tag ne 'a';
         push(@web, values %attr);
      }
     
     
    #===========================================================================#
    #                      Keep only good extension to extor                    #
    #===========================================================================#
     
     
    sub verif_link_format
    {
     foreach my $link_format ( @_ )
     {
       if ( $link_format =~ m!^http://[_a-zA-Z0-9-]+\.[_a-zA-Z0-9-]+[.a-zA-Z0-9-]*(/~|/?)[/_.a-zA-Z0-9#?&=+-]*$!i) {
     
         return 1;
     
       }
        else
       {
     
         return 0;
     
       }
     }
    }
     
     
    #===========================================================================#
    #                                   Get date                                #
    #===========================================================================#
     
     
     
    sub date
    {
      my @tab_date =localtime(time);
      my $jour = $tab_date[3];
      my $mois = ($tab_date[4]+1);
      my $annee =  ($tab_date[5]+1900);
      return ("$jour/$mois/$annee");
    }
     
     
     
    #===========================================================================#
    #                                   Get size                                #
    #===========================================================================#
     
     
     
     
    sub size
    {
     foreach my $url ( @_ ) {
     
          my $size = HTTP::Size::get_size( $url );
     
          if (defined $size)
          {
                my $result = $size/1024;
                   $result = floor($result);
     
             return $result;
     
          } else {
     
             return "?";
     
          }
       }
    }
    Testez vous aller voir c'est trop bizare comme bug et je n'est trouvé aucune info dessus
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  2. #2
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 56
    Points
    56
    Par défaut Re: Problème de récupération de paramètres
    Citation Envoyé par scaleo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my %urls;
    @urls{ @ARGV } = (1) x @ARGV;
    my @url = keys %urls;
    robot (@url);
    [/code]
    Je ne pense pas que le problème soit là (pas le temps de tester moi-même tout le script). Mais pourquoi ne pas passer directement @ARGV à robot(), puisqu'au final c'est ce que robot() reçoit.

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 56
    Points
    56
    Par défaut
    Quant à la fonction récursive, il y a sans doute un problème, parce que le robot risque de se perdre en cyberspace sans jamais revenir à la liste d'origine.

    Si on dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    robot qw(site1 site2 site3);
    , et que site1 contient des liens vers sites A, B, C, le robot va lire d'abord site A, ainsi que les liens qu'il contient, avant de revenir à site2. Puisque le web est plus ou moins infini, il y a de fortes chances de ne jamais bcp avancer dans la liste.

    En général, la solution consiste à parser en largeur d'abord, c'est à dire site1, site2, site3, avant d'aller en profondeur. Et pour cela, il faut gérer autrement la liste des sites à traiter.

  4. #4
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    Citation Envoyé par chostrama
    Quant à la fonction récursive, il y a sans doute un problème, parce que le robot risque de se perdre en cyberspace sans jamais revenir à la liste d'origine.

    Si on dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    robot qw(site1 site2 site3);
    , et que site1 contient des liens vers sites A, B, C, le robot va lire d'abord site A, ainsi que les liens qu'il contient, avant de revenir à site2. Puisque le web est plus ou moins infini, il y a de fortes chances de ne jamais bcp avancer dans la liste.

    En général, la solution consiste à parser en largeur d'abord, c'est à dire site1, site2, site3, avant d'aller en profondeur. Et pour cela, il faut gérer autrement la liste des sites à traiter.

    Comment ont fait pour parser d'abord en largeur ????? , pk je voie pas trop comment faire

    Ton idée de parser d'abord site1, site2, site3 est exactement ce que je veut faire , mais je n'y arrive pas
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  5. #5
    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
    Cf. "parcours en largeur d'un graphe"... Les algorithmes sur les graphes sont à la base de l'algorithmique, un petit cours de rattrapage pourrait aider grandement.
    Pour un parcours en largeur, deux solutions : soit une file, soit deux piles (l'une contenant la profondeur courante, l'autre qu'on remplit avec la suivante jusqu'à ce que la première soit épuisée, auquel cas on inverse les rôles). Evidemment il ne faut pas oublier de "marquer" les liens déjà explorés pour ne pas y revenir inutilement, ici un hash est assez adapté pour débuter, quitte à envisager des solutions plus robustes par la suite (éventuellement utiliser un hash lié (cf. "tie") à une DB sur le disque permet d'avoir une persistance des données).

    --
    Jedaï

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 56
    Points
    56
    Par défaut
    Comme le disait jedai, tout est dans la gestion des listes. Voici un exemple assez basique:
    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
     
    { # un bloc pour que les 2 listes restent visibles 
        my %vus;
        my @avoir;
        sub  robot {
                 #gerer la liste
                 foreach my $url ( @_ ) {
                      next if defined $vus{$url}; # deja vu
                      push( @avoir, $url ); # les nvx url vont a la fin de la liste
                  }
                return if $#avoir == -1;  # plus rien à voir
             #parser les urls 
             while (my $page =  shift @avoir ) {
                   my @nouveaux_url = parser( $page); # extraire les url, faire qqch avec la page
                   robot( @nouveaux_url );
               }
         }
    }
    NB: ce n'est pas du vrai code. Il faudrait l'adapter à tes besoins. De plus, cela ne prend pas en compte la profondeur. C'est juste pour donner une idée du principe de la recherche en largeur. Il n'y a rien encore pour arrêter le robot qq part.

  7. #7
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    A ok , donc pour ce qui est de faire en sorte de na pas visiter deux fois le même lien que pensez vous de


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        $urls{$link}++; 
        if( $urls{$link} == 1 ) { 
     
          JE VAIS DES OPERATIONS
     
        }
    Pour les algo sur les graphes je n'en avais jamais entendu parlé , donc je vais étudier sa de suite
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 56
    Points
    56
    Par défaut
    J'ai oublié le
    dans la boucle while de mon exemple.

    Sinon, le next suffit pour empêcher de revenir sur un meme site.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Voici un vieux robot , que j'avais trouvé sur ce même forum , je pense qu'il illustre ce que veut dire Jedai , mais je ne peut pas te garantire que ce soit bien sa .



    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
    #!/usr/bin/perl -w
    use strict;
    use warnings;
     
    my $VERSION = "robot/01";
     
    my $ua = LWP::UserAgent->new;
     
    my @startlinks = ("http://www.clubic.com");
     
    use LWP::UserAgent;
    use HTML::LinkExtor;
    use URI::URL;
     
    $| = 1;
     
    sub spider (%);
     
    spider URL => '$url';
     
    sub spider (%) {
    	my %args = @_;
     
    	push(@startlinks, $args{URL});
     
     	WORKLOOP: while (my $link = shift @startlinks) {
     
    		for (my $i = 0; $i< $#startlinks; $i++) {
    			next WORKLOOP if $link eq $startlinks[$i];
    		}
    		print ">>>>> working on $link\n";
    	        HTML::LinkExtor->new(
              	  sub {
    			my ($t, %a) = @_;
    			my @links = map { url($_, $link)->abs() }
    			grep { defined } @a{qw/href img/};
     
    			foreach my $start_link (@startlinks) {
    				my $i = 0;
    				for (0 .. $#links) {
    					if ($links[$i++] eq $start_link) {
    						$links[$i -1] = "'REMOVE'";
    					}
    				}
    			}
     
    			@links = sort @links;
    			for (my $i = 0; $i< $#links; $i++) {
    				$links[$i] = "'REMOVE'" if $links[$i] eq $links[$i +1];
    			}
    			@links = grep { $_ ne "'REMOVE'" } @links;
     
    			print "+ $_\n" foreach @links;
     
    			push @startlinks, @links if @links;
              	  } ) -> parse(
               	  do {
                   		my $r = $ua->simple_request
                     	(HTTP::Request->new("GET", $link));
                   		$r->content_type eq "text/html" ? $r->content : "";
               	  }
             	)
    	}
    }

  10. #10
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    Heu sigeme j'ai testé ton robot la , il marche bien mais a tendance a revenir sur sont point de départ et a cracher des doublons de partout , de plus le code est loin d'être super, je préfère le mien.

    Ast u déjà réussie a utiliser les algoes dont parle Jedai ?

    Parce que la je sèche tout comme quand j'étudias ces même algo il y a quelque années
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  11. #11
    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
    Le code de Chostrama est parfaitement fonctionnel (il utilise la méthode de la file pour le parcours en largeur), il te suffit d'y rajouter ta vérif de doublon et tes traitements et tu auras ce que tu veux.

    --
    Jedaï

  12. #12
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    Heu j'ai quelque problème avec mon robot .

    "my" variable $page masks earlier declaration in same scope at C:\DOCUME~1\Teddy\LOCALS~1\Temp\dirE15.tmp\8.pl line 71


    "my" variable $verif_links masks earlier declaration in same scope at C:\DOCUME~1\Teddy\LOCALS~1\Temp\dirE15.tmp\8.pl line 74

    syntax error at C:\DOCUME~1\Teddy\LOCALS~1\Temp\dirE15.tmp\8.pl line 69, near "@avoir"

    syntax error at C:\DOCUME~1\Teddy\LOCALS~1\Temp\dirE15.tmp\8.pl line 69, near "})"

    syntax error at C:\DOCUME~1\Teddy\LOCALS~1\Temp\dirE15.tmp\8.pl line 155, near "}"
    voici mon code



    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    #!C:\Program Files\Perl\bin\perl.exe -w 
    use strict; 
    use URI::URL; 
    use HTTP::Request; 
    use HTTP::Response; 
    use HTTP::Cookies; 
    use POSIX; 
    use HTTP::Size; 
    require LWP::Parallel::UserAgent; 
    use HTML::LinkExtor; 
     
    #===========================================================================# 
    #                          Begin of configuration                           # 
    #===========================================================================# 
     
     
    my $arg; 
    my %urls; 
    my @web; 
    $| = 1; 
    my $VERSION = "Bot/1.1"; 
     
     
     
     
    my $ua = LWP::Parallel::UserAgent->new('Mozilla/5.0 (compatible; Bot/1.1'); 
       $ua->max_hosts(50); 
       $ua->max_req(50); 
       $ua->wait(0); 
       $ua->max_redirect(8000000000); 
       $ua->protocols_allowed( [ 'http' ] ); 
       $ua->protocols_forbidden( [ 'file', 'mailto', 'https', 'ftp', 'socks', 'gopher'] ); 
       $ua->requests_redirectable( [ 'HEAD' ] ); 
       $ua->timeout(4); 
       $ua->env_proxy; 
       $ua->nonblock(1); 
       $ua->duplicates(1);    
       $ua->remember_failures(1); 
       $ua->redirect(1); 
     
       my $cookie_jar = HTTP::Cookies->new( 
        file => 'lwp_cookies.dat', 
        autosave => 1, 
      ); 
     
       $ua->cookie_jar($cookie_jar); 
     
     
    #===========================================================================# 
    #                               The Robot                                   # 
    #===========================================================================# 
     
    robot(@ARGV);
     
    {
        my %vus;
        my @avoir;
        sub  robot {
                 #gerer la liste
                 foreach my $link ( @_ ) {
                      next if defined $vus{$link}; # deja vu
                      push( @avoir, $link ); # les nvx url vont a la fin de la liste
                  }
                return if $#avoir == -1;  # plus rien à voir
             #parser les urls
             while (my $page = shift @avoir; ++$vus{$page}) {
     
               my $verif_links = verif_link_format($page);
     
     
                  if ($verif_links == 1 ) {
     
                        my $req = HTTP::Request->new( 'GET', $page );
     
     
                            $req->header('Accept' => [
                                         qw(
                                             text/html application/xhtml+xml application/msexcel
                                             application/msword application/pdf application/rtf
                                             application/x-javascript application/x-httpd-php
                                             text/rtf text/nux application/sxc application/sxw
                                             application/sxd application/mdi application/x-httpd-asp
                                             application/x-httpd-aspx application/x-httpd-mspx
                                             application/x-httpd-cfm application/x-httpd-jthml
                                             application/x-httpd-pm )
     
                                              ]
                                   );
     
                        my $res = $ua->request($req, $arg, 4096);
     
         if ( $res->is_success ) {
     
     
          my ($code, $date, $size, %page, $base, $content_type);
     
         $code = $res->content;
     
         $date = date();
     
         $size = size($page);
     
         $base = $res->base;
     
         $content_type = $res->content_type;
     
              %page = (
     
     
                result => [
     
                             "$code", "$page",
                             "$date", "$size KB",
                             "$content_type"
     
                          ]
     
     
                );
     
                #print "$page{'result'}->[0]\n";
                print "$page{'result'}->[1]\n";
                #print "$page{'result'}->[2]\n";
                #print "$page{'result'}->[3]\n";
                #print "$page{'result'}->[4]\n";
     
               my $p = HTML::LinkExtor->new(\&callback);
     
                   $p->parse($code);
     
                         @web = map { $_ = url($_, $base)->abs; } @web;
     
                   @web = illegal(@web);
     
                         @web = grep_array(@web);
     
     
                        robot(@web);
     
                    }
                     else {
                            print "Bad link\n";
                    }
                  }
                   else {
     
                            print "Bad link\n";
     
                   }
               }
         }
    }
     
    #===========================================================================# 
    #                               Extract links                               # 
    #===========================================================================# 
     
      sub callback { 
         my($tag, %attr) = @_; 
         return if $tag ne 'a'; 
         push(@web, values %attr); 
      } 
     
     
    #===========================================================================# 
    #                      Keep only good extension to extor                    # 
    #===========================================================================# 
     
    sub verif_link_format 
    { 
     foreach my $link_format ( @_ ) 
     { 
       if ( $link_format =~ m!^http://[_a-zA-Z0-9-]+\.[_a-zA-Z0-9-]+[.a-zA-Z0-9-]*(/~|/?)[/_.a-zA-Z0-9#?&=+-]*$!i) { 
     
         return 1; 
     
       } 
        else 
       { 
     
         return 0; 
     
       } 
     } 
    } 
     
     
    #===========================================================================# 
    #                                   Get date                                # 
    #===========================================================================# 
     
    sub date 
    { 
      my @tab_date =localtime(time); 
      my $jour = $tab_date[3]; 
      my $mois = ($tab_date[4]+1); 
      my $annee =  ($tab_date[5]+1900); 
      return ("$jour/$mois/$annee"); 
    } 
     
     
     
    #===========================================================================# 
    #                                   Get size                                # 
    #===========================================================================# 
     
    sub size 
    { 
     foreach my $url ( @_ ) { 
     
          my $size = HTTP::Size::get_size( $url ); 
     
          if (defined $size) 
          { 
                my $result = $size/1024; 
                   $result = floor($result); 
     
             return $result; 
     
          } else { 
     
             return "?"; 
     
          } 
       } 
    }
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  13. #13
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 56
    Points
    56
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while (my $page = shift @avoir; ++$vus{$page}) {
    Voici l'un des problèmes. ++$vus{$page} doit aller après le "{", c'est-à-dire à l'intérieur de la boucle.

  14. #14
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    Bon sa marche , mais je trouve le robot lent , alors qu'il est censé être rapide etant donné qu'il utilise que le config de LWP .

    Auriez vous des suggestions pour améliorer la vitesse de mon robot ?

    merci
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  15. #15
    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
    Si ton script est plus lent que l'autre robot présenté plus haut c'est dû à des erreurs de ta part, car il n'y a aucune raison qu'il en soit ainsi (en fait il devrait même être plus rapide). Par ailleurs tu devrais utiliser LWP:arallel comme nous en avions discuté auparavant.

    --
    Jedaï

  16. #16
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 56
    Points
    56
    Par défaut
    Tu pourrais essayer d'éliminer certains url (selon tes besoins). Par exemple, ce n'est pas la peine de chercher http://example.com et http://example.com#top, etc.

  17. #17
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    Citation Envoyé par Jedai
    Si ton script est plus lent que l'autre robot présenté plus haut c'est dû à des erreurs de ta part, car il n'y a aucune raison qu'il en soit ainsi (en fait il devrait même être plus rapide). Par ailleurs tu devrais utiliser LWP:arallel comme nous en avions discuté auparavant.

    --
    Jedaï
    Bé justement j'utilise ce module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    require LWP::Parallel::UserAgent;
    .


    Je vais replancher sur la doc
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  18. #18
    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
    Tu ne l'utilises pas : tu l'importes et tu l'utilises pour faire une seule requète à la fois.... Alors que l'intérêt du module est de pouvoir en faire plusieurs en simultané !

    --
    Jedaï

  19. #19
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    Bon j'ai réfléchie a la la meilleur façon de parallélisé les requêtes après un peu de torture mentale je pense q'un structure comme ce la derait approprié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $req = [
     
               HTTP::Request->nex('GET', $link)
     
            ];

    par contre la difficulté est que que ce " hash " , ne contiendra toujours qu'un élément car je serais obliger de faire un foreach

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    foreach ($link) {
     
         $req = [
     
               HTTP::Request->nex('GET', $link)
     
            ];
    ...  
    }

    donc faut trouver le moyen d'en créer un " dynamiquement " pour qu'il contiennt plus de requêtes .

    En clair ce voie pas du tout comment parallélisé .

    Je cherche , Je cherche
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Franchement j'avoue que c'est bizare comme module la doc d'autant que la doc offciel ne montre pas comment paralélisé

    http://cpan.uwinnipeg.ca/htdocs/Para.../Parallel.html

    Ta soluce avec $??? = [ !!!!! ]; est la bonne voie

    seulement même après avoir lue la doc que fournit mon lien bé j'ai pas tout compris parce que le code est chelou.

    J'espère que d'autre plus fort que moi pourrons te filer un cp de main , parce que ton robot a part sa il est super cool

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/04/2010, 16h08
  2. [Mail] Problème de récupération de paramètre
    Par bodysplash007 dans le forum Langage
    Réponses: 9
    Dernier message: 24/04/2007, 22h26
  3. probléme de récupération de paramétres
    Par monphp dans le forum ASP.NET
    Réponses: 2
    Dernier message: 25/02/2007, 16h45
  4. problème de récupération du paramètre url en php
    Par akazim dans le forum Langage
    Réponses: 6
    Dernier message: 08/02/2007, 19h00
  5. Réponses: 1
    Dernier message: 10/07/2006, 13h40

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