2008年2月9日土曜日

ネットワーク理論2

mixiへ再びアクセスできるようになりました。
隔たり次数がすぐに上がってしまうバグもあったので修正しました。

mixiのユーザ件数は1000万くらいだったので、スクリプトを途中で
止めた場合に内容をダンプする機能を付け加えました。

あと、アクセスする間隔は2秒が最適のようです。
メモリーが最後まで足りるかは?です。すべてのユーザにアクセスする
には先が長そうです。

途中経過(6千人程度)です。
隔たり次数 0 人数 1
隔たり次数 1 人数 38
隔たり次数 2 人数 365
隔たり次数 3 人数 3716
隔たり次数 4 人数 1832
全人数 5952

list.yaml
"自分のMIXIのID": 
:url: http://mixi.jp/show_friend.pl
:flag: false
:depth: 0


スクリプト
require 'rubygems'
require 'mechanize'
require "yaml"

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)


def url()
a = nil; id = ""
$list.each do |k,i|
if i[:flag] == false
if a == nil
a = i; id = k
end
if a[:depth] > i[:depth]
a = i
id = k
end
end
end
id
end

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

def output_data
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|
puts "隔たり次数 #{k} 人数 #{v}"
end
puts "全人数 #{$list.size}"
end

$list = YAML::load(File.open("list.yaml").read)

Signal.trap('INT') do
output_data()
YAML.dump($list, File.open("list.yaml", 'w'))
exit 0

end

while (id = url()) != nil
$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)
end
end
$list[id][:flag] = true
puts "#{id} size #{$list.size}"

#中間報告
output_data() if rand(50) == 20
sleep 2
end

output_data()



本はこれです。

0 件のコメント:

干し芋のリスト