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上の記述と異なることがあるが、原因は調査中。