またまたPythonです
Qiitaで以下の記事を発見しました
面白そうというのとPythonだけでもイケる?ということで真似させていただきました(勝手にごめんなさい<( )>)
環境
TwitterAPIでツイートを検索
ツイート検索APIを使ってハッシュタグのツイートを検索します
APIを利用するために Twitter Developer Platform — Twitter Developers でアプリケーションの登録をします
登録ができると4種類キーが発行されるのでメモしておいてください.API実行で必要となります
session = OAuth1Session(settings.TWITTER['CONSUMER_KEY'], settings.TWITTER['CONSUMER_SECRET'] , settings.TWITTER['ACCESS_TOKEN'], settings.TWITTER['ACCESS_TOKEN_SECRET']) yesterday = datetime.date.today() - datetime.timedelta(1) params = {'q': u'#lovelive', 'count': 200, 'lang': 'ja', 'until': yesterday.strftime("%Y-%m-%d")} response = session.get('https://api.twitter.com/1.1/search/tweets.json', params=params)
#lovelive
タグが付いている昨日ツイートを200件検索しています
TwitterAPIには色々制限があるようで、一度に検索できる件数に上限があるようなので件数指定を行っています
制限対策
件数以外にも何度かAPIを実行しているとwait時間がAPIの結果に設定されてきます
だいたい15分程度の時間が返ってきますが念のため+5秒待つようにしてみました
sec = int(response.headers['X-Rate-Limit-Reset']) - time.mktime(datetime.datetime.now().timetuple()) print("{0}---{1} sec sleep".format(datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S"), sec)) time.sleep(sec + 5)
ファイル書き込み
取得できたファイルをSparkで解析させるためにファイルに書き込みます
そのときに不要となるツイートを除去しておきます
params['max_id'] = max_id
は200件以降のツイートを取得するために指定します
res_text = json.loads(response.text) max_id = "" for tweet in res_text['statuses']: match = re.search(r'(全員|ふぁぼ|ファボ|定期|相互|RT)', tweet['text'], re.MULTILINE) if match is None: f.write(tweet['text'] + '\n') max_id = tweet['id'] params['max_id'] = max_id
文言解析
ツイートを単語に切り分けてお好みで不要な文言も除きます
①:検索ワードに使ったハッシュタグを除外
②:ハッシュタグを除外
③:2文字以下の文言は除外
などなど
textfile = sc.textFile("tweets.txt") words = textfile.flatMap(lambda line: line.split()) words_filter = words.filter(lambda x: SEARCH_KEYWORD not in x) # ① words_filter = words.filter(lambda x: "#" not in x) # ② words_filter = words.filter(lambda x: len(x) >= 2) # ③ words_tuple = words_filter.map(lambda word: (word, 1)) words_count = words_tuple.reduceByKey(lambda a, b: a + b) words_count_sorted = words_count.sortBy(lambda t: t[1], False)
D3.jsのバブルチャート表示
名称と値をD3.jsにJSONで渡してあげると簡単にチャートを表示することができます
まとめ
TwitterAPIの制限でツイート集めに多少の時間が掛かるのが難ですが、比較的かんたんに作れたかと思います
参考にさせていただいたAKB428様ありがとうございました!
今回作ったソースはGitHubにあげてあります