2016-05-16 3 views
2

Also zuerst, ich merke, es gibt eine Reihe von Fragen in Bezug auf die Handhabung der Twitch Rate Limits. Ich habe keine Ahnung warum, aber keiner von denen, die ich bisher gefunden habe, funktioniert für mich.tweepy wait_on_rate_limit funktioniert nicht

Ich benutze Tweepy. Ich versuche, eine Liste aller Anhänger der Anhänger eines Benutzers zu bekommen. Wie zu erwarten ist, kann ich aufgrund der Tarifgrenzen von Twitter nicht alles auf einmal abschreiben. Ich habe Tweepy v 3.5 installiert und verweise damit auf http://docs.tweepy.org/en/v3.5.0/api.html. Um die Liste der Nachfolger des ursprünglichen Benutzer zu erhalten die ich benutze:

auth = tweepy.OAuthHandler(consumer_key,consumer_secret) 
auth.set_access_token(access_token, access_secret) 
api = tweepy.API(auth) 

followerIDs = [] 
for page in tweepy.Cursor(api.followers_ids, screen_name=originatingUser, wait_on_rate_limit = True, wait_on_rate_limit_notify = True).pages(): 
    followerIDs.extend(page) 

Anhänger = api.lookup_users (Nachfolger)

Dies funktioniert ein für ein bisschen, aber schnell verwandelt sich in:

tweepy.error.TweepError: [{u'message': u'Rate limit exceeded', u'code': 88}] 

Meine Theorie, würde dann die Anhänger jedes Benutzers für jede FollowerID mit etwas wie diesem abrufen:

Das andere Problem, das ich habe, ist, wenn ich versuche, die Benutzernamen zu suchen. Dazu Es die Grouper Funktion von itertools verwenden, um die Anhänger zu brechen in Gruppen von 100 (api.lookup_users nur 100 ids zu einer Zeit annehmen) und

followerIDs = grouper(followerIDs,100) 
for followerGroup in followerIDs: 
     followerGroup=filter(None, followerGroup) 
     followers = api.lookup_users(followerGroup,wait_on_rate_limit = True) 
     for follower in followers: 
       print (originatingUser + ", " + str(follower.screen_name)) 

verwenden, die einen anderen Fehler bekommt, nämlich:

TypeError: lookup_users() got an unexpected keyword argument 'wait_on_rate_limit' 

die ich verwirrend finde, weil die tweepy api suggests das ein akzeptiertes Argument sein sollte.

Irgendwelche Ideen, was ich falsch mache?

Cheers Ben.

Antwort

0

Es gibt eine Geschwindigkeitsgrenze für Twitter-API wie hier erwähnt: https://dev.twitter.com/rest/public/rate-limiting

Die schnelle Lösung passieren könnte dies die Rate Limit Fehler werden zu kontrollieren und Ihre Anwendung für eine Weile schläft dann weitermachen, wo Sie nach links.

pages = tweepy.Cursor(api.followers_ids, id=followerID).pages() 
while True: 
    try: 
     page = pages.next() 
     followerIDs.extend(page) 
    except TweepError: 
     time.sleep(60 * 15) 
     continue 
    except StopIteration: 
     break 

sollte den Trick tun. Nicht sicher, ob dies wie erwartet funktioniert, aber die Grundidee ist dies.

+0

Nun, ja. Ich hatte eher gehofft, dass etwas mit der "wait_on_rate_limit" -Sache nicht stimmte. Es wäre eine viel mehr ... elegante Lösung. Dies scheint jedoch der einzige Weg zu sein, dies im Moment zu tun. – Ben

+0

Klingt nicht nach einem vernünftigen Ansatz für mich - "Wenn eine Anwendung die Ratengrenzen missbraucht, wird sie auf die schwarze Liste gesetzt. Blacklist-Apps können keine Antwort von der Twitter-API erhalten – geotheory

1

Ich weiß, das könnte ein bisschen spät sein, aber hier geht es.

Sie passieren die wait_on_rate_limit Argument im Cursor Konstruktor, während die tweepy Dokumentation besagt, dass es auf dem API() Konstruktor übergeben werden sollte.