Ruby+MechanizeでTwitterのfollowingをスクレイピングしてみる

WWW::Mechanize を使って、Twitter の following ユーザを取得してみる。ソースコードは以下の通り。

require 'rubygems'
require 'mechanize'
require 'logger'

cookie_path = '/tmp/twitter_client.cookie.yaml'
target = 'mirakui'

agent = WWW::Mechanize.new

# お好みで Logger
logger = Logger.new STDOUT
logger.level = Logger::INFO
agent.log = logger

# UA 偽装
agent.user_agent_alias = 'Windows IE 7'

# cookie をファイルから読み込む
agent.cookie_jar.load cookie_path if File.exist? cookie_path

# friends の1ページ目を開く
uri = URI.parse "http://twitter.com/#{target}/friends"
top = agent.get uri

# login 画面に飛ばされたらログインする
if top.uri.path == '/login'
  username = 'username'
  password = 'password'
  f = top.forms[0]
  f['session[username_or_email]'] = username
  f['session[password]'] = password
  f.checkboxes.name('remember_me').check
  top = f.submit
end

# friends の取得
friends = []
loop do
  page = agent.page

  # ページに書かれているユーザ名をすべて取得
  (page / 'a.uid[@href]').each do |uid|
    friends << uid.inner_text
  end

  # '次へ'ボタンがあれば次のページを開く
  next_button = (page / 'a[@rel*="next"]')
  break if next_button.empty?
  agent.get next_button.attr('href')
end

# 表示
puts friends.join("\n")
puts "#{target} follows #{friends.length} users."

# cookie を保存する
agent.cookie_jar.save_as cookie_path

出力は以下のとおり。

Hamachiya2
    :
  (略)
    :
narutoda
kunigaku
knzw
tohae
ono_matope
aki426
mirakui follows 176 users.

Mechanize を使うと、こんな感じで簡単かつ強力にスクレイピングできる。Twitter はよく落ちたり仕様変更したりするので、クローラとして実装するには、もうすこしロバストに処理してやる必要がある。
このスクリプトで取得した following 数は、ユーザによってはWeb上の記述と異なることがあるが、原因は調査中。