Portál AbcLinuxu, 23. října 2025 13:45
package Test::Crawler;
use Moose;
use WWW::Mechanize;
has client => (
is => 'ro',
isa => 'WWW::Mechanize',
default => sub { WWW::Mechanize->new },
);
has handler => (
is => 'ro',
isa => 'CodeRef',
default => sub {},
);
sub crawl
{
my ($self, $url, $visited) = (@_, {});
# Already seen that.
return if $visited->{$url}++;
# Not seen yet, get.
$self->client->get($url);
$self->handler->($url, $self->client);
# Follow all links.
my @uris = map { $_->URI } $self->client->links;
for my $uri (@uris) {
# Skip mailtos, ftp and such.
next if $uri->scheme;
# Skip external links.
next if $uri->host;
$self->crawl($uri->rel, $visited);
}
}
1;
Pak už stačí crawler pustit v rámci testu a do handleru napsat kód pro validaci HTML a cokoliv dalšího. Pro začátek kontroluju visící odkazy:
use Test::More;
use Test::Crawler;
use Test::WWW::Mechanize::Catalyst;
sub handle_link {
my ($url, $mech) = @_;
ok $mech->response->is_success, "failed to fetch: $url";
}
my $mech = Test::WWW::Mechanize::Catalyst->new(catalyst_app => 'Foo');
Test::Crawler->new(client => $mech, handler => \&handle_link)->crawl('/');
done_testing;
Už během psaní crawleru jsem našel pár chybných URL (dobře schovaných v dynamicky generovaném RSS feedu), takže podobný test se jistě užije. Jen pro tu validaci by asi doopravdy bylo dobré začít používat místní validátor, abych nespamoval online služby.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.