友達の友達までで何人いる?
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; }