2008年2月9日土曜日

ネットワーク理論

ネットワーク理論の本を読んでます。

新ネットワーク思考—世界のしくみを読み解く(LINKED: The New Science of Networks)

有名なのはケビン・ベーコンゲームというものでケビン・ベーコンと他のハリウッド俳優は
少なくとも2人の共演者で繋がっているという法則。これはハリウッドの世界だけでなく
世界中の人々もすくなくとも6人の友人で繋がっている。自分と福田総理、自分とアフリカの
誰かとも6人の友人を通じてその人にたどり着けるというもの。
これは6次の隔たりと呼ばれています。

そこで思ったのがmixiはどうなってるんだろう?何次の隔たり?
スクリプトを作って検証しようと思いました。

require 'rubygems'
require 'mechanize'

username = '<メールアドレス>'
password = '<パスワード>'

agent = WWW::Mechanize.new
page = agent.get('http://mixi.jp/')
form = page.forms[0]
form.fields.find {|f| f.name == 'email'}.value = username
form.fields.find {|f| f.name == 'password'}.value = password
form.fields.find {|f| f.name == 'next_url'}.value = '/home.pl'
page = agent.submit(form, form.buttons.first)

$list={}
h={}
h[:url] = 'http://mixi.jp/list_friend.pl'
h[:flag] = false
h[:depth] = 0
$list["mixiのid"] = h

def url()
res=nil
$list.each do |k,i|
if i[:flag] == false
i[:flag] = true
return k
end
end
nil
end

def set(id, url, depth)
if !$list.key?(id)
a={:url=>url,:depth=>depth,:flag=>false}
$list[id] = a
end
end

while (id = url()) != nil
#break if $list.size > 100

$list[id][:list] = []
depth = $list[id][:depth] + 1
diarylist = agent.get($list[id][:url])
diarylist.links.each do |link|
if link.href =~ /show_friend.pl\?id\=(\d+)/
friend_id = $1.to_s
url = "http://mixi.jp/" + link.href
$list[id][:list] << $1
set(friend_id, url, depth)
else
# puts "not mutch"
end
sleep 1
end
puts "size #{$list.size}"
end

result = {}

$list.each do |k,v|
depth = v[:depth]
if result.key?(depth)
result[depth] += 1
else
result[depth] = 1
end
size = v[:list].size if v[:list] != nil
puts "#{k} #{size} #{v[:flag]} #{depth}"
end

result.each do |k,v|
pust "隔たり #{k} 人数 #{v}"
end


結果はアクセスし過ぎで接続不可になってしまいました。
sleepの時間を調節しないとダメみたいです。

間隔を空けない連続的なページの遷移・更新を頻繁におこなわれていることが見
受けられましたので、一時的に操作を停止させていただきます。申し訳ございま
せんが、しばらくの間お待ちください。

0 件のコメント:

干し芋のリスト