我目前正在尝试使用WWW :: Mechanize创建 Perl webspider。
我要做的是创建一个webforce,抓取整个网站的URL(由用户输入),从每个页面中提取所有链接在网站上。
到目前为止我有什么:
use strict;
use WWW::Mechanize;
my $mech = WWW::Mechanize->new();
my $urlToSpider = $ARGV[0];
$mech->get($urlToSpider);
print "\nThe url that will be spidered is $urlToSpider\n";
print "\nThe links found on the url's starting page\n";
my @foundLinks = $mech->find_all_links();
foreach my $linkList(@foundLinks) {
unless ($linkList->[0] =~ /^http?:\/\//i || $linkList->[0] =~ /^https?:\/\//i) {
$linkList->[0] = "$urlToSpider" . $linkList->[0];
}
print "$linkList->[0]";
print "\n";
}
它的作用:
1。目前,它将提取并列出起始页上的所有链接
2. 如果找到的链接是/ contact-us或/ help格式,它会在其前面添加“http://www.thestartingurl.com”,因此它变为'http ://www.thestartingurl.com/contact-us'
问题:
目前它还找到了我不希望它做的外部网站的链接,例如,如果我想蜘蛛'http://www.tree.com',它会找到http://www.tree.com/find-us之类的链接。 但是,它也会找到其他网站的链接,例如http://www.hotwire.com。
如何停止查找这些外部网址?
在找到页面上的所有网址后,我还想将这个新的内部链接列表保存到名为@internalLinks的新数组中,但似乎无法使其正常工作。
非常感谢任何帮助,先谢谢。
答案 0 :(得分:3)
这应该可以解决问题:
my @internalLinks = $mech->find_all_links(url_abs_regex => qr/^\Q$urlToSpider\E/);
如果您不想要css链接,请尝试:
my @internalLinks = $mech->find_all_links(url_abs_regex => qr/^\Q$urlToSpider\E/, tag => 'a');
此外,您用于将域添加到任何相对链接的正则表达式可以替换为:
print $linkList->url_abs();