見出し画像

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件の最大リツイート数)※
※どちらもフォロワー自体のツイートに対する数です。

取得イメージ

画像1


購入前にご確認ください。

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)

最後までお読みいただき、ありがとうございます!。
記事が面白かったという方は「♡」「フォロー」よろしくお願いします!。


読んでる皆さんと自分がもっと稼げるように、全額惜しみなく勉強代とさせていただきます!。