【tweepy】フォロワー情報をまとめる(情報の取得とJSONでの保存)[Python]

  • URLをコピーしました!
目次

tweepy

PythonのTwitter API制御ライブラリtweepyを使って、おはよう戦隊のハッシュタグを検索し、条件に合うアカウントを抽出してみました。

今回はtweepyを使って、フォロワー情報をまとめて、さらにJSON形式で保存してみます。

そして次回はそのJSON形式で保存したデータを、CSVに書き換え、人間が簡単に読めるようにしてみましょう。

ちなみに今回出力するJSONファイルはこんな感じです。

{
    "アカウントID": {
        "lastupdate": "データを追加・更新した日時",
        "screen_name": "アカウント名",
        "follows": フォロー数,
        "followers": フォロワー数,
        "no_tweets": 総ツイート数,
        "no_favourites": 総いいね数,
        "following": 自分がフォローしているかどうか,
        "protected": 鍵アカウントかどうか
    }
}

それでは始めていきましょう。

プログラム全体

まずはプログラム全体をお見せします。

import os
import tweepy
import json
import datetime

num_listing_followers = 200

timenow = datetime.datetime.now()
timenow_str = timenow.strftime('%Y%m%d_%H%M%S')

json_filename = 'followerlist.json'

default_dirpath = r" pythonプログラムがあるパス "
json_filepath = os.path.join(default_dirpath, json_filename)

# print(default_dirpath)
# print(json_filename)

#For Twitter API
account = "@account_name"

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)

def getfollowerlist():
    followerlist = api.followers_ids(account)
    return followerlist

def getfollowerinfo(followerlist):
    
    with open(json_filepath, 'r') as json_in:
        json_dic = json.load(json_in)
    
    noupdateids = []
    
    for followedid in json_dic.keys():
        last_update = datetime.datetime.strptime(json_dic[followedid]['lastupdate'], '%Y%m%d_%H%M%S')
        if last_update >= (timenow - datetime.timedelta(days=14)):
            noupdateids.append(followedid)
    
    i = 0
    for followerid in followerlist:
        if not str(followerid) in noupdateids: 
            user = api.get_user(followerid)

            json_dic[user.id_str] = {'lastupdate':timenow_str, 'screen_name':user.screen_name, 'follows':user.friends_count,
                               'followers':user.followers_count, 'no_tweets':user.statuses_count, 'no_favourites':user.favourites_count,
                               'following':user.following, 'protected':user.protected}

            if i >= num_listing_followers:
                with open(json_filepath, 'w') as json_out:
                    json.dump(json_dic, json_out, indent=4, ensure_ascii=False)
                break
            else:
                i = i + 1

def main():
    followerlist = getfollowerlist()
    getfollowerinfo(followerlist)

if __name__ == '__main__':
    main()

設定部分

まずは設定部分からです。

import os
import tweepy
import json
import datetime

num_listing_followers = 200
json_filename = 'followerlist.json'

timenow = datetime.datetime.now()
timenow_str = timenow.strftime('%Y%m%d_%H%M%S')

default_dirpath = r" pythonプログラムがあるパス "
json_filepath = os.path.join(default_dirpath, json_filename)

# print(default_dirpath)
# print(json_filename)

#For Twitter API
account = "@account_name"

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)

インポートするのは、「os」、「tweepy」、「json」、「datetime」の4つです。

状況によって変更するだろう設定はこちらの2つ。

num_listing_followers = 200
json_filename = 'followerlist.json'

最初の「num_listing_followers」は1回の実行で何人のフォロワー情報を取得し、まとめるかになります。

Twitter APIに限らず、ほとんどのAPIは一定時間内に使用できる回数が決まっており、それを超えると一定時間APIに接続できなくなったり、料金が発生したりします。

とりあえず200人程度の情報は一度に取得できたので、200としています。

私の場合は1日に200人もフォローすることはまれなので、これで十分です。

「json_filename」は出力するJSONファイルの名前です。

次の部分は自動で設定される部分です。

timenow = datetime.datetime.now()
timenow_str = timenow.strftime('%Y%m%d_%H%M%S')

default_dirpath = r" pythonプログラムがあるパス "
json_filepath = os.path.join(default_dirpath, json_filename)

最初の2行が時間の取得と文字列への変換、後の2行がデフォルトのファイルパス(Pythonプログラムを動かしているファイルパス)とJSONファイルのパスの作成です。

ちなみに「default_dirpath」はこのプログラムをローカル環境で使う場合は「os.getcwd()」でも大丈夫です。

後の部分はTwitter APIへの接続部分なので、今回は説明を省略します。

Twitter APIへの接続に関してはこちらの記事で解説していますので、よかったらどうぞ。

これで設定部分に関しては完了です。

フォロワーリストの取得

次にフォロワーのリストを取得していきます。

それがこちらの部分。

def getfollowerlist():
    followerlist = api.followers_ids(account)
    return followerlist

「api.followers_ids(‘フォロワーリストを取得したいアカウント’)」で取得できます。

ただしここで得られるのはフォロワーのIDだけですので注意してください。

フォロワーの情報の取得

次に取得したフォロワーのIDからフォロワー情報を取得していきます。

def getfollowerinfo(followerlist):
    
    with open(json_filepath, 'r') as json_in:
        json_dic = json.load(json_in)
    
    noupdateids = []
    
    for followedid in json_dic.keys():
        last_update = datetime.datetime.strptime(json_dic[followedid]['lastupdate'], '%Y%m%d_%H%M%S')
        if last_update >= (timenow - datetime.timedelta(days=14)):
            noupdateids.append(followedid)
    
    i = 0
    for followerid in followerlist:
        if not str(followerid) in noupdateids: 
            user = api.get_user(followerid)

            json_dic[user.id_str] = {'lastupdate':timenow_str, 'screen_name':user.screen_name, 'follows':user.friends_count,
                               'followers':user.followers_count, 'no_tweets':user.statuses_count, 'no_favourites':user.favourites_count,
                               'following':user.following, 'protected':user.protected}

            if i >= num_listing_followers:
                with open(json_filepath, 'w') as json_out:
                    json.dump(json_dic, json_out, indent=4, ensure_ascii=False)
                break
            else:
                i = i + 1

まずこれまでに保存したフォロワーのデータを読み込みます。

    with open(json_filepath, 'r') as json_in:
        json_dic = json.load(json_in)

そして読み込んだフォロワーの情報から、14日以内に登録・更新されたIDに関しては一度リストに格納します。

noupdateids = []
    
for followedid in json_dic.keys():
    last_update = datetime.datetime.strptime(json_dic[followedid]['lastupdate'], '%Y%m%d_%H%M%S')
    if last_update >= (timenow - datetime.timedelta(days=14)):
        noupdateids.append(followedid)

この格納したIDは追加・更新しないようにプログラムします。

i = 0
for followerid in followerlist:
    if not str(followerid) in noupdateids: 
        user = api.get_user(followerid)

        json_dic[user.id_str] = {'lastupdate':timenow_str, 'screen_name':user.screen_name, 'follows':user.friends_count,
                           'followers':user.followers_count, 'no_tweets':user.statuses_count, 'no_favourites':user.favourites_count,
                           'following':user.following, 'protected':user.protected}

ここでは取得した現在のフォロワーのリストから一つずつIDを取り出し、追加・更新をしないIDのリストにないか確認します。

そしてもし追加・更新しないリストにない場合、「api.get_user(‘アカウントID’)」で情報を取得します。

今回取得する情報はこんな感じです。

アカウントID(str型)user.id_str
アカウント名user.screen_name
フォロー数user.friends_count
フォロワー数user.follower_count
総ツイート数user.statuses_count
総いいね数user.favourites_count
自分がフォローしているかどうかuser.following
鍵アカウントかどうかuser.protected

これをIDをキーとした辞書にします。

次にJSONファイルに保存していきますが、その際にひと工夫が必要です。

if i >= num_listing_followers:
    with open(json_filepath, 'w') as json_out:
        json.dump(json_dic, json_out, indent=4, ensure_ascii=False)
            break
        else:
            i = i + 1

実は先ほど現在のフォロワーリストからフォロワーIDを取得する前に「i = 0」としてカウンタを用意しています。

このカウンタは今回、JSONファイルに追加・更新する人数をカウントするためのカウンタです。

そのため追加・更新をしたあとにこのカウンタを一つ上げなければなりません。

またこのカウンタが一定数、今回の場合は「num_listing_followers」以上になった場合にJSONファイルを出力する必要があります。

ということで上記のように「if…else」を使って条件分岐しているというわけです。

これでフォロワー情報の取得は完了です。

あとはmain関数の処理だけなので、解説は割愛します。

これで最初に紹介したこのようなJSONファイルが得られます。

{
    "アカウントID": {
        "lastupdate": "データを追加・更新した日時",
        "screen_name": "アカウント名",
        "follows": フォロー数,
        "followers": フォロワー数,
        "no_tweets": 総ツイート数,
        "no_favourites": 総いいね数,
        "following": 自分がフォローしているかどうか,
        "protected": 鍵アカウントかどうか
    }
}

とりあえず保存するだけならこれでいいですが、情報は使ってなんぼです。

ということで次回はこのデータを使いやすいように加工し、CSVファイルとして保存しましょう。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次