twitterのフォロワーを機械学習やマーケティングに使えるよう整理する
機械学習や分析を行なっていると、前処理の大変さが身に染みてわかります。
Twitterなどのオープンデータは、勉強用にもビジネス用にも非常に有用なものですが、データを綺麗に整形(前処理)するのが億劫で途中で諦めがち(自分も一回諦めました)
ですが、今回は該当ユーザのフォロワー一覧をごっそり取れる処理を作りました。
最終的にCSVに保存できるようになっています。
どうぞご利用ください。
取れる情報
Id(フォロワーのID)
screen_name( https://twitter.com/maskedanl の maskedanl の部分)
description(プロフィール)
followers_count(フォロワー数)
friends_count(フォローしている人の数)
max_favorite_count(直近tweet20件の最大いいね数)※
max_retweet_count(直近tweet20件の最大リツイート数)※
※どちらもフォロワー自体のツイートに対する数です。
取得イメージ
購入前にご確認ください。
Jupiter note bookで実行することを想定してます。
処理はtweepyを使用しています。
各フォロワーの 取得処理は時間がかかります。(10分2000件ほど。)
フォロワーのデータを取得する時、応答が帰ってこない時は、時間をおいて処理を行います。
⭐️twitter apiの利用申請後
すぐに試せるように jupyter notebookのファイルをダウンロードできます。
サンプルのファイルになります。
これから書いてある内容が jupyter notebook形式ですぐに実行できます。
パソコンや、Colaboratory等でご利用ください。
事前準備
各種インストール
pip install tweepy
pip install tqdm
pip install timeout_decorator
import
import tweepy
import pandas as pd
import time
from tqdm.notebook import tqdm
import timeout_decorator
TwitterAPIの認証
twitterのAPIを使うための申請です。
以下2つがわかりやすいです。
https://dev.classmethod.jp/articles/twitter-api-approved-way/
https://qiita.com/kngsym2018/items/2524d21455aac111cdee
#上記でゲットした値を以下に設定
consumer_key = '自分のを入れてください'
consumer_secret= '自分のを入れてください'
access_token='自分のを入れてください'
access_secret= '自分のを入れてください'
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
# 利用制限に引っかかった時に待機するようにwait_on_rate_limit を Trueにしておく
api = tweepy.API(auth ,wait_on_rate_limit = True)
tweepyサンプル実行
# https://twitter.com/maskedanl
# twitter.com/の後に書いてある文字を設定
#マスク・ド・アナライズさんの情報取得
user = api.get_user(screen_name="maskedanl")
データが取れるようになっているか確認
チェックした人のプロフィールを取得してみる
user.description
設定
取得するユーザを設定
check_screen_name = 'maskedanl'
該当ユーザのfollower の IDを取得
follower が1万人くらいだと1分もかからず取れますが、
20万近いと結構時間がかかります。
followers = tweepy.Cursor(api.followers_ids, screen_name= check_screen_name)
followers_list = []
#IDをリストに変換
for follower in followers.pages():
followers_list.append(follower)
関数1
各follower の以下の情報を取得する関数
screen_name
description(profile)
followers_count(Followers)
friends_count(Following)
#実行時に帰ってこないことがあるのでtimeoutを設定
@timeout_decorator.timeout(5)
def twitter_get_1(idid):
#フォロワー情報取得
user = api.get_user(id=idid)
screen_name = user.screen_name
description = user.description
followers_count = user.followers_count
friends_count = user.friends_count
results_info = pd.Series([idid,screen_name,description,followers_count,friends_count],\
index = ["id","screen_name","description", "followers_count", "friends_count"] )
#結果返却
return results_info
関数2
各follower の直近20件のツイートの最大いいね以下の情報を取得する関数
favorite_count(いいね回数)
retweet_count(リツイート回数)
#実行時に帰ってこないことがあるのでtimeoutを設定
@timeout_decorator.timeout(10)
def twitter_get_2(idid):
#フォロワー情報
try:
user = api.user_timeline(id=idid)
favorite_counts = []
retweet_counts = []
#texts = []
#20件のツイートのいいね、リツイートされた数をチェック
for i in range(0,20):
try:
favorite_counts.append(user[i].favorite_count)
#他人のリツイートは除く
if 'RT @' in user[i].text :
retweet_counts.append(0)
else:
retweet_counts.append(user[i].retweet_count)
except:
break
#いいねとリツイートの最大カウントを取得
max_favorite_count = max(favorite_counts)
max_retweet_count = max(retweet_counts)
results_info = pd.Series([max_favorite_count,max_retweet_count],\
index = ["max_favorite_count","max_retweet_count"])
except:
#いいねと、リツイートが取れなかった場合は0を返却
results_info = pd.Series([0,0],\
index = ["max_favorite_count","max_retweet_count"])
#結果返却
return results_info
関数を単発実行で確認
results_info_1 = twitter_get_1('maskedanl')
results_info_2 = twitter_get_2(results_info_1[1])
results_info_all = pd.concat([results_info_1, results_info_2], axis=0,sort=False)
results_info_all
本番実行(あとは気長に待ってください)
#結果格納DF
twitter_get_df = pd.DataFrame(columns=["id","screen_name","description","followers_count","friends_count",\
"max_favorite_count","max_retweet_count"])
#followers_list はMAX5000件ごとの2重配列になっている為、5000件毎処理を行う。
for lst in followers_list:
#エラーとなったidを保持ておいてあとで処理する。
error_list =[]
#フォロワーのデータを回して取得
for idid in tqdm(lst):
try:
#各フォロワーの情報を取得
results_info_1 = twitter_get_1(idid)
results_info_2 = twitter_get_2(idid)
# 1,2を結合
results_info_all = pd.concat([results_info_1, results_info_2], axis=0,sort=False)
twitter_get_df = twitter_get_df.append(results_info_all , ignore_index=True)
except Exception as e:
print(e)
error_list.append(idid)
print('errorとなったID: ' +str(idid))
print('一定間隔開あける')
time.sleep(420)
continue
#error になった分を再実行
for idid in tqdm(error_list):
results_info_1 = twitter_get_1(idid)
results_info_2 = twitter_get_2(idid)
# 1,2を結合
results_info_all = pd.concat([results_info_1, results_info_2], axis=0,sort=False)
twitter_get_df = twitter_get_df.append(results_info_all , ignore_index=True)
#フォロワーの数で降順ソート
twitter_get_df.sort_values('followers_count', ascending=False)
CSVにて出力
twitter_get_df.to_csv('twitter_get_df.csv',index=False)