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 :

Faire du récursif


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 31
    Par défaut Faire du récursif
    Bonjour je suis nouveaux sur le forum j'ai un ti problème avec un script que je suis entrain d'élaborer j'utilise dans ce script le programme XURL dispo sur le CPAN mais il ne suis pas les urls comme HTML::LinkExtor (j'arrive pas a l'utiliser dans faire des doublons dans tout les sens).

    Voici ma fonction

    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
    #------------------------------------------------#
       #      Exploration des liens (sans doublon)  :)  #
       #------------------------------------------------#
     
          sub exploration
          {
           my $ua = new LWP::UserAgent;
           $ua->agent('Mozilla/4.0 (compatible;)');
           my($url, %saw, @urls);
     
             foreach $url ( @_ ) {
             my $res = $ua->request(HTTP::Request->new(GET => $url));
              my $ht_tree = parse_html($res->content);
                 my $base = $res->base;
                    my($linkpair, $fqurl);
     
                      foreach $linkpair (@{$ht_tree->extract_links(qw<a img>)}) {
                         my($link,$elem) = @$linkpair;
                            push(@urls, $fqurl)
    	                    unless $saw{ $fqurl = url($link,$base)->abs->as_string }++;
                        }
                    }                
     
                    push @urls, return sort keys %saw;
    si je cible par exemple free.fr , le programme ne me renvoie que les lien présent sur la primière page, moi je voudrais qu'il les suivent.

    Merci 8) !

    pd : pour ceux que sa intéresse c'est pour faire un moteur de recherche pour mon site qui vas tout déchirer (heu sa reste a voir), en plus sa me fait de l'exercice de faire un spider

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 73
    Par défaut
    Heu je ne sais pas comment faire DSL, mais html::linkextor me semble plus rapide , pour ne pas produire de doublon avec utilise un hash !!

    Pour le hash je sais pas comment faire avec linkextor , je débute et patauge dans la semoule.

    Sinon il y a un dénomé Jedai sur le forum qui a fait un robot , mais pas stable a cause des threads demande lui il sais comment faire marcher linkextor avec un hash !!

    Bonne nuit 8)

  3. #3
    Expert confirmé
    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
    Par défaut
    Moi je suis pour l'utilisation de WWW::Robot...
    Néanmoins si tu tiens à réaliser toi-même ton spider, voici une piste avec des threads et sans doublons :
    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
     
    #! /usr/bin/perl
    use strict;
    #~ use warnings;
    use threads;
    use threads::shared;
     
    use LWP::Simple;
    use URI;
     
    $| = 1;
     
    my %urls : shared;
    @urls{ @ARGV } = (1) x @ARGV;
     
    foreach my $link ( keys %urls ){ 
      my $thr = threads->create( \&explore, $link );
      $thr->detach;
    }
     
    for (;;) {
      threads->yield();
    }
     
    sub explore {
      my $url = shift or warn "URL vide ?\n";
      my $base_uri = URI->new( $url );
      #~ print "Explore $url\n";
      return unless (head $url)[0] =~ m<text/html>;
      my $content = get $url;
      warn "Couldn't get $url !\n" unless defined $content;
     
      my @links;  
      while ($content =~ m/(?:<a [^>]+ href=|<frame [^>]+ src=)
        (?: "((?:[^"\\]|\\")+)" )
        [^>]*>
        /xig){
        push @links, $1;
      }
     
      foreach my $link ( @links ) {
        lock %urls;
        #~ print "relative link : #$link#\n";
        $link = URI->new_abs( $link, $base_uri )->as_string();
        $urls{$link}++;
        if( $urls{$link} == 1 ) {
          my $thr = threads->create( \&explore, $link );
          $thr->detach;
          print "Nouveau lien : $link\n";
        }
      }
     
    }
    Dis-moi ce que ça donne sur ton ordi (stabilité, vitesse, etc..).

    [EDIT] grosse erreur dans le code corrigée, la stabilité est maintenant beaucoup plus grande.

    --
    Jedaï

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 31
    Par défaut
    Je veut bien tester ton spider mais comment ont la faire marche , j'ai pas compris ou je lui met le ou les sites a spider !!

  5. #5
    Expert confirmé
    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
    Par défaut
    Tu lui mets la liste des urls de départ en argument, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    perl spider.pl http://<a href="http://www.developpez.com/" target="_blank">www.developpez.com/</a> http://machin.truc.bid/
    Après tu regardes les nouveaux liens qui apparaissent au fur et à mesure, et tu me dis si ça te semble bon.
    Bien sûr c'est juste un script qui remonte des liens, mais il est facilement transformable pour lui faire effectuer des tâches plus complexes (stocker les url dans un fichier, ne regarder que les urls respectant certains critères, comme l'appartenance à un certain domaine par exemple, etc...).

    --
    Jedaï

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 31
    Par défaut
    Il marche bien mais il est lent je trouve ! Sinon la stabilité sa vas mais des fois sa plante, sans raison

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 210
    Par défaut
    Voici un prog écrit par nametoad il me semble il permet de faire un trie dans tes $link il marche avec les tableau mais il suffit d'adapter pour les scalaires

    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
    use Regexp::Assemble; 
    { # scope pour rendre $re 'statique' 
      my $re;
      sub allow
       {
        if( not $re ) { 
            my $r = Regexp::Assemble->new;
            $r->add( "\\.$_\$" ) for 
                qw/ htm asp aspx nux mspx cfm html xhtml jhtml php php3 
                    php4 shtml jsp php4 php5 jpg jpeg png gif doc rtf pdf
                    xls pm shtm
                /; 
            $re = $r->re; 
        } 
     
        return grep { /$re/ } @_;
      } 
    }

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 31
    Par défaut
    Voic le spider modifier , comme sa ont peut lui adjoindre un User-Agent


    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
    #! /usr/bin/perl
    use strict; 
    #~ use warnings; 
    use threads; 
    use threads::shared;
    use LWP::Simple; 
    use URI;
    use LWP::UserAgent;
     
    $| = 1;
     
     
    my %urls : shared; 
    @urls{ @ARGV } = (1) x @ARGV;
     
    # Création du robot
    my $VERSION = "Bot/1.01";
    my $ua = LWP::UserAgent->new;    
       $ua->agent('Mozilla/4.0 (compatible)');
     
    # Ecrire un log d'evenement
    BEGIN {
    use CGI::Carp qw(carpout);
    open(LOG, ">>/log_spider.txt") or die "Impossible d'ouvrir : $!\n";
    carpout(*LOG);
    }
     
     
    foreach my $link ( keys %urls ){ 
      my $thr = threads->create( \&explore, $link ); 
      $thr->detach; 
    } 
     
    for (;;) { 
      threads->yield(); 
    } 
     
    sub explore { 
      my $url = shift or warn "URL vide ?\n"; 
      my $base_uri = URI->new( $url ); 
     
      #~ print "Explore $url\n"; 
      return unless (head $url)[0] =~ m<text/html>; 
     
      # my $content = get $url;
      my $content = $ua->get($url);
     
      if ($content->is_success) {
      $content = $content->content;
     
      warn "Couldn't get $url !\n" unless defined $content; 
     
      my @links;  
      while ($content =~ m/(?:<a [^>]+ href=|<frame [^>]+ src=) 
        (?: "((?:[^"\\]|\\")+)" ) 
        [^>]*> 
        /xig){ 
        push @links, $1;
      } 
     
      foreach my $link ( @links ) { 
        lock %urls; 
        #~ print "relative link : #$link#\n"; 
        $link = URI->new_abs( $link, $base_uri )->as_string(); 
        $urls{$link}++; 
        if( $urls{$link} == 1 ) { 
          my $thr = threads->create( \&explore, $link ); 
          $thr->detach; 
          print "Nouveau lien : $link\n"; 
        } 
      }
     } 
     
    }
    Quelqu'un aurait t'il un bon tuto sur GTK2/Perl ?

  9. #9
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 896
    Par défaut
    Salut

    A propos de Gtk2/Perl, tu peux faire un coup de pour arriver à cette page : http://gtk2-perl.sourceforge.net/

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

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

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 31
    Par défaut
    Merci Gldavid

    Heu vodevil , je trouve vraiment pas comment mettre ton prog en contecte scalaire

    juste un question pour le code des pages je le récupère dans $content mais je voudrais savoir si my
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $content = $ua->get($url);
    récupère aussi le code des images ?

    J'ai remarqué que le spider pompais 100% du cpu et en ram pareil c'est normale ? ou j'ai un problème

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 210
    Par défaut
    Bon j'ai testé la bot ben il bouffe enorement de ressources c'est affolant , en fait il crée dans threads en l'infini c'est la mort

    bon j'ai quand même cherche sur CPan


    http://search.cpan.org/~elizabeth/Thread-Exit-0.09/lib/Thread/Exit.pm

    permet de tuer des theads

    et sa aussi

    http://search.cpan.org/~elizabeth/Thread-Suspend-0.04/lib/Thread/Suspend.pm

    Juste un question par contre , comment ont supprime des repository dans ppm parce que j'en est ajouté un et dépuis pas moyen d'installer le moindre module

  12. #12
    Expert confirmé
    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
    Par défaut
    C'est facile de tuer les threads, mais ici ce n'est pas le problème, le problème c'est de réguler la population pour éviter que ça ne dégénère.
    J'ai bien fait un script où les threads sont gérés extérieurement mais le résultat est plutôt décevant... Bref les threads ne sont pas vraiment au point.

    Je réitère mon soutien à WWW::Robot.

    --
    Jedaï

Discussions similaires

  1. [WD17] Etat "récursif" pour présenter une arborescence, comment faire ?
    Par droliprane dans le forum WinDev
    Réponses: 2
    Dernier message: 23/06/2015, 15h47
  2. LinqToEntities : .Include() récursif, comment faire?
    Par takinelinfo dans le forum Entity Framework
    Réponses: 5
    Dernier message: 08/06/2011, 21h34
  3. Faire un count récursif.
    Par supertino7 dans le forum Requêtes
    Réponses: 2
    Dernier message: 03/11/2009, 12h21
  4. Comment faire un JOIN récursif d'une table sur elle-même?
    Par PierreCaron dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/04/2009, 03h28
  5. Faire un énumérateur récursif en VB.Net
    Par Doomdoom dans le forum VB.NET
    Réponses: 4
    Dernier message: 02/02/2007, 16h06

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