ぴよまるがアウトプットするってさ

コーディング力に自信のないWebエンジニアが自信をつけるために試したことまとめます。コンパイラ言語を試したり、フレームワークのコードを読んだり、業務で使うAWSやReactについての記事を書きます。

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キーなどを取得してください。

qiita.com

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に登録してもいいでしょう。

参考資料

qiita.com

qiita.com

qiita.com

ソースコードは以下に置きました。

github.com

今回の分のソースコードスクレイピング部分がtwitter_collection.ipynb、グラフ化部分がtwitter_analysis.ipynbです。

グラフは下記のように出力されます。

f:id:let_piyomaru:20200414150810p:plain
Twitterのフォロワー数