背景
最近Pythonを学習している者です。
今、tweepyを使ってTwitterの自分のフォローやフォロワーの情報を得たり、条件に沿ってフォロー解除するプログラムを作成しています。
##問題 TweepError?で終了してしまう
しかしフォロワー4-500くらいならば情報を得ることはできたのですが、2000人近く読み込むときにエラーになってしまいます。
その他にも下記のような自分のツイート500件取得してRT/favしてくれた人の一覧を得るプログラムを作ったのですが、そちらもエラーになってしまいます(件数小さい規模ならうまくいきました)
Twitter apiの呼び出し制限にかかっていると思われたので、下記のようなtry: except:を使って回避を試みましたがエラーで終了してしまいます。
python
1import tweepy 2import json 3import re 4import csv 5import urllib.request 6from tqdm import tqdm 7from time import sleep 8from tweepy.error import TweepError 9 10CONSUMER_KEY = "0000000000000000000000000" 11CONSUMER_SECRET = "0000000000000000000000000" 12ACCESS_TOKEN = "0000000000000000000000000" 13ACCESS_TOKEN_SECRET = "0000000000000000000000000" 14 15auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) 16auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) 17api = tweepy.API(auth, wait_on_rate_limit = True) 18 19# リツイート・ファボした人の空のリスト用意 20rt_acount = [] 21fav_acount = [] 22pages = [1, 2, 3, 4, 5] 23retry = 0 24def RtFav_collection(pages, counts): 25 global rt_acount 26 global fav_acount 27 global retry 28 counta = counts 29 for page in pages: 30 try: 31 usertimeline = api.user_timeline(id="hogehoge_hoge", count=100, page=page) 32 print("===============", page, "ページ目の取得開始! ===============") 33 34 # ↓●ページ目の△ツイート目でエラーになった場合△ツイート目から再開できるようにしたかった 35 if counta >= 100: 36 counta = 0 37 elif counta != 0: 38 del usertimeline[0:counta:1] 39 print(counta + 1, "ツイート目から再開") 40 41 for retweeter in tqdm(usertimeline): 42 retwe = api.retweets(id=retweeter.id_str) 43 for rt in retwe: 44 rt_id = rt.user.screen_name 45 if rt_id not in rt_acount: 46 rt_acount.append(rt_id) 47 print("rt追加 3秒待機します。") 48 sleep(3) 49 # usertimeline を参照しファボした人も同様にリストに追加 50 json_data = urllib.request.urlopen('https://twitter.com/i/activity/favorited_popup?id=' + retweeter.id_str).read() 51 # json_data をstrに変換 52 json_data = json_data.decode("utf8") 53 found_ids = re.findall(r'data-screen-name=\"+\w+', json_data) 54 for fav in found_ids: 55 fav_id = fav.replace('data-screen-name=\"',"").strip() 56 if fav_id not in fav_acount: 57 fav_acount.append(fav_id) 58 print("fav追加 3秒待機します。") 59 sleep(3) 60 counta += 1 61 except TweepError: 62 print("================= 制限に到達したため15分スリープして再開します =================") 63 retry += 1 64 if retry == 3: 65 print("エラー 終了") 66 break 67 sleep(60 * 15 + 10) 68 print("再開します。") 69 pages = list(i * 1 for i in range(page, 6)) 70 RtFav_collection(pages, counta) 71 72RtFav_collection(pages, 0) 73 74if "hogehoge_hoge" in rt_acount: 75 rt_acount.remove("hogehoge_hoge") 76if "hogehoge_hoge" in fav_acount: 77 fav_acount.remove("hogehoge_hoge") 78 79with open(r"C:\Users\ユーザー名\Desktop\snspython\rt_acount.csv", "a") as f: 80 writer = csv.writer(f) 81 writer.writerow(rt_acount) 82 print("過去1年にリツイートした人を rt_acount.csv に保存しました。") 83 84with open(r"C:\Users\ユーザー名\Desktop\snspython\fav_acount.csv", "a") as f: 85 writer = csv.writer(f) 86 writer.writerow(fav_acount) 87 print("過去1年いいねした人を fav_acount.csv に保存しました。") 88
##知りたいこと
上記コードの問題点。
また、今後もTwitter apiを使って開発するうえで似たような問題に対処するため、
この制限にかかる"呼び出し"というのが一体どのタイミングなのか教えていただきたいです。
このコードでいう、「api.」という部分で呼び出しているということでしょうか?」を減らしたり一回の呼び出しで多く取得するようにすればいいのでしょうか?
そうならばできるだけ「api.
また呼び出しの制限は、種類を問わず15分に15回ということなのでしょうか?
宜しくお願い致します。
なにぶん初心者ですので、基本的なことや根本的なこともご指摘いただければと思います。
文脈を読む努力はしつつもいろんなサイトから切り貼りしたプログラムですので、根本的なことがわかっていない可能性があります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。