2017-07-01 4 views
0

ich die For-Schleife verfolgt haben, die die Anhänger für eine Reihe von Benutzern packt IDs Tweepy:mit Anschluss Umgang Pause in For-Schleife, falsches Verhalten

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

Die Funktion auf folgende Weise aufgerufen:

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

Je nach der Menge der Anhänger jeder user haben könnte, Twitter's API haben könnte zweimal oder dreimal aufgerufen werden alle user's followers zu greifen.

Dementsprechend gibt es einen Rest von 15 Minuten, bevor ein weiterer Anruf an die API erfolgt. Dies wird durch Hinzufügen der folgenden Parameter auf Tweepy behandelt:

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

Das Ergebnis etwa wie folgt lautet:

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

Wobei die API in diesem Fall zweimal seine Grenze erreicht. Warten Sie 15 Minuten jedes Mal, bevor Sie alle Anhänger @barackobama ergreifen.

Manchmal schlägt jedoch die for loop fehl. Ausdrucken der Nachricht:

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

Dies wird vor allem durch entweder ein Verbindungsproblem, das twitter api nicht die richtige Anfrage gesendet wird, oder ein Konto mit in der Lage, eine Menge von Anhängern und Tweepy Paket nicht damit umgehen entsprechend.

Um für einen möglichen Verbindungsfehler Konto Ich hat versucht, die api in einem While True Argumente wie in der folgenden Art und Weise Verpackung:

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 

jedoch durch Umwickeln der Funktion auf diese Weise, die for-Schleife richtig funktionieren nicht. Iterating über jeden user nur einmal, nicht alle seine Anhänger zu ergreifen, und weiter zum nächsten user in der `lookup_user Liste.

Zum Beispiel instead von der folgenden Art und Weise verhalten:

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 

Es wirkt auf folgende Weise:

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 

Daher Iterieren über jeden Benutzer nur einmal.

Gibt es etwas, was ich falsch mache?

Antwort

0

Die return Anweisung ist innerhalb der for Schleife, so dass das Programm die for Schleife nach der ersten Iteration beendet.

Verwandte Themen