Twitterでフォローしてる人を取得

apiで取得しようとすると100人ぐらいで取得できなくなるので、作った。
ユーザー名とパスワード入れて使う。
スクレイピングもっと効率的なやり方あるだろうし。
ページ変わると動かなくなるのであまり推奨できない。
あとrubyのマーシャルデータで保存。

#!/usr/bin/env ruby

require 'rubygems'
require 'mechanize'

def login(mail, pass)
  agent = WWW::Mechanize.new()
  page = agent.get("http://twitter.com/")
  form = page.forms.first
  form['session[username_or_email]'] = mail
  form['session[password]'] = pass
  form.submit
  agent
end

def get_folloing(agent, result, url, user)
  filter = ["invitations/find_on_twitter",
            "home", user, "following", "#{user}/favorites", ""] 
  
  nexturl = ""
  puts "url: #{url}"
  begin
    page = agent.get(url)
  rescue
    puts "error: #{url}"
    return result
  end
  
  req = page.root.search('a').map {|e| e['href']}
  req.each do |i|
    if /http:\/\/twitter.com\/(.*)/ =~ i
      fr = true
      name = $1
      
      result.each do |j|
        if name == j
          fr = false
          break
        end
      end

      filter.each do |j|
        if name == j
          fr = false
          break
        end
      end
      
      if fr
        puts name
        result << name
      end
    end
    
    if /\/following\?page=(.*)/ =~ i
      if $1.to_i > 0
        nexturl = "http://twitter.com#{i}"
      end
    end
  end

  if nexturl != ""
    get_folloing(agent, result, nexturl, user)
  end
  result
end

def main(user, pass)
  r = []
  agent =login(user, pass)
  list = get_folloing(agent, r, "http://twitter.com/#{user}/following", user)
  puts list.size
  open("follow.dat", "w") {|f| Marshal.dump(list, f)}
end

user = "user"
pass = "pass"

main(user, pass)