Tweepy
前回はTwitter制御ライブラリTweepyを使って、ブログの宣伝用のプログラムを作成してみました。

今回はもう少し難しくして、アカウントのツイート数、リツイート数、いいね数などを数える、さらにツイートのログを保存するプログラムを作ってみましょう。
ツイートのログを保存する理由としては、次に作るプログラムと関連しているのですが、それはまたそのプログラムを紹介するときにお話しすることにしましょう。
今回のプログラムに関してもう少し詳しくいうと、ツイート数はあるアカウントがしたツイート数という一つの意味しかありませんが、リツイート数といいね数はあるアカウントが”した”数と”受けた”数の二種類があります。
それらの値をどうやって取得するのか、今回のプログラムではそこがなかなか難しいところだったりします。
ということで順を追って解説していきましょう。
Twitter API部分
最初はいつも通りライブラリのインポートとTwitter APIへの接続部分です。
<セル1>
import tweepy
import datetime
import pandas as pd
account = "account"
timenow = datetime.datetime.now()
consumer_key = 'consumer key'
consumer_secret = 'consumer secret'
access_token = 'access token'
access_token_secret = 'access token secret'
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth, wait_on_rate_limit = True)
Twitter APIへの接続は何度も出てきているので、解説は省きます。
今回ライブラリは、tweepyに加え、datetimeモジュールとpandasを使いますのでインポートしておきます。
基本的にはこちらの記事を参考にしてもらえれば大丈夫だと思います。

あとはこの時点で情報を取得するアカウントとこのプログラムを実行した時点での時間を取得しておきます。
account = "account"
timenow = datetime.datetime.now()
セッティング部分
次はこのプログラムのセッティングの部分です。
<セル2>
data = r"/path/data.csv"
output_tweet = r"/path/tweet_log/" + str(timenow.strftime("%Y%m%d_%H%M%S")) + ".txt"
# index_name = ["date", "tweet", "favorite", "follow", "follower", "retweet_tw", "favorite_tw"]
df = pd.read_csv(data)
df["date"] = pd.to_datetime(df["date"])
ここでは環境に応じて変更可能な変数だったり、最初にやっておく処理を記載しています。
まずはこちらの2行から解説していきます。
data = r"/path/data.csv"
output_tweet = r"/path/tweet_log/" + str(timenow.strftime("%Y%m%d_%H%M%S")) + ".txt"
今回、このプログラムを実行した際、二つのデータをサーバー上(もしくは実行したパソコン上)に保存するように設定する予定です。
一つはツイート数やリツイート数、いいね数を保存するということで、もう一つはあるアカウントがツイートした内容を保存するということです。
最初の「data = r”/path/data.csv”」はツイート数やリツイート数、いいね数を保存するファイルを指定しています。
もう一つの「output_tweet = r”/path/tweet_log/” + str(timenow.strftime(“%Y%m%d_%H%M%S”)) + “.txt”」はツイートのログを保存するためのファイルです。
ツイートのログに関しては、このプログラムを実行した時間をファイル名とすることで、前の実行で出力されたファイルを消さないように、またいつ実行されたログなのか分かりやすくしています。
下3行に関してはPandasの設定です。
# column_name = ["date", "tweet", "favorite", "follow", "follower", "retweet_tw", "favorite_tw"]
df = pd.read_csv(data)
df["date"] = pd.to_datetime(df["date"])
Pandasを使っているのはツイート数、リツイート数、いいね数などをまとめて表にして、保存するために使っています。
最初の行はその列名(カラム名)をリストとして保存しているのですが、プログラム上では使わないのでコメントアウトしてあります。
何番目になんのデータがあるかという備忘録というわけです。
次の行の「df = pd.read_csv(data)」でデータのファイルをPandasのデータフレームとして読み込んでいます。
そして「df[“date”] = pd.to_datetime(df[“date”])」は「date」の列は日時を格納しているのですが、それを日時のデータだと「pd.to_datetime()」を使って修正しています。
メインプログラム部分〜アカウント情報取得〜
次にメインプログラム部分です。
<セル3>
def main():
user = api.get_user(account)
tweet_num = user.statuses_count
favorite_num = user.favourites_count
follow_num = user.friends_count
follower_num = user.followers_count
# print(tweet_num, favorite_num, follow_num, follower_num)
tweets = tweepy.Cursor(api.user_timeline, tweet_mode = 'extended', id=account).items(100)
tw_favorite_num = 0; tw_retweet_num = 0
with open(output_tweet, "w") as f:
for tw in tweets:
if df.iloc[-1]["date"] < (tw.created_at + datetime.timedelta(hours=9)):
if not (tw.full_text.startswith("RT")) or (tw.full_text.startswith("@")):
# print(tw.full_text + "\n")
f.write(tw.full_text)
tw_retweet_num = tw_retweet_num + tw.retweet_count
tw_favorite_num = tw_favorite_num + tw.favorite_count
# print(tw_retweet_num, tw_favorite_num)
api.update_status(str(timenow.strftime("%Y年%m月%d日")) +
"\nツイート数 :" + str(tweet_num - df.iloc[-1]["tweet"]) + "(計:" + str(tweet_num) + ")" +
"\nいいねした数 :" + str(favorite_num - df.iloc[-1]["favorite"]) + "(計:" + str(favorite_num) + ")" +
"\nフォロー数 :" + str(follow_num - df.iloc[-1]["follow"]) + "(計:" + str(follow_num) + ")" +
"\nフォロワー数 :" + str(follower_num - df.iloc[-1]["follower"]) + "(計:" + str(follower_num) + ")" +
"\nリツイートされた数:" + str(tw_retweet_num) +
"\nいいねされた数 :" + str(tw_favorite_num))
df.loc[str(len(df))] = [timenow, tweet_num, favorite_num, follow_num, follower_num, tw_retweet_num, tw_favorite_num]
df.to_csv(data, index=False)
ここは長いのでまた一つ一つ見ていきましょう。
まずは最初の部分で、アカウントの情報を取得している部分です。
user = api.get_user(account)
tweet_num = user.statuses_count
favorite_num = user.favourites_count
follow_num = user.friends_count
follower_num = user.followers_count
# print(tweet_num, favorite_num, follow_num, follower_num)
実はあるアカウントがしたツイート数(累計)、いいね数(累計)とフォロー数、フォロワー数は簡単に取得することができます。
まず「user = api.get_user(account)」ですが、これでそのアカウントに関する情報をまるっと取得することができます。
そして累計のツイート数は「user.statuses_count」、累計のいいね数は「user.favourites_count」、フォロー数は「user.friends_count」、フォロワー数は「user.followers_count」でそれぞれ取得します。
最後の行はコメントアウトしていますが、確認のためのprintです。
メインプログラム部分〜受けたリツイート数、いいね数の取得¥〜
実は厄介なのが、あるアカウントのツイートに対して”受けた”リツイート数といいね数の取得です。
なんとか頑張って取得した結果がこちらです。
tweets = tweepy.Cursor(api.user_timeline, tweet_mode = 'extended', id=account).items(100)
tw_favorite_num = 0; tw_retweet_num = 0
with open(output_tweet, "w") as f:
for tw in tweets:
if df.iloc[-1]["date"] < (tw.created_at + datetime.timedelta(hours=9)):
if not (tw.full_text.startswith("RT")) or (tw.full_text.startswith("@")):
# print(tw.full_text + "\n")
f.write(tw.full_text)
tw_retweet_num = tw_retweet_num + tw.retweet_count
tw_favorite_num = tw_favorite_num + tw.favorite_count
# print(tw_retweet_num, tw_favorite_num)
頑張ってやってみたのですが、私のプログラミング力では、あるアカウント、ある時点での全てのツイートに対するリツイート数やいいね数を取得することはできませんでした。
実は個人用の無料Twitter APIではツイートの取得できる日数が14日前までと決まっているため、仕様的にも取得できなかったりします。
ということで今回のプログラムでは、前にこのプログラムを実行した時点から今の時点までの間で、あるアカウントが行ったツイート(リツイートやメンションも含む)100件のうち、そのアカウントが発信した(つまりリツイートや返信ではない)ツイートに対して受けたリツイート数といいね数をカウントするようにしました。
最終的にはこのプログラムはcronで1日に1回実行する予定なので、その間に発したツイートに対するリツイート数、いいね数を取得するというわけです。
ということでまずは「tweets = tweepy.Cursor(api.user_timeline, tweet_mode = ‘extended’, id=account).items(100)」で100件のツイートを取得しています。
またこのとき「tweet_mode = ‘extended’」とすることでツイート全文を取得しています。
次に取得した100件のツイートを一つずつ取得し、リツイート数、いいね数をカウントしていくため、「tw_favorite_num = 0; tw_retweet_num = 0」としてそれぞれのカウントを0としています。
次に「with open(output_tweet, “w”) as f:」とすることで、ツイートのログ用ファイルを開きます。
あとでツイートを保存するときに開いてもいいのですが、あまり開いたり閉じたりしたくないので、なるべく早い時点で開くようにしました。
「for tw in tweets:」で先ほど取得した100件のツイートを1件ずつ取得します。
100にした理由は流石に1日100回もツイートしないだろうという思いからです。
「if df.iloc[-1][“date”] < (tw.created_at + datetime.timedelta(hours=9)):」では、「df.iloc[-1][“date”]」で前回このプログラムを実行した日時を「data.csv」より取得し、ツイートの日時と比較しています。
そして前回のプログラム実行日時よりも後のもののみ取得しています。
この理由としてはtweepyでは件数を定義してツイートを取得しているため、どうしても古いツイートが混ざってきてしまいます。
そこでツイート作成日時を取得できるこのタイミングで最新のツイートのみ取得しているわけです。
そして次に「if not (tw.full_text.startswith(“RT”)) or (tw.full_text.startswith(“@”)):」でリツイートしたものでもなく、また返信でないもの、つまり自分発のツイートのみ取得しています。
次の2行はツイートを確認し、保存するためです。
print(tw.full_text + "\n")
f.write(tw.full_text)
ツイートが適切に取得できれば、そのツイートに対するリツイート数は「tw.retweet_count」、いいね数は「tw.favorite_count」で取得できるため、次の部分で累積を計算していきます。
tw_retweet_num = tw_retweet_num + tw.retweet_count
tw_favorite_num = tw_favorite_num + tw.favorite_count
メインプログラム部分〜統計データのツイート〜
最後にツイート数やリツイート数、いいね数をツイートする部分です。
api.update_status(str(timenow.strftime("%Y年%m月%d日")) +
"\nツイート数 :" + str(tweet_num - df.iloc[-1]["tweet"]) + "(計:" + str(tweet_num) + ")" +
"\nいいねした数 :" + str(favorite_num - df.iloc[-1]["favorite"]) + "(計:" + str(favorite_num) + ")" +
"\nフォロー数 :" + str(follow_num - df.iloc[-1]["follow"]) + "(計:" + str(follow_num) + ")" +
"\nフォロワー数 :" + str(follower_num - df.iloc[-1]["follower"]) + "(計:" + str(follower_num) + ")" +
"\nリツイートされた数:" + str(tw_retweet_num) +
"\nいいねされた数 :" + str(tw_favorite_num))
df.loc[str(len(df))] = [timenow, tweet_num, favorite_num, follow_num, follower_num, tw_retweet_num, tw_favorite_num]
df.to_csv(data, index=False)
ここでは最初に「str(timenow.strftime(“%Y年%m月%d日”)」として日時を、その後に統計データをつなぎ合わせて行っています。
注意すべき点はツイート数やいいねした数、フォロー数、フォロワー数は累計として取得しているので、前日からの変化量が知りたい場合は、前日の値をどこかに保存しておき、引き算しなければいけません。
そのため「data.csv」にこれらのデータを保存しているということです。
ツイートが終わったら、新しいデータをデータフレームに追加して、ファイルとして保存するということをしています。
df.loc[str(len(df))] = [timenow, tweet_num, favorite_num, follow_num, follower_num, tw_retweet_num, tw_favorite_num]
df.to_csv(data, index=False)
この次のセルは2行なのでここで解説してしまいますが、Pythonスクリプトとして直接実行できるよう、この2行を記述を忘れずに。
if __name__ == '__main__':
main()
もう一つの必要ファイル
ここまででプログラムは完成したのですが、実はこれだけではこのプログラムは動きません。
次は「data.csv」を最初から指定したパス上に置いておく必要があります。
本来ならばファイルがない場合は作成するという処理を入れておくべきなのでしょうが、まぁ自分が使うプログラムだし、「data.csv」を最初から置いておけばいいかということで、手抜きをしております。
もし必要な方がいらっしゃいましたら、ここにアップロードしておきますので、ご自由にお使いください。
あとはサーバー上にアップして、cronの設定をしてということでこれまでにも解説していることなのでここでの解説は省きます。

次回はこのプログラムと連携するもう一つのプログラムを作っていきます。
ではでは今回はこんな感じで。
コメント