隔たり次数がすぐに上がってしまうバグもあったので修正しました。
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 件のコメント:
コメントを投稿