プロレス統計

「プロレスの数字とプロレスする」をテーマにプロレスに関連する数字を調べ、まとめ、考えるブログです。

MENU

ツイート集計プログラム解説

大分長いことお待たせしてしまいましたが、ツイート集計プログラム公開しました。(固定ページに飛びます)
この記事ではその簡単の使い方について説明します。
単純に集計するだけであれば前半の「プログラムの使い方(簡易版)」のみを参照してください。
更に改造したい場合は後半の「仕組み」も参照してください。

このプログラムは下記のQiitaの記事を大いに参考して作成しています、むしろこっちを参照した方が分かりやすい気がする。

qiita.com

 

プログラムの使い方(簡易版)

4つのキーを取得する

TwitterAPIを使うのに必要なCONSUMER_KEY、CONSUMER_SECRET、ACCESS_TOKEN、ACCESS_TOKEN_SECRETを取得する、詳しくは下記記事を参照。
TwitterAPIでは自分のTwitterアカウントを用いてツイートの取得を行うため、集計に用いるアカウントに電話番号を設定する必要がある。

momokogumi.com

Pythonを導入する(Python3.6で動作確認済み)

qiita.com

データ保存用フォルダを作製・指定する

プログラムの中で一番最初にある__init__の関数の中で定義されているself.pathにデータを保存するフォルダのパスを入力する(例:C:\Users\User\Desktopなど)
入力しなければPythonがインストールされているフォルダに保存される。

Spyderを起動し、下記コードを張り付け、あとは検索したいタグ、日時、時間帯(日本ならJST、アメリカならESTなど)を入力してエンターすればうえの保存用フォルダにその日のツイート数データが保存される。
細かい仕様については以下を参照

twitter=SearchTweet()
twitter.Setparams("#njpw","2018-12-01","JST")
twitter.CheckStoredData(overwrite=True)
twitter.Datafiles()
twitter.RepeatSearch()
twitter.Storedata()

仕組み

TwitterAPIの仕組み

簡単に言うと普段Twitterを見る際に使っているアカウントに人間の代わりにプログラムがアクセスして各種操作を行うもの。
そのためそのアカウント・ユーザーを特定するため、上記の4つのキーが必要となる。
Twitterの公式アプリを除くTwitterアプリはいずれもこれを用いている(はず)。
APIにはいくつかの制限があり、それに合わせてプログラムも書かれている。

・取得できるのは1週間以内のツイートのみ
・一定時間以内にリクエストできるのは180回まで
・一度のリクエストで取得できるツイートは100件まで

プログラムの仕組み

今回のプログラムはTwitter上で特定キーワードを含むツイートについて、指定日の毎時のツイート数を集計する。

Setparams

Twitterの検索は検索ワードの後ろにsince~untilで時間制限をつけて検索することが可能になっている。
それを用いて指定日の00時00分00秒~23時59分59秒までのツイートを検索する。
入力パラメータは以下の3つ

・検索キーワード(例:#njpw)
・日にち指定(例:2018年12月1日)
・時間帯(例:日本標準時)

これらを用いた場合はtwitter.Setparams("#njpw","2018-12-04","JST")と言った様にパラメータを入力する。

CheckStoreddata

プログラムの使い方で設定したフォルダに検索キーワードのフォルダ、その内部に指定日のフォルダを作成し、そこに集計された各データが保存されるが、
そこにすでにデータが存在するかどうかを見ている。
検索設定ではそのデータを消去して上書き(overwrite=True)か
そのデータが検索した時刻以降を引き続き検索するか(overwrite=False)を選べる。

Searchtweet

心臓部、TwitterAPIが登録したアカウントを用いてTwitterにアクセスして設定したパラメータに準じたツイートを要求、取得する。
上で述べたようにTwitterAPIでは一度に1~100件のツイートしか取得できない
ツイートは基本的に最も新しいものから順番に取得するので100件以上のツイートの取得には繰り返しが必要で、そのための仕組みが後述のRepeatSearchにある。

またTwitterAPIの特徴として一定時間ごとの検索回数に制限がある(API制限)
プログラムにはAPI制限がかかった際に出てくるメッセージから制限が解除される時刻を読み取り、その時刻まで動作を停止するようになっている(後述のWaitUntilReset)。
一時停止時にはそれまで取得したデータをフォルダに一時保存するようになっている

RpeatSearch

心臓部その2、
SearchTweetは単純にTwitterに上限100のツイートをリクエストし、それを返すだけの関数。
ここではその検索を繰り返し行い、100件以上の連続したタイムラインの取得を可能にする。
一つのツイートにはいろいろな情報が付加されているが、その中にツイート自体のidが存在し、ツイートのリクエスト時にこのidを”max_id”として検索パラメータに入力することでこのツイートより前のツイートから遡る形で検索が可能。
(この設定がなければ、APIは最新のツイートから順に取得する)
ここでは1度のリクエストで取得したツイートの内最も古いもののidをmax_idと設定し、それ以降のツイートを次回の繰り返しで取得するように設定を書き換えている

また前回のmax_idと新たに設定されたmax_idを比較し、これが一致した場合=条件に当てはまるツイートをすべて取得し、それ以降のツイートが存在しない場合に繰り返しを終了する

Analyzetweet

心臓部その3
SearchTweetで取得したツイートについて、取得結果を解析し、各数値を集計している。
この部分を変更することで様々な数値について集計が可能だが、その際にはデータを格納するファイルなども変更が必要であるので注意

今回公開したプログラムでは基本として、ツイート全体(total)、非RTのツイート(nonRT)、RTの三種類をそれぞれ集計している。
各データファイルは24×60の行列の形をしており、i行j列のデータがi時j分00秒~59秒までの1分間の各ツイート数を収納する。

Searchtweetで取得したデータ(timelineと名付けている)はリスト形状になっており、まずfor文でその中の各ツイートについて分析を行う。
各ツイートのデータは辞書型オブジェクトになっており、各キーワードを指定することでそのツイートに関するデータを参照することが可能。
ここでは最初にそのツイートが作成された時刻を知るべく”created_at”というキーワードを参照している。
ここでの時刻はUTC、世界標準時で表示されているのでそれをパラメータで設定した時間帯に変換した上でツイート作成時間の時・分(i時j分とする)を取得している。

これを用いて各数値を計算するが総ツイート数totalであればtotal行列のi行j列に1を加える。
次にそのツイートがRTかどうかの判別を行う。
ツイートには様々なデータがキーワードと共に収納されているが、ツイートが所謂RTである場合、その中に”retweeted_status”というキーワードが存在するのでその有無で非RTかRTかの判別を行う(非RtであればnonRTに+1、そうでなければRTに+1する)。

またここでリツイートとはその名の通り「Re Tweet(呟きなおし)」であり、ツイートとしてはRTした本人がその時刻に同様のツイートをしたことになっている。
そのためツイート内のデータにはRTした側の情報が格納されているが、上述のretweeted_statusの中にはRTされた側の情報、元となったツイートの情報が同様に格納されている。

WaitUntilReset

重要な部分。
TwitterAPIには特定時間内のリクエスト上限が設定されており、それは15分につき180回である。
一度のリクエストにつき取得できるツイート数は100件なのでこのAPI制限中には18000件が取得可能であるが、それ以上の数のツイート取得にはこのAPI制限中は動作を停止し、制限解除と共に取得を再開することが必要である。

これに関してはAPI制限がかかった場合はリクエストした際に取得したもののheaderに'x-rate-limit-remaining'と'x-rate-limit-Reset'というキーワードが存在する。
前者は「残りの可能取得数」であり後者は「API制限が解除される時刻」である。
酔って前者が0になった場合に動作を停止するシステムがSearchTweetにある

Datafiles

上記のプログラムでデータを格納するオブジェクトを作成する。
集計するデータを増やす場合はここも変更が必要。

StoreData

オブジェクトに収納されているデータをPCのストレージ上に保存する。
WaitUntilResetによって集計が中断された際にデータをと注する保存するようになっており、通信エラーなどで集計が途中で途切れたとしてもそこまでのデータは保存されており、
上記のCheckStoredDataにoverwrite=Falseと入力して再度プログラムを実行すれば集計できたツイート以降(以前)のツイートから集計を再開できる。

 

最後に

時間がかかった上に書いてる本人が混乱しつつあるないようですが、簡単なプログラムの仕組みでした。
まぁプログラムなんてとりあえず走らせてみてどういう仕組みなのかを理解した方が早かったりするので気軽に走らせて見てください。
一応質問などあれば返答できる範囲である限り答えようと思います。

きょうはこれまで、それでは

人気ブログランキング