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 :

recuperer contenu sur des url contenant des variables.


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    152
    Points
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 152
    Points : 65
    Par défaut recuperer contenu sur des url contenant des variables.
    Bonjour,

    Je suis débutant en perl et je me heurte à un petit problème...

    Fonction de mon script:

    1) Le script se connecte à ma base de données pour récupérer une liste d'url.
    2) Le script parcoure les sites afin de récupérer des url sur ces sites
    3) Le script récupère l'adresse ip des serveurs appartenant aux urls récupérées.

    Le script fonctionne bien, mais lorsque j'ai des url dans ma base qui sont du type:

    http://www.lesite.com/index.php?method=pv&cat=&start=41

    Cela ne "m'aspire" pas la bonne page...En effet, cela récupèrera le contenu de la page http://www.lesite.com/index.php et ne prendra pas en compte les variables... :-(

    Pourriez vous m'aider svp?

    Script:

    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
    #!/usr/bin/perl
    use warnings;
    umask 0;
    use Config;
    use DBI;
    use DBD::mysql;
    use LWP::Simple;
    use threads;
    use strict;
    use CGI;
    use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
     
    my $cgi = CGI->new;
    print $cgi->header;
    $| = 1;
     
    $Config{useithreads} or die "Recompile Perl with threads to run this program. \n";
    my @threads;
    my $threadcount = 50;
    my $enablethreading = 1;
     
    my $dbh;
     
    sub connectDB {
    	my $hostname = "localhost";
    	my $database = "xxxx";
    	my $username = "xxx";
    	my $password = "xxxxx";
    	$dbh = DBI->connect("DBI:mysql:$database:$hostname", $username, $password) or die "Can't connect to the DB: $DBI::errstr\n"; 
    }
     
    sub processHost {
    	my ($host) = @_;
    	my ($hostonly) = $host =~ m/[a-z0-9][a-z0-9-.]*[.][a-z.]+[a-z]/ig;
    	my ($ip) = `host -W 3 -t A $hostonly 2>/dev/null` =~ m/[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+/g;
    	connectDB();
    	if ($ip) {
    		print "<b>[ " . threads->self()->tid() . " ]</b> <a href=\"http://$host\">$host</a> - $ip <br/>\n";
    		$dbh->prepare("INSERT IGNORE INTO listeIp (Ipadress, url, Type, InsertDate) VALUES ('$ip', '$host', 'WebProxy', NOW())")->execute();
    	} else {
    		print "<b>[ " . threads->self()->tid() . " ]</b> <a href=\"http://$host\">$host</a> - NO IP <br/>\n";
    		$dbh->prepare("INSERT IGNORE INTO UrltoVerify (url) VALUES ('$host')")->execute();
    	}
    }
     
    sub parseHosts {
    	my ($url) = @_;
    	my $content = `curl --header "User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14" $url 2>&1`;
    	my $hostpattern = "[a-z0-9][a-z0-9-.]*[.][a-z.]+[a-z]/?[a-z0-9_./-]*";
    	my $p1 = "href=[\"]($hostpattern)[\"] onclick";
    	my $p2 = "href=[\"]http://($hostpattern)[\"] onclick";
    	my $c = 0;
    	while ($content =~ m/($p1)|($p2)/igs) {
     
    		if ($2) {
    			processHost($2);
    		} elsif ($4) {
    			processHost($4);
    		} 
    	}
    }
     
    sub parseHostsThreaded {
    	my ($url) = @_;
    	for (my $t = 0; $t < $threadcount; $t++) {
    		if (!$threads[$t]) {
    			$threads[$t] = threads->new(\&parseHosts, $url);
    			return;
    		}
    	}
    	closeOpenThreads();
    	parseHostsThreaded($url);
    }
     
    sub closeOpenThreads {
    	for (my $t = 0; $t < $threadcount; $t++) {
    		if ($threads[$t]) {
    			$threads[$t]->join();
    			$threads[$t] = 0;
    		}
    	}
    }
     
    connectDB();
    my $sth = $dbh->prepare("SELECT * FROM listeUrl WHERE category=1");
    $sth->execute;
    my $t = -1;
    while (my @row = $sth->fetchrow_array()) {
    	if ($enablethreading) {
    		parseHostsThreaded($row[1]);
    	} else {
    		parseHosts($row[1]);
    	}
    }
    closeOpenThreads();

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Points
    2 673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	my $hostpattern = "[a-z0-9][a-z0-9-.]*[.][a-z.]+[a-z]/?[a-z0-9_./-]*";
    	my $p1 = "href=[\"]($hostpattern)[\"] onclick";
    	my $p2 = "href=[\"]http://($hostpattern)[\"] onclick";
    car les adresses du type http://www.lesite.com/index.php?method=pv&cat=&start=41 sont coupées

    L'erreur vient elle de l'expression régulière qui tronque ton adresse?

    Si c'est le cas, tu pourrais utiliser les balises ^ et $ et ajouter .* à la fin de l'expression régulière afin de forcer la récupération de tous tes caractères /^ .*$/

    [a-z0-9_./-] peut être simplifié par [\w./-] sauf si tu crains les lettres majuscules.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    152
    Points
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 152
    Points : 65
    Par défaut
    Bonjour

    Mer ci pour votre aide. L'erreur ne vient pas de la car la il s'agit de la ligne récupérant des url sur les sites dont l'url initiale a été extraite de la base de donnée.

    Comme expliqué, dans ce script, en premier, on se connecte à ma base mysql pour récupéré une liste d'url.

    Ensuite sur chaque site, on va récupérer d autres url, qui cont ensuite être modifiées en ip.

    LE probleme vient des url extraite de ma base. Si elle contienne des variable cela ne marche pas

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Points
    2 673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Par défaut
    LE probleme vient des url extraite de ma base. Si elle contienne des variable cela ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM listeUrl WHERE category=1
    L'étoile ne récupère t'elle pas correctement la valeur de l'url?

    Dans ce cas le problème vient de la requête SQL? Chez moi, j'arrive à récupérer la valeur 'http://www.lesite.com/index.php?method=pv&cat=&start=41' dans un champ de ma DB et à la placer dans une variable perl sans problème. As-tu fait un post dans la partie SQL du forum?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    152
    Points
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 152
    Points : 65
    Par défaut
    Bonjour,

    Je n'ai pas fait la totalité de ce script, et si je comprends, le script récupère tout le contenu de ma table, (champ url, id, problem)

    Par contre je ne vois pas ou sont réutilisées les url récupérées dans la base?

    Si dans ma base de données, les url sont du type http://www.proxxies.com/index.php

    Cela marchera, le script se rendra à cette adresse et ira extraire toutes les url correspondantes au regex, puis cherchera l'adresse ip du serveur hébergeant l'url récupérée.

    Par contre si dans ma base l'url est du type: http://www.proxxies.com/index.php?me...&cat=&start=21

    Cela récupérera les url de http://www.proxxies.com/index.php

    Donc j'en déduis que les variables ne sont pas prises en compte, et ici elles servent à la pagination apparemment...

  6. #6
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Points
    2 673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Par défaut
    Par contre je ne vois pas ou sont réutilisées les url récupérées dans la base?
    les url sont déjà réutilisées ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    `curl --header "User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14" $url 2>&1`
    Mais apparemment elles se baladent aussi dans le script de sous programme en sous programme

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    152
    Points
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 152
    Points : 65
    Par défaut
    Bonjour Jasmine80,

    Un grand merci à toi, qui m'a permi de résoudre mon problème!

    En fait c'était très simple à résoudre, il suffisait d'ajouter des guillemets à url: "$url"

    Maintenant cela marche nickel!

    Merci encore!!

    Sinon, quelqu'un m'a proposé d'utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    use Socket;
     
    sub getip {
        my $addr = gethostbyname(shift);
        $addr ? inet_ntoa $addr : undef;
    }
    Et de remplacer alors:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($ip) = `host -W 3 -t A $host 2>/dev/null` =~ m/[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+/g;
    Par:


    Qu'en pensez vous? cela aura t-il un impact en matière de performance?

    MErci

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Points
    8 586
    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
    Par défaut
    Citation Envoyé par joboy84 Voir le message
    Qu'en pensez vous? cela aura t-il un impact en matière de performance?
    Ca sera nettement plus performant ! (au passage, utiliser curl juste pour télécharger des pages alors que Perl sait le faire c'est pas bien malin non plus...)


    --
    Jedaï

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    152
    Points
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 152
    Points : 65
    Par défaut
    Bonjour Jedai,

    En fait moi je me suis occupé du regex et le reste a été fait par un freelance...qui a disparu dans la nature lol

    J'ai effectué la modification pour utiliser socket, mais je ne trouve pas cela plus rapide...mais bon c'est peut être plus niveau ressources serveur...

    Sinon pour Curl je ne savais pas non plus...Peut être que la personne a utiliser cela pour que je puisse contrer un systeme anti-aspiration d'un site car cela vérifiais s'il y avait un "vrai" navigateur...

    Apres une petite recherche, parlerai tu de "GetWeb"? http://search.cpan.org/~rhnelson/GetWeb-1.11/

    Si vous êtes prêt à me donner des pistes pour m'aider je suis prêt à essayer d'améliorer...Meme si mon domaine est plûtot php.

    Sinon, concernant les thread, y a t-il une limite infligée par perl? (ou puis je mettre 200 si mon serveur le supporterait lol)
    merci

    Code actuel:

    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
    #!/usr/bin/perl
    use warnings;
    umask 0;
    use Config;
    use DBI;
    use DBD::mysql;
    use LWP::Simple;
    use threads;
    use strict;
    use CGI;
    use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
    use Socket;
     
    my $cgi = CGI->new;
    print $cgi->header;
    $| = 1;
     
    $Config{useithreads} or die "Recompile Perl with threads to run this program. \n";
    my @threads;
    my $threadcount = 50;
    my $enablethreading = 1;
    my $dbh;
     
    sub connectDB {
    	my $hostname = "localhost";
    	my $database = "xxxx";
    	my $username = "xxx";
    	my $password = "xxxx";
    	$dbh = DBI->connect("DBI:mysql:$database:$hostname", $username, $password) or die "Can't connect to the DB: $DBI::errstr\n"; 
    }
     
    sub getip {
        my $addr = gethostbyname(shift);
        $addr ? inet_ntoa $addr : undef;
    }
     
    sub processHost {
    	my ($host) = @_;
    	my ($hostonly) = $host =~ m/[a-z0-9][a-z0-9-.]*[.][a-z.]+[a-z]/ig;
    	my $ip = getip($hostonly);
    	connectDB();
    	if ($ip) {
    		print "<b>[ " . threads->self()->tid() . " ]</b> <a href=\"http://$host\">$host</a> - $ip <br/>\n";
    		$dbh->prepare("INSERT IGNORE INTO listeIp (Ipadress, url, Type, InsertDate) VALUES ('$ip', '$host', 'WebProxy', NOW())")->execute();
    	} else {
    		print "<b>[ " . threads->self()->tid() . " ]</b> <a href=\"http://$host\">$host</a> - NO IP <br/>\n";
    		$dbh->prepare("INSERT IGNORE INTO UrltoVerify (url) VALUES ('$host')")->execute();
    	}
    }
     
    sub parseHosts {
    	my ($url) = @_;
    	my $content = `curl --header "User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14" "$url" 2>&1`;
    	my $hostpattern = "[a-z0-9][a-z0-9-.]*[.][a-z.]+[a-z]/?[a-z0-9_./-]*";
    	my $p1 = "href=[\"]($hostpattern)[\"] onclick";
    	my $p2 = "href=[\"]http://($hostpattern)[\"] onclick";
    	my $p3 = "blank[\"]>($hostpattern)</a></td><td>";
    	my $c = 0;
    	while ($content =~ m/($p1)|($p2)|($p3)/igs) {
    		if ($2) {
    			processHost($2);
    		} elsif ($4) {
    			processHost($4);
    		} elsif ($6) {
    			processHost($6);
    		} 
    	}
    }
     
    sub parseHostsThreaded {
    	my ($url) = @_;
    	for (my $t = 0; $t < $threadcount; $t++) {
    		if (!$threads[$t]) {
    			$threads[$t] = threads->new(\&parseHosts, $url);
    			return;
    		}
    	}
    	closeOpenThreads();
    	parseHostsThreaded($url);
    }
     
    sub closeOpenThreads {
    	for (my $t = 0; $t < $threadcount; $t++) {
    		if ($threads[$t]) {
    			$threads[$t]->join();
    			$threads[$t] = 0;
    		}
    	}
    }
     
    connectDB();
    my $sth = $dbh->prepare("SELECT * FROM listeUrl WHERE category=2");
    $sth->execute;
    my $t = -1;
    while (my @row = $sth->fetchrow_array()) {
    	if ($enablethreading) {
    		parseHostsThreaded($row[1]);
    	} else {
    		parseHosts($row[1]);
    	}
    }
    closeOpenThreads();

  10. #10
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Points
    2 673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Par défaut
    N'as-tu pas essayé de suivre les conseils de Djibril?
    Pour extraire les url d'une page html, pas besoin de se prendre le chou avec les regex. cpan est là pour nous
    Voir modules HTML-SimpleLinkExtor

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    152
    Points
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 152
    Points : 65
    Par défaut
    Bonsoir,

    Le probleme est que je ne m'y connais pas, comme dit...

    Ce que j'ai peur en utilisant HTML-SimpleLinkExtor c'est que cela prenne des url que je ne veux pas. En effet, les url récupérées varient de site en site. Il s'agit d'un type d'url bien précis, et non pas toutes les url's.

    Par exemple, sur cetains sites, je ne veux que les url situés après <li> et avant onclick (<li> url onclick), sur d'autres cela sera encore différent.

    Si j'ai bien compris, HTML-SimpleLinkExtor extrait toutes les url, sans distinction...

  12. #12
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Points
    2 673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Par défaut
    http://search.cpan.org/~bdfoy/HTML-S...leLinkExtor.pm

    This is a simple HTML link extractor designed for the person who does not want to deal with the intricacies of HTML:arser or the de-referencing needed to get links out of HTML::LinkExtor.

    You can extract all the links or some of the links (based on the HTML tag name or attribute name). If a <BASE HREF> tag is found, all of the relative URLs will be resolved according to that reference.

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/10/2009, 11h36
  2. url contenant des variables
    Par torn33260 dans le forum Langage
    Réponses: 2
    Dernier message: 31/03/2008, 14h13
  3. JTable contenant des JComboBox contenant des Images
    Par lex13 dans le forum Composants
    Réponses: 4
    Dernier message: 31/07/2007, 16h57
  4. Réponses: 6
    Dernier message: 11/06/2005, 00h56

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