2017-07-01 5 views
0

J'ai ce qui suit pour boucle qui saisit les adeptes ids pour une série d'utilisateurs en utilisant Tweepy:Traiter avec connexion rupture dans une boucle For, Comportement incorrect

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)) 

La fonction est appelée de la manière suivante:

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'))) 

en fonction de la quantité d'adeptes chaque user aurait pu, Twitter's API pourrait être appelé deux ou trois fois pour saisir toutes les user's followers.

Par conséquent, il y a un repos de 15 minutes avant qu'un autre appel est fait à l'api. Cette question est traitée en ajoutant le paramètre suivant à Tweepy:

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

Le résultat est quelque chose comme ceci:

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

le API dans Par lequel ce cas a atteint sa limite deux fois. En attente de 15 minutes à chaque fois avant de saisir tous les adeptes de @barackobama.

Cependant, parfois l'for loop échoue. Imprimer le message:

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

Ceci est principalement dû soit à un problème de connexion, l'api twitter pas envoyé la demande à droite, ou un compte ayant beaucoup d'adeptes et paquet de Tweepy ne pas pouvoir y faire face en conséquence.

Pour tenir compte d'un échec de connexion possible, j'essayé envelopper le api dans un argument While True comme de la manière suivante:

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 

Cependant, en enveloppant la fonction de cette façon, la boucle ne fonctionne pas correctement. Iterating sur chaque user juste une fois, pas saisir tous ses adeptes, et passer à la prochaine user dans la liste `de lookup_user.

Par exemple, instead de se comporter de la manière suivante:

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 

Il agit de la façon suivante:

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 

Par conséquent itérer sur chaque utilisateur qu'une seule fois.

Y a-t-il quelque chose que je fais de mal?

Répondre

0

L'instruction return se trouve dans la boucle for. Par conséquent, le programme quitte la boucle for après la première itération.