友達の友達までで何人いる?

twitterを使っていて,自分に影響を与えそうな人ってどれくらいいるんだろう,とふと思いました.フレンドリストに載っている人のステータスは直接見えるんだから当然影響を受けるでしょう.その人達のフレンドリストに載っている人が限界かな?6次の隔たりで任意の人に到達できるって話が以前あったから,2次の隔たりが日常的に影響を与えるんだとしたら,それはどのくらいの人数になるんでしょう.

というわけで調べてみる事に

twitterのページをFirebugで調べてみて,フレンドリストの各エントリを

a[rel="contact"]

というcssセレクタで抽出できることがわかりました.後は簡単です.自分用のページのフレンドリストを抽出して,各お友達ページのフレンドリスト一覧をチェックし,友達一覧をつくればよいというわけです.で,やってみたところ,答えは957人でした.多いのか少ないのかはわからないけど,結構な人数いるからこれを利用して,「身の回りでのkizashi」とかってサービスでも作ってみるかな.タグクラウドで今流行ってるキーワードを抽出するとか.

ソース

特別なことやっていないので,特に注釈はありません.こんな感じです.

#!/usr/local/bin/perl
use strict;
use warnings;

use URI::Fetch;
use HTML::Selector::XPath;
use HTML::TreeBuilder::XPath;
use Data::Dumper;

my ( $id, $url, $fof );

$id = shift or die "usage: $0 <id>";
$url = sprintf 'http://twitter.com/%s/', $id;
$fof = {};
friends( $url, $fof );

map { friends( $_, $fof ) if ( $$fof{$_}{'CHECK'} eq 'NO' ); } ( keys %$fof );

print Dumper $fof;
printf "There are %d friends\n", scalar( keys %$fof );

sub friends {
    my $url = shift;
    my $fof = shift;
    my ( $res, $tree, @nodes );

    $res = URI::Fetch->fetch($url) or die URI::Fetch->errstr;

    $$fof{$url}{'CHECK'} = 'YES';
    $tree = HTML::TreeBuilder::XPath->new;
    $tree->parse( $res->content );
    $tree->eof;

    @nodes = $tree->findnodes( selector('a[rel="contact"]') );

    map {
        my $href  = $_->attr('href');
        my $title = $_->attr('title');
        if ( !$$fof{$href} ) {
            $$fof{$href}{'HREF'}  = $href;
            $$fof{$href}{'TITLE'} = $title;
            $$fof{$href}{'CHECK'} = 'NO';
        }
    } @nodes;
    return $fof;
}

sub selector {
    HTML::Selector::XPath->new(shift)->to_xpath;
}