このページに書かれている内容はTwitter APIの有料化により無料では使用できなくなっています.
特定のユーザーがいいねしたツイートを取得する で紹介したコードを使って「いいね」に関して調べます. フォローしている人のいいねの情報を取得し,よくいいねしてくれる人 特定のユーザーがよくいいねしているアカウント よくいいねされている人などを調べます.
いいねの情報を取得するget_favoritesには15分で75回までというレート制限があります. そのため,たくさんの人をフォローしている場合,ここで紹介するコードを実行し終えるにはとても時間がかかります. 例えば600人フォローしているアカウントについて直近1000件のいいねについて調べたい場合,1回のget_favoritesでは200件までしか取得できませんから1アカウントに対して最悪の場合で5回実行することになります.(1000件のいいねがない場合は5回より少なくなります) そのため15分で15アカウントに関してしか情報を集めることができません. 600人フォローしているので600分=10時間かかることになります... 以下では1000件の情報を集めていますが,フォローしている人数が多い場合は1アカウントにつき集める情報を減らすなどして実行時間を減らしたほうがいいかもしれません.
APIキー アクセストークンを使ってAPIオブジェクトを作成します. 以下のコードをコピペしてAPIキー アクセストークンの部分だけ書き換えてください. 今回はAPIオブジェクトの作成時にwait_on_rate_limitを設定してレート制限によるエラーを回避します. APIキー アクセストークンを忘れた方はアクセストークン・API Keyについてをご覧ください.
# tweepy.__version__ == '4.12.1'
import tweepy
# アクセストークンなどの識別コードを入力します
access_token= "Access Tokenを入力してください"
access_secret = "Access Token Secretを入力してください"
api_key = "API Keyを入力してください"
api_key_secret = "API Key Secretを入力してください"
bearer_token = "Bearer Tokenを入力してください"
# APIオブジェクトを作成します
auth = tweepy.OAuthHandler(api_key, api_key_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth, wait_on_rate_limit=True)
まずは自分のフォローリストを取得します. この部分の実行には時間はかかりません.
import datetime
import pickle
import os
follow_id_list = []
cursor = -1 # 最初の位置は-1で指定します
# すべて読み込み終わったら cursor=0 になります
while cursor!=0:
id_cursor = api.get_friend_ids(cursor=cursor)
follow_id_list += id_cursor[0] # フォローしているアカウントのIDをfollow_id_listに追加します
cursor = id_cursor[1][1] # [previous_cursor, next_cursor]の順に格納されています
# @abc... に直す
follow_sn_list = []
for i in range(0, len(follow_id_list), 100):
# 15分で900件まで
for user in api.lookup_users(user_id=follow_id_list[i:i+100]):
follow_sn_list.append(user.screen_name)
get_favoritesでいいねの情報を取得し,最後にデータを保存します. 取得する情報は 対象ツイートのツイート時刻 誰をいいねしているか 対象ツイートのRT いいね数 です. リクエスト回数を無駄に消費しないように,先にいいねの件数を調べてから必要な回数だけリクエストをかけるようにしています. この部分の実行には時間がかかります. get_favoritesについて詳しく知りたい方は特定のユーザーがいいねしたツイートを取得するをご覧ください.
import math
count = 0 # 途中経過を見たいのでカウント用の変数
favorite_dict = {}
# @abc... などの screen_name でユーザーを指定する
for screen_name in follow_sn_list:
print(f"{count}:@{screen_name}") # 途中経過の表示をしています
count += 1
favorite_dict[screen_name] = []
# いいねを取得したいユーザーのいいね数を調べる
user = api.lookup_users(screen_name=[screen_name])
loop_count = min(5,math.ceil(user[0].favourites_count/200)) # いいね件数を200で割って切り上げた数字が回すべきループの回数
favorite_tweet_list = [] # いいねしたツイートのリスト
max_id = None
while loop_count>0:
fav_list = api.get_favorites(count=200,screen_name=screen_name,max_id=max_id)
# ツイートが1件も取得できなかった場合にエラーになるのを防ぐ
if len(fav_list) == 0:
print("ツイートを取得できませんでした",loop_count)
loop_count = 0
else:
max_id = fav_list[-1].id - 1 # 取得したツイートの最後のIDから1引いたものをmax_idにすれば続きから取得できる
loop_count -= 1
favorite_tweet_list += fav_list # 取得したツイートをリストに追加する
# ツイートを表示
for tweet in favorite_tweet_list:
favorite_dict[screen_name].append((tweet.created_at, tweet.user.screen_name, tweet.retweet_count, tweet.favorite_count))
# いいねの情報を保存する
with open("FavoriteDict.pkl", "wb") as tf:
pickle.dump(favorite_dict,tf)
保存したいいねの情報を読み込みます.
import pickle
with open("FavoriteDict.pkl", "rb") as tf:
favorite_dict = pickle.load(tf)
あるユーザーが誰に何回いいねしたかをカウントします. 具体的にはfavorite_count_dict[@ABC...] = {@A1:13, @A2:9, @A3:17, ...} のような辞書(の辞書)を作ってから,{@A1:13, @A2:9, @A3:17, ...}の部分を並び替えてタプルの辞書を作ります.
favorite_count_dict = {}
for key in favorite_dict.keys():
favorite_count_dict[key] = {}
for item in favorite_dict[key]:
screen_name = item[1] # 誰をいいねしているか
# まだ出現していなければカウント0で初期化
if screen_name not in favorite_count_dict[key].keys():
favorite_count_dict[key][screen_name] = 0
favorite_count_dict[key][screen_name] += 1 # いいねされた回数を+1する
# いいねした回数の多い順にscreen_nameを並び替える
for key in favorite_count_dict.keys():
favorite_count_dict[key] = sorted(favorite_count_dict[key].items(), key = lambda x:x[1], reverse=True)
favorite_count_dictを使って各アカウントがよくいいねしている上位10人を表示します.
for key in favorite_count_dict.keys():
print(f"@{key}")
cnt = 0
for item in favorite_count_dict[key]:
cnt += 1
prop = round(item[1]*100/len(favorite_dict[key]),2) # 全体のうちの何%か
print(f"{cnt}位: @{item[0]} {item[1]}件 {prop}%")
if cnt==10:
break
print("====================")
上位10人にランクインした回数をカウントしてよくいいねされている人を探し出します. ここではやっていませんが,自分がフォローしているか否かの情報も一緒に表示すればおすすめのアカウントを探すのに役立つかもしれません. また,if cnt==10: の部分をなくせば単純に多くの人にいいねされている人のランキングになります.
rankin_count_dict = {}
for key in favorite_count_dict.keys():
cnt = 0
for item in favorite_count_dict[key]:
cnt += 1
if item[0] not in rankin_count_dict.keys():
rankin_count_dict[item[0]] = 0
rankin_count_dict[item[0]] += 1
if cnt==10:
break
# 並び替え
rankin_count_dict = sorted(rankin_count_dict.items(), key = lambda x:x[1], reverse=True)
# ランキング順でURLも一緒に表示
for item in rankin_count_dict:
screen_name = item[0]
print(item)
print(f"https://twitter.com/{screen_name}")
print("========================")
よくいいねしてくれる人をランキング形式で表示します. 自分がいいねされた回数が多い順 全体のいいねに占める自分の割合が多い順の2通りで表示できます.
my_screen_name = "ここに自分のscreen_nameを入力"
user_dict = {}
for key in favorite_count_dict.keys():
cnt = 0
for item in favorite_count_dict[key]:
cnt += 1
if item[0] == my_screen_name:
prop = round(item[1]*100/len(favorite_dict[key]),2)
# 順位 いいねした人数 自分がいいねされた回数 割合
user_dict[key] = (cnt,len(favorite_count_dict[key]),item[1],prop)
# 自分がいいねされた回数が多い順に並び替えたい場合
user_info = sorted(user_dict.items(), key = lambda x:x[1][2], reverse=True)
# 自分がいいねされている割合が多い順に並び替えたい場合
user_info = sorted(user_dict.items(), key = lambda x:x[1][3], reverse=True)
for item in user_info:
screen_name, info = item
rank, all_fav, fav_count, prop = info
print(f"@{screen_name}")
print(f"{rank}/{all_fav}位 {fav_count}件 {prop}%")
print("==================")
いいねしたツイートのされた時刻の情報も保存しているため,最近60日で何回いいねをしているかも表示できます. 厳密には1年前のツイートを60日以内にいいねした場合はカウントできないため,60日以内にされたツイートを何件いいねしているかになります. 直近60日のツイート数と一緒に見ることでアカウントの活発さの指標に使えそうです.
import datetime
# 並び替えて表示したいので一度辞書に記録
count_dict = {}
for key in favorite_dict.keys():
count = 0
for x in favorite_dict[key]:
# tzinfoなしの時間に直す
fav_time = datetime.datetime(x[0].year,x[0].month,x[0].day,x[0].hour,x[0].minute,x[0].second)
if (datetime.datetime.utcnow()-fav_time).days <= 60:
count += 1
else:
break
count_dict[key] = count
count_info = sorted(count_dict.items(), key = lambda x:x[1], reverse=True)
for info in count_info:
screen_name, count = info
print(f"@{screen_name}:{count}回")
print("=======================")
いいねしたツイートのRT いいね数も記録していますので,人気なツイートが好きかどうかも調べることができます. RTといいねの合計が500以上のツイートを人気のツイートとし,総いいね件数に対して人気ツイートの占める割合を調べます.
prop_dict = {}
for key in favorite_dict.keys():
count = 0
for x in favorite_dict[key]:
popularity = x[2]+x[3] # RTといいねの合計
if popularity >= 500:
count += 1
prop = -1 # 本当の 0% と区別したいのでいいねをしていない場合は -1 にしています
if len(favorite_dict[key]) != 0:
prop = count/len(favorite_dict[key])
prop_dict[key] = prop*100
prop_info = sorted(prop_dict.items(), key = lambda x:x[1], reverse=True)
for info in prop_info:
screen_name, prop = info
print(f"@{screen_name}: {round(prop,1)}%")
print("=======================")