Perl WWW::机械化网络蜘蛛。如何找到所有链接

问题描述 投票:0回答:1

我目前正在尝试使用 WWW::Mechanize 创建一个 Perl webspider。

我想做的是创建一个网络蜘蛛,它将抓取整个网站的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”。 com/联系我们'。

问题:

目前它还找到了我不希望它这样做的外部网站的链接,例如,如果我想蜘蛛“http://www.tree.com”,它会找到诸如http://www之类的链接。 tree.com/find-us。 但是,它还会找到其他网站的链接,例如 http://www.hotwire.com

如何阻止它查找这些外部网址?

找到页面上的所有网址后,我还想将这个新的仅限内部链接的列表保存到一个名为 @internalLinks 的新数组,但似乎无法使其工作。

perl web-crawler mechanize
1个回答
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();
© www.soinside.com 2019 - 2024. All rights reserved.