てすてぃんぐライフ

駆け出しQAエンジニアの備忘録

TwitterAPI学習:Python + Streaming API + SQLiteで特定のキーワードを含むツイートを抽出して保存する

TwitterAPIの学習として。 「特定のキーワードを含んだツイートを抽出したい!」と思ったので、作ってみました。

こちらの記事を大いに参考にしました。とっても助かりました。 PythonでStreaming APIを使用して特定のキーワードを含んだツイートを取得しつづける - Qiita

やったこと:

  • Streaming APIを使って、特定のキーワードを含むツイートをリアルタイムに取得
  • 取得したツイートのうち、認証済みアカウントのツイートのみを抽出する
  • 抽出したツイートをSQLiteに保存
  • 言語はPython

アクセストークン等を取得

Streaming APIを使うためには、Twitter側での設定が必要です。 Twitterにログインした状態で、https://apps.twitter.com/ にアクセス。 アプリを作成します。

アプリを作成後、「Keys and Access Token」タブをクリックし、 APIKeyなどの4つのキーをメモします。

ソースを作成

http://qiita.com/mima_ita/items/ecdf7de2fe619378beeeソースコードをもらい、twtter_stream.pyという名前でローカルに保存します。

テスト実行

実行します。

$ python twitter_stream.py consumer_key consumer_secret access_token_key access_token_secret hogehoge

ちなみに、自分は上記実行時に認証エラーになりました。 原因は、ローカルPCのVMの時刻がずれていたため。ntpで時刻同期して実行したら、ちゃんと動作しました。

データベースを確認します。

$ sqlite3 twitter_stream.sqlite 
sqlite> select * from twitte;

ずらずらっと保存されているはず。

ソースを修正

認証済みアカウントのツイートのみを抽出するようにします。 なお、Twitterオブジェクトの解説はこちらが便利です。

TwitterAPIのデータの中身をまとめてみた - 生涯未熟

修正したのは2箇所。

まずはTwitteクラスにverifiedを追加します。Booleanで。

class Twitte(Model):
    createAt = DateTimeField(index=True)
    idStr = CharField(index=True)
    contents = CharField()
    verified = BooleanField()

次に、DBに保存する部分に条件分岐を入れます。verifiedはuserの中にあります。

    for item in GetStreamFilter(api, track=track):
        if 'text' in item:
            if item['user']['verified']:
                print (item['id_str'])
                print (dateutil.parser.parse(item['created_at']))
                print (item['text'])
                print (item['user']['verified'])
                row = Twitte(createAt=dateutil.parser.parse(item['created_at']),
                             idStr=item['id_str'],
                             verified=item['user']['verified'],
                             contents=item['text'])
                row.save()
                row = None

これで保存して、プログラムを実行すればok。 ちなみに、修正前にプログラムを実行した際のDBが残っていると、カラムが違いますねというエラーが出るので、.sqliteを削除するのを忘れずに。