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 :

[langage]Besoin d'aide pour debogage d'un script


Sujet :

Langage Perl

  1. #21
    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
    Parce qu'il faut mettre "eee" et pas eee...
    Si tu ne mets pas "use strict;" au début de ton script, il ne te fait rien remarquer mais avoue tout de même que c'est un petit peu dangereux comme syntaxe : tout les mots qu'il ne reconnait pas, il en fait des chaînes de caractère !!

    --
    Jedaï

  2. #22
    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
    Après vérification, ce qui fait planter mon script ci-dessus, c'est le module HTML::LinkExtor, qui semble donc ne pas être thread-safe. C'est génant, mais il est toujours possible de faire un équivalent simplifié de ce module (nous n'avons pas besoin de parser complètement le HTML et des regexs intelligentes suffiraient ici pour faire le travail).
    Toutefois je me pose sérieusement la question de l'intérêt de ce spider, à quoi est-il censé servir ? (surtout qu'il y a déjà des modules en Perl qui font la même chose en mieux... WWW::SimpleRobot ou WWW::Robot sont déjà plus puissant que ce script)

    --
    Jedaï

  3. #23
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12
    Points : 1
    Points
    1
    Par défaut
    Oki sa marche au poil par contre j'ai toujours pas trouver comment utiliser la soluce de nematoad

  4. #24
    Membre régulier
    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
    Points : 99
    Points
    99
    Par défaut
    En parlant de filtre j'ai modifié en ajoutant celui ci en plus du premier



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
         sub interdit
         {  
     
          my @t = (".htm",".asp",".aspx",".nux",".mspx",".cfm",".html",".xhtml",".jhtml",".php",".php3",".php4",".shtml",".jsp",".php4",".php5",".tif",".tiff",".jpg",".jpeg",".gif",".bmp",".dib",".png"); 
     
            my $temp = join "|", (map { quotemeta($_) } @t); 
            $temp = qr/$temp/; 
            return grep { /$temp/ } @links; 
     
     
      }

    Il marche mais ralentit a mort le robot , personne saurais comment l'optimisé ?

  5. #25
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut
    Citation Envoyé par vodevil
    En parlant de filtre j'ai modifié en ajoutant celui ci en plus du premier



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sub interdit
         {  
     
          my @t = (".htm",".asp",".aspx",".nux",".mspx",".cfm",".html",".xhtml",".jhtml",".php",".php3",".php4",".shtml",".jsp",".php4",".php5",".tif",".tiff",".jpg",".jpeg",".gif",".bmp",".dib",".png"); 
     
            my $temp = join "|", (map { quotemeta($_) } @t); 
            $temp = qr/$temp/; 
            return grep { /$temp/ } @links; 
     
     
      }

    Il marche mais ralentit a mort le robot , personne saurais comment l'optimisé ?
    En calculant le regexp une fois, et en calculant un regexp optimisé :

    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
     
    use Regexp::Assemble;
    { # scope pour rendre $re 'statique'
      my $re;
      sub interdit {  
        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 tif tiff jpg jpeg gif bmp dib png
                /;
            $re = $r->re;
        }
        grep { /$re/ } @links; 
      }
    }

  6. #26
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12
    Points : 1
    Points
    1
    Par défaut
    Heu vodevil le mieux c'est de faire sa

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    sub interdit(@)
    {  
     
          my @t = (".htm",".asp",".aspx",".nux",".mspx",".cfm",".html",".xhtml",".jhtml",".php",".php3",".php4",".shtml",".jsp",".php4",".php5",".tif",".tiff",".jpg",".jpeg",".gif",".png"); 
     
              my @links = @_;
     
               my $tempX = join "|", (map { quotemeta($_) } @t); 
     
    		   $tempX = qr/$tempX/; 
     
    		    return grep { /$tempX/ } @links; 
     
    }

    Sa ralentit moins le robot j'ai ramarqué , la soluce de nematoad est quand même la plus performante ce qui normalement devrais donner



    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 tif tiff jpg jpeg gif bmp dib png 
                /; 
            $re = $r->re; 
        }
     
       my @links = @_;
     
        return grep { /$re/ } @links; 
      } 
    }


    perl me sort 2 erreurs a cette ligne
    $r->add( "\\.$_$" ) for

    Final $ should be \$ or $name at bot.pl line 149, within string
    syntax error at bot.pl line 149, near "( "\\.$_$""

    Par contre nematoad j'ai toujours pas trouvé comment mettre ta soluce


    En regardant de plus pres ton histoire de Array_Unique, tu galeres parce que tu as choisi le mauvais outil. Au lieu d'utiliser un array, utilise un hash a la place, et le probleme n'existe plus.

    Quand tu recuperes les links d'une page, tu les mets dans le hash. Attention, on doit verifier que le link n'est y psa deja, sinon deux pages qu'on spider qui pointe sur une troisieme page serait suffisant pour qu'on considere qu'on la deja vu :

    Code:

    my %vu;
    ...

    exists $vu{$_} or $vu{$_} = 1 for @startlinks;


    Ensuite, on choisi un link a partir du hash %vu qui vaut 1 (donc :qu'on vient d'inserer), et une fois qu'on le prend pour visiter, on l'incremente, qui aura comme objet d'eviter de le prendre une deuxieme fois

    Code:

    my $nbre_visite;
    do {
    $nbr_visite = 0;
    while( my $start = each %vu ) {
    if $vu{$start} == 1 ) {
    ++$vu{$start};
    ++$nbre_visite;
    visite($start);
    }
    }
    } while $nbre_visite > 0;


    Si on a visite au moins un link dans la liste, on reboucle pour respiderer quelque chose d'autre. Si on ne visite rien, alors on a tout visite et on sort

    Dans ce context, tu n'as qu'a partager %vu entre tes threads, et tu crees floppee de threads sur la routine visite()

    Remarque : c'est un peu con de spiderer des images : tu ne vas pas y trouver de liens vers d'autres pages...

  7. #27
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut
    Citation Envoyé par deadgod
    la soluce de nematoad est quand même la plus performante ce qui normalement devrais donner

    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 tif tiff jpg jpeg gif bmp dib png 
                /; 
            $re = $r->re; 
        }
     
       my @links = @_;
     
        return grep { /$re/ } @links; 
      } 
    }
    perl me sort 2 erreurs a cette ligne
    $r->add( "\\.$_$" ) for
    Final $ should be \$ or $name at bot.pl line 149, within string
    syntax error at bot.pl line 149, near "( "\\.$_$""
    bon, ben alors

    Pour ce qui est d'integrer la solution que j'avais posté, l'idée est que tu ajoutes un truc qui alimente le hash %vu au départ et puis en voiture.

    N

  8. #28
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12
    Points : 1
    Points
    1
    Par défaut
    Oki sa marche

  9. #29
    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
    nematoad


    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
    Quand tu recuperes les links d'une page, tu les mets dans le hash. Attention, on doit verifier que le link n'est y psa deja, sinon deux pages qu'on spider qui pointe sur une troisieme page serait suffisant pour qu'on considere qu'on la deja vu :
     
    Code:
     
    my %vu;
    ...
     
        exists $vu{$_} or $vu{$_} = 1 for @startlinks;
     
     
    Ensuite, on choisi un link a partir du hash %vu qui vaut 1 (donc :qu'on vient d'inserer), et une fois qu'on le prend pour visiter, on l'incremente, qui aura comme objet d'eviter de le prendre une deuxieme fois
     
    Code:
     
        my $nbre_visite;
        do {
            $nbr_visite = 0;
            while( my $start = each %vu ) {
                if $vu{$start} == 1 ) {
                    ++$vu{$start};
                    ++$nbre_visite;
                    visite($start);
                }
            }
        } while $nbre_visite > 0;
     
     
    Si on a visite au moins un link dans la liste, on reboucle pour respiderer quelque chose d'autre. Si on ne visite rien, alors on a tout visite et on sort
     
    Dans ce context, tu n'as qu'a partager %vu entre tes threads, et tu crees floppee de threads sur la routine visite()
    Rien pigé a comment le mettre dans le script.

    Au fait pas mal le script
    Everybody have in their the potential to be their own god : Marilyn Manson

  10. #30
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12
    Points : 1
    Points
    1
    Par défaut
    Bon pour alimenter le hash je ferais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my %vu : shared = ("@links");
    Mais bon c'est juste une idée

  11. #31
    Membre régulier
    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
    Points : 99
    Points
    99
    Par défaut
    J'ai un ti prb avec www::robotrules , je n'arrive pas a le faire marche convenablement avec des array


    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
    #!C:\Perl\bin\perl.exe
     
     
     
     
     &robots;
     
       @X = "http://www.google.com/robots.txt";
     
     
       sub robots
       {
     
       use WWW::RobotRules;
       my $rules = WWW::RobotRules->new('Mozilla/5.0 (compatible; ShunixBot/1.01; +http://www.shunix.com/bot.htm)');
     
       use LWP::Simple qw(get);
     
     
     
      {
     
       my $robots_txt = get @X;
        $rules->parse(@X, $robots_txt) if defined $robots_txt;
     
      }
     
      # Now we can check if a URL is valid for those servers
      # whose "robots.txt" files we've gotten and parsed:
      # $c = get @X;
      if($rules->allowed(@X)) {
     
        print "Un fichier robots.txt est présent";
     
       } else { print " Pas de fichier robots.txt"; }
     
     
     
      }

    Je n'arrive pa a récupérer le hash

    j'ai tout tenter et perl ne me sort a chaque fois que


    WWW::RobotRules::InCore=HASH(0x34e68)

  12. #32
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut
    On dirait que tu appelles robot() avant d'affecter une valeur à @X, non ? Et par ailleurs il faut plutôt un scalar ($x) au lieu d'un array (@x).

    N

  13. #33
    Membre régulier
    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
    Points : 99
    Points
    99
    Par défaut
    Oui pour @X je n'est mis qu'une valuer pour l'instant c'est pour tester

Discussions similaires

  1. [MySQL] Besoin d'aide pour optimisation d'un script très lourd
    Par macadamgrafik dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/02/2009, 16h08
  2. Réponses: 1
    Dernier message: 26/03/2008, 20h09
  3. Réponses: 3
    Dernier message: 01/02/2007, 20h05
  4. Besoin d'aide pour faire fonctionner un Script d'upload d'images
    Par PaoOo dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 15/06/2006, 21h24
  5. [SNMP] Besoin d'aide pour SNMP, MIB dans script
    Par suya95 dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 17/05/2006, 16h20

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