twitterのwebから一定時間ごとにTL取得してつぶやき切り出して表示
前回に引き続き、Nokogiriっていうrubygemを使って名前やつぶやきを切り出して表示してみました。
Nokogiriの使い方を思い出せるように糞コードですがぺたりしておきます。
スクレイピングは規約で禁止されてるらしいので自己責任です。
終了はCtrl+Cなど強制終了で。
#!/usr/bin/env ruby require 'rubygems' require 'mechanize' require 'nokogiri' username = '' #ユーザ名を入れる password = '' #パスワードを入れる interval = 15 #TL取得間隔(秒) class Tweet def initialize(user,status,url) @user = user @status = status @url = url end def output print @user + ':' puts @status end def sametweet(url) #取得済みtweetを特定 if @url == url return true else return false end end end agent = WWW::Mechanize.new agent.user_agent_alias = 'Windows IE 7' agent.get('http://twitter.com/login') agent.page.form_with(:action => 'https://twitter.com/sessions'){|form| form.field_with(:name => 'session[username_or_email]').value = username form.field_with(:name => 'session[password]').value = password form.click_button } tweets = [] loop do i = 0 doc = Nokogiri(agent.page.body) # class属性が"hentry"から始まるli要素 doc.search('//li[starts-with(@class,"hentry")]').map{|e| #imgnode = e.search('img') #puts imgnode.attribute('src') #iconのurlを取得 #puts imgnode.attribute('alt') #nameを取得 user = e.search('strong').text status = e.search('span.entry-content').text url = e.search('a.entry-date').attribute('href').text #既に取得したtweetは登録しない registered = false tweets.each{|tw| registered = tw.sametweet(url) break if registered == true } unless registered tweets << Tweet.new(user,status,url) tweets.last.output i += 1 end } puts '新着'+i.to_s+'件' sleep interval agent.get('http://twitter.com/') end
課題点
20件以上取得できないので2ページ目以降も取得しに行くなど。