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 :

Probleme de transmission de paramètres :(


Sujet :

Web 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 Probleme de transmission de paramètres :(
    Bonjour , j'ai coder un crawler sont probleme c'est qu'il n'est pas récursif bien qu'il est été prévue a cette effet , en fait il ce bloque sur la première donné qui lui arrive.

    disont que @_ contient www.free.fr et clubic.com ben il ce bloque sur www.free.fr


    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
    #!/usr/bin/perl -w
    use strict;
    use URI::URL;
    use HTTP::Request;
    use HTTP::Response;
    use HTTP::Cookies;
    require LWP::Parallel::RobotUA;
    use HTML::Parse qw(parse_html);
    use WWW::RobotRules;
     
    #===========================================================================#
    #                          Begin of configuration                           #
    #===========================================================================#
     
     
    $| = 1;                                    # Buffer
    my $arg;
    my $VERSION = "Bot/1.1";                  # Nom du robot
     
    my $ua = LWP::Parallel::RobotUA->new('Mozilla/5.0 (compatible; Bot/1.1', 'bot@robotx.com');
       $ua->delay(0);
       $ua->max_hosts(400);                                                                   # sets maximum number of locations accessed in parallel
       $ua->max_req(400);                                                                     # sets maximum number of parallel requests per host
       $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->redirect(1);                                   # follow redirects
     
       my $cookie_jar = HTTP::Cookies->new(
        file => 'lwp_cookies.dat',
        autosave => 1,
      );
     
       $ua->cookie_jar($cookie_jar);
     
     
    #===========================================================================#
    #                               The Robot                                   #
    #===========================================================================#
     
    my %urls;
     
    @urls{ @ARGV } = (1) x @ARGV;
     
    foreach my $link ( keys %urls ){
      &robot($link);
    }
     
     
    sub robot
    {
     foreach my $link ( @_ ) {
     
     my $link = $_[0];
     
       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, %page, $base);
     
         $code = $res->content;
     
     
         $base = $res->base;
     
              %page = (
     
     
                result => [
     
                             "$code", "$link"
     
                          ]
     
     
                );
     
                print "$page{'result'}->[0]\n";
                print "$page{'result'}->[1]\n";
     
            my $extor = extor_links($code,$base);
     
            robot($extor);
     
      }
     }
    }
     
     
     
     
    #===========================================================================#
    #                               Extract links                               #
    #===========================================================================#
     
     
    sub extor_links
    {
    my($url, %saw, @urls);
     
      my $html=$_[0];
      my $base=$_[1];
     
      foreach ($html) {
     
        my $ht_tree = parse_html($_[0]);
        my ($linkpair, $fqurl);
     
          foreach $linkpair (@{$ht_tree->extract_links(qw<a>)}) {
            my($link,$elem) = @$linkpair;
             push(@urls, $fqurl)
                 unless $saw{ $fqurl = url($link,$base)->abs->as_string }++;
        }
     
         # print join("\n", sort keys %saw), "\n";
     
           my $urlx = join("\n", sort keys %saw), "\n";
     
          return $urlx;
      }
    }

    Merci de votre aide
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  2. #2
    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
    Personne veut m'aider
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  3. #3
    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
    Les donnés arrivent bien a on programme j'ai vérifier en faisant un
    print "$_[0]\n";
    je pense que c'est mon foreach qui n'est pas bon mais je trouve pas de solutions please


    --------------------

    Bon j'ai fait quelque testes simple j'ai trouvé le probleme mais pas la solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if ($res->is_success) {
     print "$link\n";
    le
    if ($res->is_success) {
    fait sauter $link , il s'arrete sur la première valeur de
    $_[0]
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  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
    J'trouve pas de solution
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  5. #5
    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
    J'ai tout essayé j'arrive pas a empecher au log de s'arréter a le première valeur de $link , pourtant mon code est bon
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  6. #6
    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
    Je seche dessus je comprend pas pourquoi
    $res->is_success
    fait cette effet a ma fonction
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  7. #7
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Bonjour

    Et si tu testais plutôt la valeur de retour de ta requête ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $code = $res->code;
    if($code==200){
    /Succès
    }
    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  8. #8
    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
    Sa donne rien c c'est toujours la même chose .

    Personne n'aurais une idée géniale qui lui trotte dans la tête ???
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  9. #9
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $link ( keys %urls ){ 
      &robot($link); 
    }
    la fonction robot est appelé, et tu lui donnes en argument $link

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sub robot 
    { 
     foreach my $link ( @_ ) { 
     
     my $link = $_[0]; 
    .....
    ......
    tu foreach sur quoi ?????
    @_ contient uniquement $link passé en argument, à revoir!!!
    bref c'est codé un peu bizaremment. Commente mieux ton script.

  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
    foreach my $link ( keys %urls ){
    &robot($link);
    }

    sa me permet de lancer le spider en ligne de commande

    sub robot
    {
    foreach my $link ( @_ ) {

    my $link = $_[0];
    .....
    ......
    Heu il y a une erreur a
    my $link = $_[0]
    je l'est supprimé mais c toujours pareil.

    Ben le foreach c sur les liens en retour. J'ai d'ailleur testé sans ben le résultat est toujours le même
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  11. #11
    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 djibril
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $link ( keys %urls ){ 
      &robot($link); 
    }
    la fonction robot est appelé, et tu lui donnes en argument $link

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sub robot 
    { 
     foreach my $link ( @_ ) { 
     
     my $link = $_[0]; 
    .....
    ......
    tu foreach sur quoi ?????
    @_ contient uniquement $link passé en argument, à revoir!!!
    bref c'est codé un peu bizaremment. Commente mieux ton script.
    Que veut tu dire par

    @_ contient uniquement $link passé en argument, à revoir!!!
    ????????

    parce que quand je fait un print "$link"; au début de
    sub robot
    ben les donnes renvoyé par
    extor_links()
    sont bien la mais c'est comme si elles s'évaporaient après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( $res->is_success ) {
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  12. #12
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Citation Envoyé par scaleo
    Que veut tu dire par
    @_ contient uniquement $link passé en argument, à revoir!!!
    ????????
    tu fais dans un premier temps
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $link ( keys %urls ){
      &robot($link);
    }
    keys %urls est un tableau possédant les deux url spécifié en ligne de commande je suppose. Donc tu fais un foreach dessus, et donc $link correspond aux cases de ton tableau. Ainsi, premierement $link sera une chaine de caractere egal à www.free.fr
    Ensuite tu appelle ta fonction robot.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sub robot
    {
     foreach my $link ( @_ ) {
     
     my $link = $_[0];
    .....
    ......
    tu passes en argument à ta fonction $link Dans ta fonction robot, www.free.fr sera recupere par @_. donc @_ est un tableau d'une seule case car il n'y a qu'un seul argument.
    Pas besoin de faire un foreach dans ta fonction robot, tu peux juste faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $link = $self; au lieu de my $link = $_[0];
    sinon, evite d'utiliser les mêmes noms de variables car tu as des $link un peu partout et c'est sujet à ecraser des données, faire des conneries.

    Fait déjà ces changements et dis nous où t'en ai!!!!!!!!

  13. #13
    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 alors j'ai testé ta soluce avec
    my $link = $self;
    , mais perl me sort une erreur comme quoi n'est pas déclaré


    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
    sub robot
    {
     #foreach my $link ( @_ ) {
     
        my $link = $self;
     
        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($code);
     
         $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 $extor = extor_links($code,$base);
     
            robot($extor);
     
     # }
     }
    }
     
     
     
     
     
     
     
     
     
     
     
    #===========================================================================#
    #                               Extract links                               #
    #===========================================================================#
     
     
    sub extor_links
    {
    my($url, %saw, @url);
     
      my $html=$_[0];
      my $base=$_[1];
      foreach ($html) {
     
        my $ht_tree = parse_html($_[0]);
        my ($linkpair, $fqurl);
     
          foreach $linkpair (@{$ht_tree->extract_links(qw<a>)}) {
            my($link,$elem) = @$linkpair;
             push(@url, $fqurl)
                 unless $saw{ $fqurl = url($link,$base)->abs->as_string }++;
        }
     
         # print join("\n", sort keys %saw), "\n";
     
         my $urlx = join("\n", sort keys %saw), "\n";
     
          return $urlx;
      }
    }
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  14. #14
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    excuse moi, je me suis trompé, fais plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $link=shift;
    au lieu de 
    my $link = $self;
    pardon, je me suis emballé car je fais souvent

  15. #15
    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
    Ben j'ai toujour le même résultat

    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
    sub robot
    {
     #foreach my $link ( @_ ) {
     
        my $link=shift;
     
        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($code);
     
         $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 $extor = extor_links($code,$base);
     
            robot($extor);
     
      #}
     }
    }
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  16. #16
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Hello,

    Je ne suis pas expert en Crawlers, et je n'ai pas pu tester faute de disponibilité des modules utilisés pour ma plate-forme.

    Plusieurs points attirent cependant mon attention.

    Ainsi que l'a fort justement signalé djibril, l'appel à la fonction robot, et la récupération des paramètres dans celle-ci sont bizarres ...

    Qui plus est, la correction ne doit pas arranger les choses vis à vis de l'appel récursif qui en est fait en lui passant le résultat de extor_link.

    Pour ce qui est de l'appel principal, je ferai simplement Dans la fonction, je gèrerai les simplement avec le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $link (@_) {
    et comme signalé auparavant, ne pas redéfinir $link, ni utiliser l'élément 0 du tableau de paramètres puis qu'il faut bien le parcourir ...

    A la fin de la fonction robot, tu as un appel à extor_links. Visiblement, celle ci renvoie un scalaire que tu passes à robot, recursivement, dans $extor. A ce point, je crois que tu devrais utiliser une liste @extor ... on modifiera @extor_links pour qu'elle retourne une liste, et c'est elle que tu récupéreras dans @extor pour passer à robot, qui la traitera par le foreach que l'on remet.

    Au début de la fonction extor_links, tu fais un foreach sur $html ... un foreach sur un scalaire, donc une valeur unique ... Tu devrais pouvoir le supprimer.

    A la fin de extor_links, tu récupére les clefs de saw en les concaténant dans un scalaire, $urlx que tu renvoies à robot pour la récursion. Comme on a modifié robot pour considérer une liste en retour, retournons donc une liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (sort keys %saw);
    D'ailleurs, ton affectation à $urlx contenait un , "\n" de trop, à la fin (séquelle de copier/coller ?)


    Voila, en espérant que ces quelques remarques permettront d'avancer ... désolé de ne pas pouvoir vérifier moi-même ce que j'avance

    Bonne continuation
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  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
    Bon voila mon crawler



    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
    #!/usr/bin/perl -w
    use strict;
    use URI::URL;
    use HTTP::Request;
    use HTTP::Response;
    use HTTP::Cookies;
    require LWP::Parallel::UserAgent;
    use POSIX;
    use HTTP::Size;
    use HTML::Parse qw(parse_html);
     
    #===========================================================================#
    #                          Begin of configuration                           #
    #===========================================================================#
    my $arg;
    $| = 1;                                    # Buffer
    my $VERSION = "Bot/1.1";                  # Nom du robot
     
     
     
     
    my $ua = LWP::Parallel::UserAgent->new('Mozilla/5.0 (compatible; Bot/1.1');
       #$ua->delay(0);
       $ua->max_hosts(400);                                                                   # sets maximum number of locations accessed in parallel
       $ua->max_req(400);                                                                     # sets maximum number of parallel requests per host
       $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->remember_failures(1);
       $ua->redirect(1);                                   # follow redirects
     
       my $cookie_jar = HTTP::Cookies->new(
        file => 'lwp_cookies.dat',
        autosave => 1,
      );
     
       $ua->cookie_jar($cookie_jar);
     
     
    #===========================================================================#
    #                               The Robot                                   #
    #===========================================================================#
     
    my %urls;
     
    @urls{ @ARGV } = (1) x @ARGV;
     
     
    robot (keys %urls);
     
     
    sub robot
    {
     foreach my $link ( @_ ) {
     
       my $confirm = verif_link_format($link);
     
       if ( $confirm == 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($code);
     
         $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";
                print "=====================\n";
     
     
           extor_links($code,$base);
     
     
       }
      }
     }
    }
     
     
     
     
     
     
     
     
     
     
     
    #===========================================================================#
    #                               Extract links                               #
    #===========================================================================#
     
     
    sub extor_links
    {
    my($url, %saw, @url);
     
      my $html=$_[0];
      my $base=$_[1];
      foreach ($html) {
     
        my $ht_tree = parse_html($_[0]);
        my ($linkpair, $fqurl);
     
          foreach $linkpair (@{$ht_tree->extract_links(qw<a>)}) {
            my($link,$elem) = @$linkpair;
             push(@url, $fqurl)
                 unless $saw{ $fqurl = url($link,$base)->abs->as_string }++;
        }
     
    =pod
         print join("\n", sort keys %saw), "\n";
         my $urlx = join("\n", sort keys %saw), "\n";
         return $urlx;
         return (sort keys %saw);
    =cut
     
         robot(sort keys %saw);
     
      }
    }
     
     
     
     
     
    #===========================================================================#
    #                      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;
     
       }
     }
    }

    Il souffre d'un bug , il tourne en rond , regarder ce qui suit vous allez comprendre


    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
    http://www.free.fr
    20/9/2005
    ? KB
    text/html
    =====================
    http://actualite.free.fr/
    20/9/2005
    ? KB
    text/html
    =====================
    http://actualite.free.fr/
    20/9/2005
    ? KB
    text/html
    =====================
    http://actualite.free.fr/
    20/9/2005
    ? KB
    text/html
    =====================
    http://actualite.free.fr/
    20/9/2005
    ? KB
    text/html
    =====================
    http://actualite.free.fr/
    20/9/2005
    ? KB
    text/html
    =====================
    http://actualite.free.fr/
    20/9/2005
    ? KB
    text/html
    =====================
    http://actualite.free.fr/
    20/9/2005
    ? KB
    text/html
    =====================
    http://actualite.free.fr/
    20/9/2005
    ? KB
    text/html
    ===============


    Je pense que sa vient de mon appelle de robot() , dans ma fonction extor_links().


    Ou est ce que je me trompe ???
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  18. #18
    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 il s'agit apparement d'un bug dans ma fonction d'extraction de liensj'ai fait quelque test ben je ne sais pas pourquoi elle ce bloque



    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
    sub extor_links
    {
    my($url, %saw, @url);
     
      my $html=$_[0];
      my $base=$_[1];
      foreach ($html) {
     
        my $ht_tree = parse_html($_[0]);
        my ($linkpair, $fqurl);
     
          foreach $linkpair (@{$ht_tree->extract_links(qw<a>)}) {
            my($link,$elem) = @$linkpair;
             push(@url, $fqurl)
                 unless $saw{ $fqurl = url($link,$base)->abs->as_string }++;
        }
     
     
         #print join("\n", sort keys %saw), "\n";
     
        print join("\n", @url), "\n";
     
     
         robot(@url);
     
      }
    }

    J'ai fait quelques essaie complémentaire ben c bien sa, il y a un blem qd je rapelle la fonction robot()
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  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 voila comment de rapelle robt() maintenant


    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
    sub extor_links
    {
      my($url, %saw, @url);
      my $html=$_[0];
      my $base=$_[1];
     
      foreach ($html) {
     
     
        my $ht_tree = parse_html($_[0]);
        my ($linkpair, $fqurl);
     
          foreach $linkpair (@{$ht_tree->extract_links(qw<a>)}) {
            my($link,$elem) = @$linkpair;
             push(@url, $fqurl)
                 unless $saw{ $fqurl = url($link,$base)->abs->as_string }++;
        }
     
           my %keys_url = (sort keys %saw);
     
           robot(%keys_url);
       }
    }


    En faisant sa j'obtient


    =====================
    http://www.developpez.com
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://morpheus.developpez.com/TechEd-2005/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://morpheus.developpez.com/clickonce/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://access.developpez.com/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://www.developpez.com/cours/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://dotnet.developpez.com/tutoriels/reseau/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://access.developpez.com/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://www.developpez.com/cours/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://dotnet.developpez.com/tutoriels/reseau/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://access.developpez.com/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://www.developpez.com/cours/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://dotnet.developpez.com/tutoriels/reseau/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://access.developpez.com/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://www.developpez.com/cours/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://dotnet.developpez.com/tutoriels/reseau/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://access.developpez.com/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://www.developpez.com/cours/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://dotnet.developpez.com/tutoriels/reseau/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://access.developpez.com/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://www.developpez.com/cours/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://dotnet.developpez.com/tutoriels/reseau/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://access.developpez.com/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://www.developpez.com/cours/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://dotnet.developpez.com/tutoriels/reseau/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://access.developpez.com/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://www.developpez.com/cours/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://dotnet.developpez.com/tutoriels/reseau/
    20/9/2005
    ? KB
    text/html
    ====================
    =====================
    http://access.developpez.com/
    20/9/2005
    ? KB
    text/html
    ====================

    Au début il trouve de nouvelles url ensuite il patine dans la semoule en , de plus il prend de plus en plus de ram .


    Au secour

    Personne n'aurait une idée géniale pour que je finisse enfin ce crawler parce qu'il me rend complètement , en plus je voie par ou est le problème je lui envoie les données comme il faut mais il veut pas
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  20. #20
    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 refais quelque essaie de mon fonction d'extraction d'url


    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
    sub extor_links
    {
      my($url, %saw, @url);
      my $html=$_[0];
      my $base=$_[1];
     
      foreach ($html) {
     
     
        my $ht_tree = parse_html($_[0]);
        my ($linkpair, $fqurl);
     
          foreach $linkpair (@{$ht_tree->extract_links(qw<a>)}) {
            my($link,$elem) = @$linkpair;
             push(@url, $fqurl)
                 unless $saw{ $fqurl = url($link,$base)->abs->as_string }++;
        }
     
           my @keys_url = (sort keys %saw);
     
           robot(@keys_url);
       }
    }
    Et ben le problème ne vient pas d'elle , mais de la transmission des paramètres au robot , je pense que le ligne de commande brouille le script qui ne sait plus qu'elle donné suivre et donc ce bloque.

    Quelqu'un veut il bien me filer un coup de main car moi aussi je nage dans la semoule
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

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

Discussions similaires

  1. Modes de transmission de paramètres
    Par hoss59 dans le forum Langage
    Réponses: 3
    Dernier message: 03/09/2006, 09h08
  2. Réponses: 4
    Dernier message: 05/06/2006, 09h28
  3. Probleme de requetes avec paramètre
    Par Jhulk dans le forum Bases de données
    Réponses: 1
    Dernier message: 21/04/2006, 17h59
  4. Probleme de requetes avec paramètre
    Par Jhulk dans le forum Bases de données
    Réponses: 3
    Dernier message: 19/04/2006, 10h51
  5. [Dates] Probleme de recupération de paramètre ...
    Par acado dans le forum Langage
    Réponses: 4
    Dernier message: 05/04/2006, 10h37

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