2017-07-01 18 views
0

は、私は、ユーザーのシリーズのために信者をつかむIDSループの場合は、以下のTweepyを使用しているforループでブレイク:は、間違った行動

def download_followers(user, api): 
    all_followers = [] 
    try: 
     for page in tweepy.Cursor(api.followers_ids, screen_name=user).pages(): 
      all_followers.extend(map(str, page)) 
     return all_followers 
    except tweepy.TweepError: 
     print('Could not access user {}. Skipping...'.format(user)) 

関数は次のように呼ばれた:

for username in lookup_users: 
    user_followers = download_followers(username, main_api) 
    if user_followers: 

     new_followers = pd.DataFrame({ 
      "Handles": username, 
      "Follower_ID": user_followers, 
      "Start_Date": today}) 

     new_followers_df = new_followers_df.append(new_followers) 


     print('Finished outputting: {} at {}'.format(username, datetime.now().strftime('%Y/%m/%d %H:%M:%S'))) 

は、各userが持つかもしれない信者の量に応じて、Twitter's APIuser's followersすべてをつかむために2回または3回呼び出すことが必要になる場合があります。

したがって、別の呼び出しがapiに行われるまでに15分の休憩があります。これはTweepyに次のパラメータを追加することで対処されています。この場合、APIが限界に達しこれにより

Rate limit reached. Sleeping for: 895 
Rate limit reached. Sleeping for: 895 
Finished outputting: @barackobama at 2017/07/01 10:36:07 

回:

main_api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True) 

結果はこのようなものです。毎回15分待ってから@barackobamaの信者をすべて奪取した。

ただし、for loopが失敗することがあります。メッセージプリントアウト:

'Could not access user @barackobama. Skipping...' 

これは、主に接続の問題のいずれかが原因であるが、TwitterのAPIは、右のリクエストを送信されていない、またはアカウントはフォロワーの多くを持つとTweepyのパッケージには、それに対処することができませんそれに応じて。私は、次の方法のようにWhile True引数にAPIをラップしようとした可能接続障害を考慮して

:ループのために、機能をこのように巻くことによって、しかし

def download_followers(user, api): 
    all_followers = [] 
    while True: 

     try: 

      for page in tweepy.Cursor(api.followers_ids, screen_name=user).pages(): 

       all_followers.extend(map(str, page)) 

       return all_followers 

     except tweepy.TweepError: 
      print('Could not access user {}. Trying Again...'.format(user)) 
      continue 
     break 

は正常に動作していません。 Iteratingを各userに1回だけ追加し、そのフォロワーをすべて捕まえておらず、 `lookup_userリストの次のuserに移動します。例えば

、次のように動作のinstead

Finished outputting: @barackobama at 2017/07/01 10:36:07 
Finished outputting: @donaldtrump at 2017/07/01 10:36:07 
Finished outputting: @georgebush at 2017/07/01 10:36:07 
Rate limit reached. Sleeping for: 895 
Finished outputting: @richardnixon at 2017/07/01 10:41:08 

は、したがって、一度だけ各ユーザを反復:

Rate limit reached. Sleeping for: 895 
'Could not access user @barackobama. Trying again...' 
Rate limit reached. Sleeping for: 895 
Finished outputting: @barackobama at 2017/07/01 10:36:07 
Rate limit reached. Sleeping for: 895 
Rate limit reached. Sleeping for: 895 
Rate limit reached. Sleeping for: 895 
Finished outputting: @donaldtrump at 2017/07/01 10:36:07 

それは次のように作用します。

私が間違っていることはありますか?

答えて

0

文はforループ内にあるため、プログラムは最初の反復後にループforを終了します。

関連する問題