4

現在、 WWW::Mechanize を使用して Perl webspider を作成しようとしています。

私がやろうとしているのは、(ユーザーが入力した) URL のサイト全体をクロールし、サイトのすべてのページからすべてのリンクを抽出する webspider を作成することです。

私がこれまでに持っているもの:

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」になります。 -我ら'。

問題:

現時点では、私が望まない外部サイトへのリンクも検出します。たとえば、'http://www.tree.com' をスパイダーしたい場合、http://www.tree などのリンクを検出します。 com/find-us . ただし、 http://www.hotwire.comなどの他のサイトへのリンクも検出されます。

これらの外部 URL の検索を停止するにはどうすればよいですか?

ページ上のすべての URL を見つけた後、この内部専用リンクの新しいリストを @internalLinks という新しい配列に保存したいのですが、うまくいかないようです。

事前に感謝します。

4

1 に答える 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();
于 2012-10-31T07:27:21.703 に答える