C'est encore moi et mon robot , pour ceux qui sont nouveaux je travaille sur un robot , pour le "web universitaire".
J'ai un seul et unique problème avec LWP:arallele::UserAgent
je n'arrive pas a reproduire la structure dans mon robot
dans la doc du module l'exemple suivant est donné
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 my $url = "http://www.cs.washington.edu/"; my $reqs = [ HTTP::Request->new( 'GET', $url ), HTTP::Request->new( 'GET', $url . "research/ahoy/" ), HTTP::Request->new( 'GET', $url . "research/ahoy/doc/paper.html" ), HTTP::Request->new( 'GET', "http://metacrawler.cs.washington.edu:6060/" ), HTTP::Request->new( 'GET', "http://www.foobar.foo/research/ahoy/" ), HTTP::Request->new( 'GET', "http://www.foobar.foo/foobar/foo/" ), HTTP::Request->new( 'GET', "http://www.foobar.foo/baz/buzz.html" ), HTTP::Request->new( 'GET', $url . "foobar/bar/baz.html" ), ];
Et voila mon robot
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 require LWP::Parallel::UserAgent; require LWP::Parallel::RobotUA; use HTTP::Request; require WWW::RobotRules::AnyDBM_File; my ( $req, $res ); my $rules = new WWW::RobotRules::AnyDBM_File 'ParallelUA', 'cache'; my $pua = new LWP::Parallel::RobotUA( "ParallelUA", 'yourname@your.site.com', $rules ); $pua->delay(5); $pua->max_req(2); $pua->max_hosts(10); my $url = "http://www.cs.washington.edu/"; my $reqs = [ HTTP::Request->new( 'GET', $url ), HTTP::Request->new( 'GET', $url . "research/ahoy/" ), HTTP::Request->new( 'GET', $url . "research/ahoy/doc/paper.html" ), HTTP::Request->new( 'GET', "http://metacrawler.cs.washington.edu:6060/" ), HTTP::Request->new( 'GET', "http://www.foobar.foo/research/ahoy/" ), HTTP::Request->new( 'GET', "http://www.foobar.foo/foobar/foo/" ), HTTP::Request->new( 'GET', "http://www.foobar.foo/baz/buzz.html" ), HTTP::Request->new( 'GET', $url . "foobar/bar/baz.html" ), ]; local ($\) = ""; foreach $req (@$reqs) { print "Registering '" . $req->url . "'\n"; $pua->register( $req, \&handle_answer ); } my $entries = $pua->wait(1); foreach ( keys %$entries ) { $res = $entries->{$_}->response; my $r = $res; my @redirects; while ($r) { $res = $r; $r = $r->previous; push( @redirects, $res ) if $r; } print "Answer for '", $res->request->url, "' was \t", $res->code, ": ", $res->message, "\n"; foreach (@redirects) { print "\t", $_->request->url, "\t", $_->code, ": ", $_->message, "\n"; } } sub handle_answer { my ( $content, $response, $protocol, $entry ) = @_; print "Handling answer from '", $response->request->url, ": ", length($content), " bytes, Code ", $response->code, ", ", $response->message, "\n"; if ( length($content) ) { $response->add_content($content); } else { return undef; } }
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
103
104
105
106
107
108 { my %vus; my @avoir; sub robot { foreach my $url ( @_ ) { next if defined $vus{$url}; push(@avoir, $url); } return if $#avoir == -1; while (my $page = shift @avoir) { ++$vus{$page}; my $link=$page; my $verif_links = verif_link_format($link); if ( $verif_links == 1 ) { my $reqs = [ HTTP::Request->new('GET', $link) ]; foreach my $req (@$reqs) { $req->header('Accept' => [ qw( text/html ) ] ); # print "Registering '".$req->url."'\n"; if ( my $res = $ua->register ($req) ) { print STDERR $res->error_as_HTML; } } my $entries = $ua->wait(0.3); foreach (keys %$entries) { my $res = $entries->{$_}->response; # print "Answer for '",$res->request->url, "' was \t", $res->code,": ", # $res->message,"\n"; if ( $res->is_success ) { my ($code, $date, $size, %page, $base, $content_type); $code = $res->content; $date = date(); $size = size($link); $base = $res->base; $content_type = $res->content_type; %page = ( result => [ "$code", "$link", "$date", "$size KB", "$content_type" ] ); print "$page{'result'}->[0]\n"; print "$page{'result'}->[1]\n"; print "$page{'result'}->[2]\n"; print "$page{'result'}->[3]\n"; print "$page{'result'}->[4]\n"; my $p = HTML::LinkExtor->new(\&callback); $p->parse($code); @web = map { $_ = url($_, $base)->abs; } @web; robot(@web); } else { print "Request failed\n"; } } } else { print "Bad link\n"; } } } }
Je n'arrive pas a faire plusieurs requetes en simultané , j'ai testé tout un tas de soluces mais rien a faire je ne trouve pas de solution (il n'y a d'ailleur pas que moi a qui sa prend la tête lol)
Une des solutions les plus pertinente que j'ai testé est
Voici une possibilité (pas la seule, loin de là).
Au début de ta fonction, quand tu définis %vus et @avoir, tu rajoute ceci:
Code:
{
my %vus;
my @avoir;
sub next_avoir {
my @a_retourner;
for (0..2) {
if ( my $url = shift @avoir) {
push( @a_retourner, $url );
}
}
return @a_retourner;
}
Maintenant, plutôt que de dire:
Code:
while ( my $page = shift @avoir ) {
tu peux dire:
Code:
while ( my @pages = next_avoir() ) {
Ce qui te donnes trois (ou plus, suffit de changer la boucle plus haut) pages à chaque itération.
Mais il y a encore du boulot, parce qu'il faut adapater la suite du code au fait que tu reçois désormais trois url en meme temps. (Aussi: ceci n'est pas testé, j'ai peut-être oublié qqch).
Merci de votre aide (même si je suis chiant avec mon spider)
Partager