PythonでTwitterのフォロワー数をグラフ化する
3月からブログメンタリングを受けており、ブログ週間PV
、累計はてなブックマーク数
、ブログ読者登録数
、Twitterフォロワー数
をKPIとして設定しています。
今まではただ確認するだけでしたが、せっかくなのでグラフにして施策を打ちやすい状態を作ることにしました。Jupyter Notebook
上でスクレイピングをして、Matplotlib
を用いてグラフ化し、ipynbファイルをバッチで実行してhtmlファイルを吐き出します。なお、Google Apps Script
を検討していましたが、デフォルトアカウントでしかスクリプトがかけないため、複数アカウントを使っている私には大変そうなのでやめました。
今回の記事ではTwitterフォロワー数
のスクレイピングとバッチ設定とグラフ化について書きます。
環境
Jupyter Notebookを使います。
python -V #Python 3.6.5 jupyter --version #4.4.0
Tweepyでフォロワー数を取得
Twitterのフォロワー数についてはTweepy
というライブラリを用いて行います。
pip install tweepy
次に下記の記事を参考にTwitter APIの登録をして、APIキーなどを取得してください。
auth = tweepy.OAuthHandler(API_KEY, API_SECRET_KEY)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth,wait_on_rate_limit = True)
Jupyter Notebookを新しく開き上記のコードで事前に設定をしたら、api.me()
で自分のTwitterアカウントの情報を取得できます。私はtwitter_collection.ipynb
という名前で実行することにしました。
api.me().followers_count api.me().friends_count
Twitterのフォロワー数の履歴はtweepyを用いては取得できず、他のサイトからクローリングする必要があります。そのため、今回は日々Twitterのフォロワー数をCSVに記録することとします。
PATH = "data/twitter.csv" dt_now = datetime.datetime.now() #もしファイルがあれば if os.path.exists(PATH): with open(PATH, 'a') as f: writer = csv.writer(f) writer.writerow([dt_now.strftime('%Y年%m月%d日'), followers, followees]) else: with open(PATH, 'w') as f: writer = csv.writer(f) writer.writerow(["日付", "フォロワー数", "フォロー数"]) writer.writerow([dt_now.strftime('%Y年%m月%d日'), followers, followees])
ipynbのバッチ化
Jupyter Notebookのバッチ化はrunipy
というライブラリを用いて行います。
pip install runipy
これで下記のようにコマンドラインからipynbを実行できるようになります。
runipy twitter_collection.ipynb
このコマンドをcron
で設定します。ターミナルで下記を入力します。
$ crontab -e
何も書き込まれていないファイルが開かれるので、下記を入力します。毎朝7時にコマンドを実行します。パスは絶対パスで指定してください。
PYTHONIOENCODING = 'utf-8' LANG=ja_JP.UTF-8 0 7 * * * cd (実行パス);(runipyの絶対パス)(ipynbの絶対パス)
0 7 * * *
は(分)(時)(日)(月)(曜日)です。ワイルドカードで指定すると毎分や毎時という設定になります。ホームディレクトリでコマンドが実行されるので、cd
で移動してからコマンドを叩くようにします。コマンド自体のパスも絶対パスで指定します。
集計したデータのグラフ化
Jupyter Notebookをまた新たに開き、モジュールを読み込みます。私はtwitter_analysis.ipynb
という名前で実行することにしました。
import pandas as pd import numpy as np %matplotlib inline
CSVからデータを読み込みます。
PATH = "data/twitter.csv" dates = [] followers = [] followees = [] with open(PATH) as f: h = next(csv.reader(f))#ヘッダー行を読み飛ばす reader = csv.reader(f) for row in reader: dates.append((row[0])) followers.append(int(row[1])) followees.append(int(row[2]))
読み込んだデータをグラフ化します。
df = pd.DataFrame( { 'follower': followers, 'followee': followees }, index = dates ) df.plot()
最後に作ったJupyter Notebookからhtmlファイルを吐き出します。ターミナルで以下を実行してください。
runipy twitter_analysis.ipynb twitter_analysis_out.ipynb jupyter nbconvert twitter_analysis_out.ipynb --to html
上記のコマンドもcron
に登録してもいいでしょう。
参考資料
ソースコードは以下に置きました。
今回の分のソースコードはスクレイピング部分がtwitter_collection.ipynb
、グラフ化部分がtwitter_analysis.ipynb
です。
グラフは下記のように出力されます。