【问题标题】:Perl WWW::Mechanize Web Spider. How to find all linksPerl WWW::Mechanize Web Spider。如何找到所有链接
【发布时间】:2012-10-20 08:30:04
【问题描述】:

我目前正在尝试使用 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/contact-us'。

问题:

目前它还可以找到指向我不希望它执行的外部站点的链接,例如,如果我想爬取“http://www.tree.com”,它会找到诸如 http://www.tree.com/find-us 之类的链接。 但是,它也会找到指向其他网站的链接,例如 http://www.hotwire.com

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

在页面上找到所有 url 之后,我还想将这个新的内部链接列表保存到一个名为 @internalLinks 的新数组中,但似乎无法正常工作。

任何帮助都非常感谢,在此先感谢。

【问题讨论】:

  • 我没用过,但看起来你可以将url_abs => $urlToSpider 传递给find_all_links 以仅获取内部的。
  • 如果您使用WWW::Mechanize 从网站获取每个页面不太可能取悦网站所有者。我建议您改为查看Gungho,它是为此类事情编写的,并且会尊重robots.txt
  • 我也推荐使用来自 CPAN 的 perl 爬虫模块。如果您想获取链接列表并检查它们是否有效,您可能会发现这个工具很方便linkchecker.sourceforge.net

标签: perl hyperlink mechanize web-crawler


【解决方案1】:

这应该可以解决问题:

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 2011-08-15
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多