なんかリンク抽出してみた。

Perlでウェブページからリンク抽出してみよう!
そう思ったのは大学の講義でGooglePageRankアルゴリズムを習ったからだと思います。リンクの抽出ができたあたりで満足しました。
CPANって偉大じゃねーかな思いました。そして俺はさっさと月曜締め切りのPageRankとマルコフ行列がほげほげとかいう感じのレポートを書けと思いました。

実行結果こんな感じ

% ./getlink.pl http://konbu.s13.xrea.com/
1 http://konbu.s13.xrea.com/etc/profile.html
1 http://konbu.s13.xrea.com/lib/index.html
1 http://www.xrea.com/
1 http://d.hatena.ne.jp/hogelog/
1 http://ad.xrea.com/ad_click.fcg?site=konbu.s13.xrea.com
% ./getlink.pl http://d.hatena.ne.jp/hogelog/
1 http://d.hatena.ne.jp/hogelog/20061123
2 http://d.hatena.ne.jp/hogelog/20061121#p1
1 http://d.hatena.ne.jp/hogelog/20061125#p1
4 http://d.hatena.ne.jp/hogelog/searchdiary?word=%2a%5bScheme%5d
...
% ./getlink.pl 
getlink.pl URI
% ./getlink.pl httpps://ijie.com/
Invalid URI

リンクの個数と、リンクURLを表示します。

ソース

#!/usr/bin/perl -w

use strict;
use LWP::Simple;
use HTML::LinkExtor;

my $baseuri = shift;
our $links = {};
if(!defined($baseuri)){
  print "getlink.pl URI\n";
}
elsif($baseuri =~ /s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+/){
  get_links($baseuri);
  while(my ($uri, $count) = each(%$links)){
    print "$count $uri\n";
  }
}
else{
  print "Invalid URI\n";
}
sub get_links{
  my ($uri) = @_;
  my $parser = HTML::LinkExtor->new(\&cb, $uri);
  my $page = get($uri);
  $parser->parse($page);
}
sub cb{
  my ($tag, %link) = @_;
  if($tag eq 'a'){
    ++$links->{$link{href}};
  }
}

test