Oki Jedai
Bon voici ma version Multithreading du robot il marche mais mon compilateur me sort un erreur a la ligne 57
if ($links[$i++] eq $start_link) {
je ne comprend pas ??? !!! : --
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 -w
use strict;
use threads;
use threads::shared;
my $thr = threads->new(\&spider);
$thr = threads->new(\&Array_Unique);
my $VERSION = "Robot experimental/0.1";
use LWP::UserAgent;
use HTML::LinkExtor;
use URI::URL;
$| = 1;
sub spider (%);
spider URL => '$url';
sub spider (%) {
my %args = @_;
my @startlinks : shared = ("http://hardware.fr");
push(@startlinks, $args{URL});
my $ua = LWP::UserAgent->new;
$ua->agent('Mozilla/5.0 (compatible; Bot/0.1; +http://developpez.com');
WORKLOOP: while (my $link : shared = shift @startlinks) {
for (my $i : shared = 0; $i< $#startlinks; $i++) {
next WORKLOOP if $link eq $startlinks[$i];
}
print ">>>>> working on $link\n";
HTML::LinkExtor->new(
sub {
my ($t, %a) = @_;
my @links = map { url($_, $link)->abs() }
grep { defined } @a{qw/href img/};
# mark already spidered links for removal
foreach my $start_link (@startlinks) {
my $i : shared = 0;
for (0 .. $#links) {
if ($links[$i++] eq $start_link) {
$links[$i -1] = "'REMOVE'";
}
}
}
@links = sort @links;
for (my $i : shared = 0; $i< $#links; $i++) {
$links[$i] = "'REMOVE'" if $links[$i] eq $links[$i +1];
}
@links = grep { $_ ne "'REMOVE'" } @links;
#####################################
# Suppréssion des doublons #
#####################################
@links = Array_Unique(@links);
#####################################
# Impréssion des résultats #
#####################################
print "+ $_\n" foreach @links;
push @startlinks, @links if @links;
} ) -> parse(
do {
my $r = $ua->simple_request
(HTTP::Request->new("GET", $link));
$r->content_type eq "text/html" ? $r->content : "";
}
)
}
}
##############################################################
# Suppréssion des doublons
##############################################################
sub Array_Unique
{
my %vu;
for my $elem( @_ ) {
++$vu{$elem};
}
(keys %vu);
} |
Partager