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?