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 :

"Emulation de structure" [chiant] lol


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 "Emulation de structure" [chiant] lol
    C'est encore moi et mon robot , pour ceux qui sont nouveaux je travaille sur un robot , pour le "web universitaire".

    J'ai un seul et unique problème avec LWP:arallele::UserAgent

    je n'arrive pas a reproduire la structure dans mon robot

    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
    my $url  = "http://www.cs.washington.edu/";
    my $reqs = [
        HTTP::Request->new( 'GET', $url ),
        HTTP::Request->new( 'GET', $url . "research/ahoy/" ),
        HTTP::Request->new( 'GET', $url . "research/ahoy/doc/paper.html" ),
        HTTP::Request->new(
            'GET', "http://metacrawler.cs.washington.edu:6060/"
        ),
        HTTP::Request->new(
            'GET', "http://www.foobar.foo/research/ahoy/"
        ),
        HTTP::Request->new(
            'GET', "http://www.foobar.foo/foobar/foo/"
        ),
        HTTP::Request->new(
            'GET', "http://www.foobar.foo/baz/buzz.html"
        ),
        HTTP::Request->new( 'GET', $url . "foobar/bar/baz.html" ),
    ];
    dans la doc du module l'exemple suivant est donné

    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
    require LWP::Parallel::UserAgent;
    require LWP::Parallel::RobotUA;
    use HTTP::Request;
    require WWW::RobotRules::AnyDBM_File;
     
     
    my ( $req, $res );
    my $rules = new WWW::RobotRules::AnyDBM_File 'ParallelUA', 'cache';
    my $pua = new LWP::Parallel::RobotUA( "ParallelUA", 'yourname@your.site.com', $rules );
     
    $pua->delay(5);
    $pua->max_req(2);
    $pua->max_hosts(10);
     
     
     
    my $url  = "http://www.cs.washington.edu/";
     
    my $reqs = [
        HTTP::Request->new( 'GET', $url ),
        HTTP::Request->new( 'GET', $url . "research/ahoy/" ),
        HTTP::Request->new( 'GET', $url . "research/ahoy/doc/paper.html" ),
        HTTP::Request->new( 'GET', "http://metacrawler.cs.washington.edu:6060/" ),
        HTTP::Request->new( 'GET', "http://www.foobar.foo/research/ahoy/" ),
        HTTP::Request->new( 'GET', "http://www.foobar.foo/foobar/foo/" ),
        HTTP::Request->new( 'GET', "http://www.foobar.foo/baz/buzz.html" ),
        HTTP::Request->new( 'GET', $url . "foobar/bar/baz.html" ),
    ];
     
     
    local ($\) = "";
     
     
    foreach $req (@$reqs)
    {
        print "Registering '" . $req->url . "'\n";
        $pua->register( $req, \&handle_answer );
    }
       my $entries = $pua->wait(1);
     
     
     
    foreach ( keys %$entries )
    {
        $res = $entries->{$_}->response;
          my $r = $res;
        my @redirects;
        while ($r) {
            $res = $r;
            $r   = $r->previous;
            push( @redirects, $res ) if $r;
        }
     
        print "Answer for '", $res->request->url, "' was \t", $res->code, ": ", $res->message, "\n";
     
        foreach (@redirects) {
     
         print "\t", $_->request->url, "\t", $_->code, ": ", $_->message, "\n";
     
        }
    }
     
     
    sub handle_answer
    {
        my ( $content, $response, $protocol, $entry ) = @_;
        print "Handling answer from '", $response->request->url, ": ", length($content), " bytes, Code ", $response->code, ", ", $response->message, "\n";
     
        if ( length($content) )
        {
            $response->add_content($content);
        }
        else
        {
            return undef;
        }
    }
    Et voila mon robot

    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
     
    {
      my %vus;
      my @avoir;
     
     
    sub robot
    {
     foreach my $url ( @_ )
     {
       next if defined $vus{$url};
       push(@avoir, $url);
     }
      return if $#avoir == -1;
     
     while (my $page = shift @avoir) {
     
      ++$vus{$page};
     
       my $link=$page;
     
       my $verif_links = verif_link_format($link);
     
           if ( $verif_links == 1 ) {
     
      my $reqs = [
         HTTP::Request->new('GET', $link)
      ];
     
       foreach my $req (@$reqs) {
     
           $req->header('Accept' => [
                         qw( text/html )
     
        ]
    );
       # print "Registering '".$req->url."'\n";
        if ( my $res = $ua->register ($req) ) {
            print STDERR $res->error_as_HTML;
          }
       }
     
       my $entries = $ua->wait(0.3);
     
      foreach (keys %$entries) {
     
        my $res = $entries->{$_}->response;
     
       # print "Answer for '",$res->request->url, "' was \t", $res->code,": ",
       # $res->message,"\n";
     
         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;
     
              robot(@web);
     
     
       }
        else
       {
         print "Request failed\n";
       }
      }
      }
       else
      {
        print "Bad link\n";
       }
      }
     }
    }


    Je n'arrive pas a faire plusieurs requetes en simultané , j'ai testé tout un tas de soluces mais rien a faire je ne trouve pas de solution (il n'y a d'ailleur pas que moi a qui sa prend la tête lol)

    Une des solutions les plus pertinente que j'ai testé est
    Voici une possibilité (pas la seule, loin de là).

    Au début de ta fonction, quand tu définis %vus et @avoir, tu rajoute ceci:
    Code:

    {
    my %vus;
    my @avoir;

    sub next_avoir {
    my @a_retourner;
    for (0..2) {
    if ( my $url = shift @avoir) {
    push( @a_retourner, $url );
    }
    }
    return @a_retourner;
    }


    Maintenant, plutôt que de dire:
    Code:

    while ( my $page = shift @avoir ) {


    tu peux dire:
    Code:

    while ( my @pages = next_avoir() ) {


    Ce qui te donnes trois (ou plus, suffit de changer la boucle plus haut) pages à chaque itération.

    Mais il y a encore du boulot, parce qu'il faut adapater la suite du code au fait que tu reçois désormais trois url en meme temps. (Aussi: ceci n'est pas testé, j'ai peut-être oublié qqch).

    Merci de votre aide (même si je suis chiant avec mon spider)
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

  2. #2
    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
    Oula , lé jolie ton robot.

    mais reproduire une tel structure me parait compliqué sans revoir en partie ton code

  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
    Après de nombreux essaies je suis pavenue a une solution qui marche en principe.

    voici un ti bout de code qui vous aideras a comprendre


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                   @i = ( "1", "2", "3", "4", "5", "6", "7", "8", "9" );
     
     
     
         %i = ( result => [ "@i" ] );
     
     
     
             print "$i{'result'}->[0]\n";

    Je me suis dit que si je faisait

    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 %vus;
      my @avoir;
     
    sub next_avoir { 
        my @a_retourner; 
        for (0..2) { 
              if  ( my $url = shift @avoir) {
                     my $web = [ HTTP::Request->new('GET', $url) ];
                  push( @a_retourner, $web ); 
              } 
          } 
         return @a_retourner; 
    } 
     
    ....

    je change mon while par celui-ci



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      while ( my @pages = next_avoir() ) {
     
      ++$vus{@pages};


    et la commence les probèmes

    Je met donc met request dans un hash

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my %reqs = ( result => [ "@pages" ] );
    Pour récupérer les hash de requetes j'avais fait


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $req ($reqs{'resukt'}[0]}) {
    Mais sa ne marche pas !!

    Qu'est ce que j'ai boublié ?
    Ou ce trouve mon erreur ?

    mici
    Vista powaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ::

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