Twitter解析

MikuHatsune2013-11-01

声優統計第三号がC85に当選となったのでネタとしてはTwitterを解析しようと思った。
ということでまずはデータ取り(タイムライン取得)をやる。
結論としてはRでやるよりPythonでやるほうがよかった。あとはAPIがバージョンが変わったとかなんとかでたくさんのtweetを取得することができないらしいのでどうしようか悩む。
 
下準備として、Twitter Developerにアプリを登録して、Consumer key, Consumer secret, Access token, Access token secret をメモる。
 
PythonではTwythonが使いやすい。こちらこちらを参考にして、オバマ大統領のタイムラインを取得してみる。結果はJSON形式で得られる。

from twython import Twython, TwythonError
api = twython.setup(authtype="Basic", username="あなたのtwitter-name", password="あなたのtwitter-pass")
twitter = Twython(app_key=CONSUMER_KEY,                      # ここらにそれぞれ
                  app_secret=CONSUMER_SECRET,                # developer でメモった
                  oauth_token=ACCESS_TOKEN,                  # key を入力すると
                  oauth_token_secret=ACCESS_TOKEN_SECRET)    # 認証されるっぽい。

try:
    user_timeline = twitter.get_user_timeline(screen_name='BarackObama', count=30) # オバマ大統領のアカウントを30tweet取得する。
except TwythonError as e:
    print e

for tweet in user_timeline:
    print tweet['text'] + "\n"
It's time to work together to get people covered. Join Team Obamacare: http://t.co/DiLZVfGBE5

Since President Obama took office in 2009, the national deficit has been cut by more than half: http://t.co/s0ByngWJcV

Be a part of Team @Obamacare―help ensure millions of Americans have the info they need to get affordable health care: http://t.co/4GrX0ui3bg

Don't let anyone scare you out of getting affordable health insurance. #GetCovered http://t.co/l85M6jeh8k

Happy Halloween! http://t.co/HXk2zd2F8z

というわけで複数の人のtweetを取得するならば

import codecs
import unicodedata
import re
from progressbar import *
import time
from twython import Twython

wd = "/output/" # 出力ディレクトリ
cv = []         # アカウント
n_tweet = 4000  # 取得するtweet数

widgets = ["progress:", Percentage(), Bar()]
pbar = ProgressBar(maxval=len(cv), widgets=widgets).start()

w0 = codecs.open(wd + "tweet.tsv", "w", "utf-8")
for i in cv:
	pbar.update(pbar.currval + 1) # 時間かかるようならプログレスバー
	try: # タイムラインの取得
		user_timeline = twitter.get_user_timeline(screen_name=i, count=n_tweet)
	except TwythonError as e:
		print e
	
	for tweet in user_timeline:
		sub_text = re.sub("\n", "", tweet['text']) # 改行コードは削除しないと tsv が乱れる。
		w0.write(i + "\t" + sub_text + "\n")       # 書き込み

w0.close()
pbar.finish()

 
RではtwitteRでできる。が、R > 3.0 ではなんかうまくいかない。2.15.1 以下でないとうまく動かない(?)。
これがものすごい詳しそうな解説なのだが、なぜかubuntutwitteR入らないんだよな…

library(twitteR)

reqURL <- "http://api.twitter.com/oauth/request_token"
accessURL <- "http://api.twitter.com/oauth/access_token"
authURL <- "http://api.twitter.com/oauth/authorize"
consumerKey <- "CONSUMER_KEY"
consumerSecret <- "CONSUMER_SECRET"
oauthKey <- "ACCESS_TOKEN"
oauthSecret <- "ACCESS_TOKEN_SECRET"
twitCred <- OAuthFactory$new(consumerKey=consumerKey,
	consumerSecret=consumerSecret,
	oauthKey = oauthKey,
	oauthSecret = oauthSecret,
	requestURL = reqURL,
	accessURL = accessURL,
	authURL = authURL)

options(RCurlOptions = list(cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl")))
twitCred$handshake(cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl"))

# としたらアプリ認証のリンクを踏めと出るので、それを踏んでPINコードを入力する

registerTwitterOAuth(twitCred) # TRUE なら多分認証が通っている。

これでタイムラインが取得できる。APIの問題でたくさん取得できないらしい。

tw <- userTimeline("BarackObama", n=3200)

# 複数アカウントなら
cv <- c("", ...)
tw <- mapply(userTimeline, cv, n=3200)