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

Modules Perl Discussion :

petit soucie avec POE ( Component::Pool::Thread )


Sujet :

Modules Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut petit soucie avec POE ( Component::Pool::Thread )
    J'ai dans l'idée de multithreadé une applie en utilisant POE car l'utilisation directe des threads est impossible a cause de problème de réentrance que POE justement résoud .

    J'ai donc construit un petit code de teste pour apprendre a maitriser POE, mais je me heurte a un problème que voici j'ai un thread ( Thread::Queue) qui contient une file d'attente chaque fois que POE lance un thread celui ci prend une donnée dans la file et l'affiche mais voila j'ai des problème de redondance les valeurs sont affiché plusieur fois et ce n'est pas du tout ce que je veut je veut que chaque thread traite une donnée différente.

    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
    #!/usr/bin/perl -w
    use strict;
    use diagnostics;
    use POE qw( Component::Pool::Thread );
    use Thread::Queue;
     
    # Création d'une nouvelle file d'attente
    my $DataQueue = Thread::Queue->new;
     
    # Un ti tableau avec a bouffer pr les threads
    my @k = qw/a b c d e f g h i j k l m /;
     
    # On entasse des données dans la file d'attente
    foreach my $i ( @k ) {
     print " $i \n";
    $DataQueue->enqueue( $i );
    }
     
     
     POE::Component::Pool::Thread->new
        ( MinFree       => 2,
          MaxFree       => 5,
          MaxThreads    => 15,
          StartThrneads => 5,
          Name          => "ThreadPool",
          EntryPoint    => \&thread_entry_point,
          CallBack      => \&result_handler,
          inline_states => {
              _start => sub {
                             my ($kernel, $heap) = @_[ KERNEL, HEAP ];
                          while ( $DataQueue->pending() > 0 ) {
                               my $arguements = $DataQueue->dequeue;
                               # We are inside the component session
                               $kernel->yield(run => $arguements);
                               $kernel->post(ThreadPool => run => $arguements);
                      }
                 },
             }
        );
     
    # Affiche les données des threads
    sub thread_entry_point {
     #   my (@arguements) = @_;
     my $arg = shift;
        print "  $arg \n";
        return 1;
     }
     
     sub result_handler {
        my ($kernel, $result) = @_[ KERNEL, ARG0 ];
        $result == 1;
        return;
     }
     
     POE::Kernel->run();
    il produit le résultat suivant :

    a
    b
    c
    d
    e
    f
    g
    h
    i
    j
    k
    l
    m

    a

    a

    b

    b

    c

    c
    etc...
    alors que je veut


    a
    b
    c
    d
    e
    f
    g
    h
    i
    j
    k
    l
    m

    a

    b

    c
    etc...

    merci de votre aide, et bon codage !!!

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut
    Perl n'a une petite idée ?

  3. #3
    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
    Essaie :
    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
     
    #!/usr/bin/perl -w
    use strict;
    use diagnostics;
    use POE qw( Component::Pool::Thread );
    use Thread::Queue;
    use threads::shared;
     
    # Création d'une nouvelle file d'attente
    my $DataQueue = Thread::Queue->new;
     
    # Un ti tableau avec a bouffer pr les threads
    my @k = qw/a b c d e f g h i j k l m /;
     
    # On entasse des données dans la file d'attente
    foreach my $i ( @k ) {
     print " $i \n";
    $DataQueue->enqueue( $i );
    }
     
     
     POE::Component::Pool::Thread->new
        ( MinFree       => 2,
          MaxFree       => 5,
          MaxThreads    => 15,
          StartThrneads => 5,
          Name          => "ThreadPool",
          EntryPoint    => \&thread_entry_point,
          CallBack      => \&result_handler,
          inline_states => {
              _start => sub {
                             my ($kernel, $heap) = @_[ KERNEL, HEAP ];
                          while ( $DataQueue->pending() > 0 ) {
                               my $arguements :shared = $DataQueue->dequeue;
                               # We are inside the component session
                               # $kernel->yield(run => $arguements);
                               $kernel->post(ThreadPool => run => $arguements);
                      }
                 },
             }
        );
     
    # Affiche les données des threads
    sub thread_entry_point {
     #   my (@arguements) = @_;
     my $arg = shift;
        print "  $arg \n";
        return 1;
     }
     
     sub result_handler {
        my ($kernel, $result) = @_[ KERNEL, ARG0 ];
        $result == 1;
        return;
     }
     
     POE::Kernel->run();
    --
    Jedaï

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut
    Merci Jedai ta soluce fonctionne bien , mais j'ai encore un petit soucie , voila mon application est un web crawler je voudrais pouvoir lancer plusieur bot simultanément pour l'instant je fait cela ( si je lance un thread par robot sa plante donc monothreading powaaa )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sub main {
     while ( $job->pending() > 0 ) {
        my $lien  = $job->dequeue;
        my $rien  = $Core->Spider( $lien );
     }
     while ( $job->pending() < 1 ) {
       # on demande a bouffer
       my $fall = job();
     }
     &main;
    }
    J'ai fait quelque essaie avec ton code mais le probème c'est que lorsqu'il n'y a plus de données dans la file d'attente je n'arrive pas a lancer un traitement pour la remplir a nouveau

    voila 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
    #!/usr/bin/perl -w
    use strict;
    use diagnostics;
    use POE qw( Component::Pool::Thread );
    use Thread::Queue;
    use threads::shared;
     
    BEGIN {
     use CGI::Carp qw(carpout);
     open(LOG, ">>./log.txt") or die ":(";
     carpout(*LOG);
    }
     
     
     
    # Création d'une nouvelle file d'attente
    my $DataQueue = Thread::Queue->new;
     
    # Un ti tableau avec a bouffer pr les threads
    my @k = qw/a b c d e f g h i j k l m /;
     
    # On entasse des données dans la file d'attente
    foreach my $i ( @k ) {
     print " $i \n";
    $DataQueue->enqueue( $i );
    }
    # shutdown 
    my $r = 1;
     POE::Component::Pool::Thread->new
        ( MinFree       => 2,
          MaxFree       => 5,
          MaxThreads    => 15,
          StartThrneads => 5,
          Name          => "ThreadPool",
          EntryPoint    => \&thread_entry_point,
          CallBack      => \&result_handler,
          inline_states => {
              _start => sub {
                             my ($kernel, $heap) = @_[ KERNEL, HEAP ];
                      while ( $DataQueue->pending() > 0 ) {
                        $r += 1;
                               my $arguements :shared = $DataQueue->dequeue;
                               # We are inside the component session
                               # $kernel->yield(run => $arguements);
                               $kernel->post(ThreadPool => run => $arguements);
                      }
                      while ( $DataQueue->pending() < 1  and $r > 1) {
                        foreach my $i ( @k )
                        {
                           $DataQueue->enqueue( $i );
                        }
                      }
                 },
             }
        );
     
     
     
    # Affiche les données des threads
    sub thread_entry_point {
     #   my (@arguements) = @_;
     my $arg = shift;
        print "  $arg \n";
        return 1;
     }
     
     sub result_handler {
        my ($kernel, $result) = @_[ KERNEL, ARG0 ];
        $result == 1;
        return;
     }
     
     POE::Kernel->run();
    Qaund je fait Ctrl + C pour quitter l'applie pour me génre les erreurs suivante


    Uncaught exception from user code:
    _default caught state: _signal at G:/Program Files/Perl/site/lib/POE/Component/Pool/Thread.pm line 77.
    at G:/Program Files/Perl/site/lib/POE/Component/Pool/Thread.pm line 77
    POE::Component:ool::Thread::__ANON__('undef', 'POE::Session=ARRAY(0x1f946b8)', 'POE::Kernel=ARRAY(0x1c7d890)', 'HASH(0x1f94670)', '_default', 'POE::Kernel=ARRAY(0x1c7d890)', 'undef', 'G:/Program Files/Perl/site/lib/POE/Loop/PerlSignals.pm', 31, ...) called at G:/Program Files/Perl/site/lib/POE/Session.pm line 622
    POE::Session::_invoke_state('POE::Session=ARRAY(0x1f946b8)', 'POE::Kernel=ARRAY(0x1c7d890)', '_signal', 'ARRAY(0x1fb9474)', 'G:/Program Files/Perl/site/lib/POE/Loop/PerlSignals.pm', 31) called at G:/Program Files/Perl/site/lib/POE/Kernel.pm line 928
    POE::Kernel::_dispatch_event('POE::Kernel=ARRAY(0x1c7d890)', 'POE::Session=ARRAY(0x1f946b8)', 'POE::Kernel=ARRAY(0x1c7d890)', '_signal', 4096, 'ARRAY(0x1fb9474)', 'G:/Program Files/Perl/site/lib/POE/Loop/PerlSignals.pm', 31, 1152913693.25086, ...) called at G:/Program Files/Perl/site/lib/POE/Kernel.pm line 858
    POE::Kernel::_dispatch_event('POE::Kernel=ARRAY(0x1c7d890)', 'POE::Kernel=ARRAY(0x1c7d890)', 'POE::Kernel=ARRAY(0x1c7d890)', '_signal', 16, 'ARRAY(0x1fb9474)', 'G:/Program Files/Perl/site/lib/POE/Loop/PerlSignals.pm', 31, 1152913693.24991, ...) called at G:/Program Files/Perl/site/lib/POE/Resource/Events.pm line 246
    POE::Kernel::_data_ev_dispatch_due('POE::Kernel=ARRAY(0x1c7d890)') called at G:/Program Files/Perl/site/lib/POE/Loop/Select.pm line 325
    POE::Kernel::loop_do_timeslice('POE::Kernel=ARRAY(0x1c7d890)') called at G:/Program Files/Perl/site/lib/POE/Loop/Select.pm line 333
    POE::Kernel::loop_run('POE::Kernel=ARRAY(0x1c7d890)') called at G:/Program Files/Perl/site/lib/POE/Kernel.pm line 1072
    POE::Kernel::run('POE::Kernel') called at C:\Documents and Settings\Siaoly\Bureau\0.pl line 52
    main::__ANON__('undef', 'POE::Session=ARRAY(0x1f946b8)', 'POE::Kernel=ARRAY(0x1c7d890)', 'HASH(0x1f94670)', '_start', 'POE::Kernel=ARRAY(0x1c7d890)', 'undef', 'G:/Program Files/Perl/site/lib/POE/Kernel.pm', 1290, ...) called at G:/Program Files/Perl/site/lib/POE/Session.pm line 622
    POE::Session::_invoke_state('POE::Session=ARRAY(0x1f946b8)', 'POE::Kernel=ARRAY(0x1c7d890)', '_start', 'ARRAY(0x1c34528)', 'G:/Program Files/Perl/site/lib/POE/Kernel.pm', 1290) called at G:/Program Files/Perl/site/lib/POE/Kernel.pm line 928
    POE::Kernel::_dispatch_event('POE::Kernel=ARRAY(0x1c7d890)', 'POE::Session=ARRAY(0x1f946b8)', 'POE::Session=ARRAY(0x1f946b8)', '_start', 4, 'ARRAY(0x1c34528)', 'G:/Program Files/Perl/site/lib/POE/Kernel.pm', 1290, 1152913687.5417, ...) called at G:/Program Files/Perl/site/lib/POE/Kernel.pm line 1287
    POE::Kernel::session_alloc('POE::Kernel=ARRAY(0x1c7d890)', 'POE::Session=ARRAY(0x1f946b8)') called at G:/Program Files/Perl/site/lib/POE/Session.pm line 171
    POE::Session::try_alloc('POE::Session=ARRAY(0x1f946b8)') called at G:/Program Files/Perl/site/lib/POE/Session.pm line 532
    POE::Session::create('POE::Session', 'inline_states', 'HASH(0x1f945b0)') called at G:/Program Files/Perl/site/lib/POE/Component/Pool/Thread.pm line 213
    POE::Component:ool::Thread::new('POE::Component:ool::Thread', 'MinFree', 2, 'MaxFree', 5, 'MaxThreads', 15, 'StartThrneads', 5, ...) called at C:\Documents and Settings\Siaoly\Bureau\0.pl line 56
    A thread exited while 14 threads were running at G:/Program Files/Perl/site/lib/POE/Component/Pool/Thread.pm line 77.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    pourkoi lancer plusieurs process? (ou plusieurs thread)
    POE est justement fait pour faire du multi tache dans un seul et meme process: tu peux gerer plsuieurs telechargements simultanément sans aucun probleme avec POE.
    Si tu decide de faire du multiprocess il faudra que tu gere la synchronisation entre tes different robot (par exemple savoir si un autre robot a deja vu ou a deja mis en file d'attente une url donnée) et tu devra sans doute passer par des structures sur disque pour faire ca (mysql ou berkeleyDB par exemple), alors que si tu garde tout dans un seul process tu pourra gerer ca en memoire vive

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut
    pourkoi lancer plusieurs process? (ou plusieurs thread)
    POE est justement fait pour faire du multi tache dans un seul et meme process: tu peux gerer plsuieurs telechargements simultanément sans aucun probleme avec POE.
    Si tu decide de faire du multiprocess il faudra que tu gere la synchronisation entre tes different robot (par exemple savoir si un autre robot a deja vu ou a deja mis en file d'attente une url donnée) et tu devra sans doute passer par des structures sur disque pour faire ca (mysql ou berkeleyDB par exemple), alors que si tu garde tout dans un seul process tu pourra gerer ca en memoire vive
    Je veut lancer plusieur thread parce que le web_client de POE ne gère pas les robots.txt et les cookies ni meme le pragma keep_alive et donc j'utilise LWP.

    http://poe.perl.org/?POE_Cookbook/Web_Client

    Pour ce qui est de faire en sorte que chaque thread ne traite pas deux fois la meme donnée cela est déjà fait

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    ok je sais pas pourkoi je suis partie dans l'idée que tu voulais faire des process et non des threads. Dans ce cas la synchro est plus facile.
    Donc tu ne fais plus de poe?
    Pour prendre en compte le robots.txt tu peux aussi t'appuier sur les differents parseurs qui existe (il y en a deux sur cpan) et les utiliser avec n'importe quelle librairie HTTP. Pasque si tu compte utiliser l'extention robot de LXP tu va vite en voir les limites.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut
    ok je sais pas pourkoi je suis partie dans l'idée que tu voulais faire des process et non des threads. Dans ce cas la synchro est plus facile.
    Donc tu ne fais plus de poe?
    Pour prendre en compte le robots.txt tu peux aussi t'appuier sur les differents parseurs qui existe (il y en a deux sur cpan) et les utiliser avec n'importe quelle librairie HTTP. Pasque si tu compte utiliser l'extention robot de LXP tu va vite en voir les limites.
    En quoi WWW::RobotRules est il limité ? il me semble qu'il respecte bien le ' standard ' robots.txt .

    Mon but est d'utiliser POE pour lancer plusieur robot en paralèle d'ou l'utilisation du pool de thread POE

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    tout d'abord je te prirais de ne pas utiliser ce genre de smiley si tu veux qu'on discute. Merci.

    WWW::RobotRules n'a rien à voir avec LWP (meme si il fait partie de la meme distrib) : c'est "simplement" un parseur de robots.txt, et c'est l'un des deux parseurs dont je te parlais (l'autre etant WWW-RobotRules-Parser).
    Tu peux utiliser ce genre de module avec n'importe quelle librairie http.
    La libraire "robot" de LWP est LWP::RobotUA: c'est simpelment un LWP::UserAgent qui utilise WWW::RobotRules et met en place des delays. C'est lui qui est tres limité.

    Concernant POE, il n'est pas vraiment fait pour ce que tu souhaite faire: si tu utilise POE le mieux est de tout faire dans POE, avec les differents client http disponibles (il y en a pas mal sur cpan, mais je ne les connais pas).
    Si tu veux faire du multithread alors je te conseil de ne pas utiliser POE et de prendre l'un des nombreux modules sur CPAN pour faire ce genre de choses. D'autre part je te conseil, si tu veux faire un truc serieux et stable, de ne pas utiliser les thread (encore instables et bouffeuse de RAM en perl) mais de vrais process (si tu es sous unix).
    Et la a toi les gleres de synchro.
    En fait je te conseil vraiment de tout faire en asynchrone avec POE, et utiliser les parseur de robots.txt pour simplement filtrer les url. D'ailleurs ces modules sont imcomplets puisque tu devra aussi prendre en compte les robots rules dans les pages HTML, et la tu devra le faire ton filtrage d'url "à la main" dans tous les cas

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par pospos
    tout d'abord je te prirais de ne pas utiliser ce genre de smiley si tu veux qu'on discute. Merci.

    WWW::RobotRules n'a rien à voir avec LWP (meme si il fait partie de la meme distrib) : c'est "simplement" un parseur de robots.txt, et c'est l'un des deux parseurs dont je te parlais (l'autre etant WWW-RobotRules-Parser).
    Tu peux utiliser ce genre de module avec n'importe quelle librairie http.
    La libraire "robot" de LWP est LWP::RobotUA: c'est simpelment un LWP::UserAgent qui utilise WWW::RobotRules et met en place des delays. C'est lui qui est tres limité.

    Concernant POE, il n'est pas vraiment fait pour ce que tu souhaite faire: si tu utilise POE le mieux est de tout faire dans POE, avec les differents client http disponibles (il y en a pas mal sur cpan, mais je ne les connais pas).
    Si tu veux faire du multithread alors je te conseil de ne pas utiliser POE et de prendre l'un des nombreux modules sur CPAN pour faire ce genre de choses. D'autre part je te conseil, si tu veux faire un truc serieux et stable, de ne pas utiliser les thread (encore instables et bouffeuse de RAM en perl) mais de vrais process (si tu es sous unix).
    Et la a toi les gleres de synchro.
    En fait je te conseil vraiment de tout faire en asynchrone avec POE, et utiliser les parseur de robots.txt pour simplement filtrer les url. D'ailleurs ces modules sont imcomplets puisque tu devra aussi prendre en compte les robots rules dans les pages HTML, et la tu devra le faire ton filtrage d'url "à la main" dans tous les cas
    C'est vrais que les threads bouffe pas mal de ram , c'est assez hallucinant a voir, pour ce qui est des process ce n'est pas possible puisque je suis sous windows.

    Si je te suis je peut utiliser POE + WWW::RobotRules + Http::Cookies + Http::Headers + Http::Response

    Je suis preneur !!

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    oui, tu a par exemple POE-Component-Client-HTTP qui utilise des HTTP::Message (donc HTTP::Request/Response, et HTTP::Headers)

    C'est un user agent, donc il te faudra definir ta politique de crawl (et de gestion des robots.txt) par dessus.
    Sinon il y a aussi une librairie de crawl web basée sur POE: Xango
    http://search.cpan.org/~dmaki/Xango-1.08/
    Je ne sais pas ce qu'lle vaut mais le (les) types qui l'editent ont aussi d'autres modules interessants dans le domaine

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut
    Encore merci a toi pospos je me demandais comment ajouter la gestion des robots.txt.

    Je vais étudier ce Xango

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut
    Je suis désolé de vous déranger un fois de plus mais je n'arrive pas a utiliser Xango , en plus de sa Xango ne semble pas prendre en charge les robots.txt , j'ai lu toute la documentation , et jeté un coup d'oeil sur le code il n'existe nul par de référence a WWW::RobotRules ou autre parser de fichiers robots.txt.

    J'ai donc décidé de me rabattre vers POE-Component-Client-HTTP mais il me faut un coup de main pour implementer le support des robots.txt car je ne sais vraiment pas par ou commencer

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    comme je te l'ai dis c'est à toi de le gerer

    En gros le principe de ton robot sera de chopper un epage de demarrage, puis d'en tirer les liens et de les parcourir un par un, en tirant à chaque fois les liens et en les placant en file d'attente.
    Et pour ce faire tu devra faire plusieurs traitements sur les liens extraits:
    - absolutisation (rendre les liens relatifs absolus par rapport à la page source)
    - normalisation (en gros les passer dans le module URI devrait suffire, mais si tu veux faire qq chose de serieux il te faudra aussi virer les id de session, etc...)
    - filtrage des url deja vue (deja collectée ou deja en file d'attente), et la tu aura interet à utiliser une hash stockée sur disque (genre berkeleyDB) pour pas exploser ta RAM
    - filtrage eventuel suivant ce que tu veux crawler (rester ou non a l'interieur d'un site, ou dans du .fr par exemple)
    - filtrage suivant les regles du robtos.txt (quer tu aura collect" au paravant, pour chaque nouveau host que tu rencontrera, et mis l'objet resultant en cache), en utilisant les modules deja cités

    et de meme, en amont de tout cela, lors du parsing de ta page tu devra extraire les regles robots du HTML, pour decider ou non d'extraire les liens de cette page

    tu trouvera sur CPAN à peu pres tous les modules pour faire cette chaine, mais tu devra la faire toi meme au final, car elle depend totalement de ce que tu veux faire avec ce crawler

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Points : 49
    Points
    49
    Par défaut
    comme je te l'ai dis c'est à toi de le gerer

    En gros le principe de ton robot sera de chopper un epage de demarrage, puis d'en tirer les liens et de les parcourir un par un, en tirant à chaque fois les liens et en les placant en file d'attente.
    Et pour ce faire tu devra faire plusieurs traitements sur les liens extraits:
    - absolutisation (rendre les liens relatifs absolus par rapport à la page source)
    - normalisation (en gros les passer dans le module URI devrait suffire, mais si tu veux faire qq chose de serieux il te faudra aussi virer les id de session, etc...)
    - filtrage des url deja vue (deja collectée ou deja en file d'attente), et la tu aura interet à utiliser une hash stockée sur disque (genre berkeleyDB) pour pas exploser ta RAM
    - filtrage eventuel suivant ce que tu veux crawler (rester ou non a l'interieur d'un site, ou dans du .fr par exemple)
    - filtrage suivant les regles du robtos.txt (quer tu aura collect" au paravant, pour chaque nouveau host que tu rencontrera, et mis l'objet resultant en cache), en utilisant les modules deja cités

    et de meme, en amont de tout cela, lors du parsing de ta page tu devra extraire les regles robots du HTML, pour decider ou non d'extraire les liens de cette page

    tu trouvera sur CPAN à peu pres tous les modules pour faire cette chaine, mais tu devra la faire toi meme au final, car elle depend totalement de ce que tu veux faire avec ce crawler
    Mon robot est basé sur ce modèle justement j'ai implémenté tout cela sauf robots.txt qui n'est pas disponible dans POE

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    m'enfin ?!
    tu prend le parser de robots.txt, tu lui donne le robots.txt et tu utilise l'objet pour filtrer tes url, et voila.
    Je dis pas que c'est simple à mettre en place, mais si tu a deja fait tout le reste alors ca doit couler de source

  17. #17
    Membre actif Avatar de mobscene
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 331
    Points : 234
    Points
    234
    Par défaut
    Il me semble que ton code est obsolète , il n'est valide que pour l'avant dernière build de POE. D'ailleur a ce sujet dans poe la méthode GET venant de HTTP::Request, j'aimerai y ajouter HTTP::Headers mais je ne vois pas trop comment faire etant donnée sur GET est appelé comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    got_response => GET $url
    thx

  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
    Ajouter www::robotrules a POE n'est pas très compliqué personellement j'ai repiqué du code dans LWP::RobotUA je vous présente POE::Component::Client::HTTP::RobotRules je l'ai mis en pièce jointe de ce post

    j'ai ajouter deux paramètres a POE::Component::Client::HTTP,
    UserAgent => un objet LWP::UserAgent
    Rules => un objet WWW::RobotRules
    Fichiers attachés Fichiers attachés

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    cool !
    met le sur CPAN!

  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
    C'est justement ce que je compte faire le plus vite possible mais avant je vais essayer d'ajouter un traitement pour que le tags html robots soit pris en compte directement par POE .

    Je vais aussi utiliser l'encapsulation parce que la j'ai directement modifié la lib comme c'etait pour un usage perso j'avais pas envie de me prendre le choux.

Discussions similaires

  1. Petit soucis avec Thread::Queue et une classe
    Par vodevil dans le forum Web
    Réponses: 16
    Dernier message: 09/06/2006, 21h41
  2. petit soucis avec les listes
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/09/2005, 10h08
  3. Petit souci avec clause where
    Par ybruant dans le forum SQL
    Réponses: 1
    Dernier message: 21/07/2005, 22h10
  4. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 13h45
  5. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 16h52

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