2016-05-08 13 views
0

Ich versuche, einige Twitter-Daten für den Bereich Chicago speziell mit Blick auf Kriminalität Tweets herunterladen. Ich brauche diese auch mit Koordinaten georeferenziert werden. Ich möchte einen guten Betrag für Analysezwecke erhalten, jedoch ist die REST-API begrenzt und beschränkt sich daher auf eine relativ geringe Anzahl. Ich habe versucht, eine Workaround-Lösung zu erstellen, basierend auf einer ähnlichen Frage Avoid twitter api limitation with Tweepy aber bisher habe ich nicht viel Glück. Könnte mir jemand dabei helfen? Ich bin ein Neuling für all diese Dinge, also würde jede Hilfe wirklich geschätzt werden. Idealerweise möchte ich das auch in einem Pandas-Dataframe. Ich habe das folgende Tutorial als Grundlage für meine Programmierung verwendet. Dies kann unter: http://www.karambelkar.info/2015/01/how-to-use-twitters-search-rest-api-most-effectively./ ich den Code kopiert haben habe ich unten:Tweepy api Grenze Workaround

import tweepy 
auth = tweepy.AppAuthHandler('', '') 
api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True) 
if (not api): 
print ("Can't Authenticate") 
sys.exit(-1) 

import sys 
import jsonpickle 
import os 



searchQuery = 'shooting OR stabbing OR violence OR assualt OR attack OR homicide OR punched OR mugging OR murder' 
geocode= "41.8781,-87.6298,15km" 


maxTweets = 1000000 
tweetsPerQry = 100 
fName = 'tweets.txt' 
sinceId = None 
max_id = 1L 
tweetCount = 0 
print ("Downloading max {0} tweets".format(maxTweets)) 
with open (fName, 'w') as f: 
    while tweetCount < maxTweets: 
    try: 
     if (max_id <= 0): 
      if(not sinceId): 
       new_tweets = api.search(q=searchQuery, geocode=geocode, count=tweetsPerQry) 
      else: 
       new_tweets = api.search(q=searchQuery, geocode=geocode, count=tweetsPerQry, since_id=sinceID) 
     else: 
      if (not sinceId): 
       new_tweets = api.search(q=searchQuery, geocode=geocode, count=tweetsPerQry, max_id=str(max_id-1)) 
      else: 
       new_tweets = api.search(q=searchQuery, geocode=geocode, count=tweetsPerQry, max_id=str(max_id-1), since_id=sinceId) 
     if not new_tweets: 
      print ("No more tweets found") 
      break 
     for tweet in new_tweets: 
      f.write(jsonpickle.encode(tweet._json, unpicklable=False)+'\n') 
     tweetCount += len(new_tweets) 
     print("Downloaded {0} tweets".format(tweetCount)) 
     max_id = new_tweets[-1].id 
    except tweepy.TweepError as e: 
     print("some error : " + str(e)) 
     break 
print ("Downloaded {0} tweets, Saved to {1}".format(tweetCount, fName)) 
+0

Was genau bedeutet "nicht viel Glück" * in diesem Fall? Fehler? Unerwartetes Verhalten? Bitte geben Sie ein [mcve] (und versuchen Sie nicht, Ihre API-Token in Zukunft zu teilen). – jonrsharpe

+0

Danke für die schnelle Antwort! Entschuldigung, das war ein Versehen meinerseits. Danke, dass du das beseitigt hast. In Bezug auf nicht viel Glück, es scheint nur zu hängen, als ob es verarbeitet, aber wenn ich meine Textdatei überprüfen, gibt es nichts darin, während ich erwarten würde, dass dies zumindest einige Daten darin nach dem Ausführen für eine Weile enthalten . –

+0

Ich bekomme keine Fehlermeldungen, nur um zu klären –

Antwort

0

Nach dem Ausführen in das gleiche Problem habe ich ein Verfahren zur Identifizierung von bevorstehenden API Frequenzgrenzen. Dieser Python-Code, der tweepy verwendet, gibt die Anzahl der API-Anfragen aus und die Anzahl der erlaubten Anfragen. Sie können Ihren eigenen Code hinzufügen, um zu verzögern/schlafen/zu warten, entweder bevor oder nachdem die Grenzen erreicht sind oder verwenden Sie die Tweepy wait_on_rate_limit (mehr Details HERE).

Example output:

Twitter API: 3 requests used, 177 remaining, for API queries to /search/tweets

Twitter API: 3 requests used, 177 remaining, for API queries to /application/rate_limit_status

api = tweepy.API(auth) 


#Twitter's words on API limits https://support.twitter.com/articles/15364 

#### Define twitter rate determining loop 
def twitter_rates(): 
    stats = api.rate_limit_status() #stats['resources'].keys() 
    for akey in stats['resources'].keys(): 
     if type(stats['resources'][akey]) == dict: 
      for anotherkey in stats['resources'][akey].keys(): 
       if type(stats['resources'][akey][anotherkey]) == dict: 
        #print(akey, anotherkey, stats['resources'][akey][anotherkey]) 
        limit = (stats['resources'][akey][anotherkey]['limit']) 
        remaining = (stats['resources'][akey][anotherkey]['remaining']) 
        used = limit - remaining 
        if used != 0: 
         print("Twitter API used", used, "remaining queries", remaining,"for query type", anotherkey) 
        else: 
         pass 
       else: 
        pass #print("Passing") #stats['resources'][akey] 
     else: 
      print(akey, stats['resources'][akey]) 
      print(stats['resources'][akey].keys()) 
      limit = (stats['resources'][akey]['limit']) 
      remaining = (stats['resources'][akey]['remaining']) 
      used = limit - remaining 
      if used != 0: 
       print("Twitter API:", used, "requests used,", remaining, "remaining, for API queries to", akey) 
       pass 


twitter_rates() 

Beachten Sie auch, dass wait_on_rate_limitwerden die Ausnahmen stoppen. Tweepy für wie lange schlafen für die Ratenbegrenzung benötigt wird, zu ergänzen.“ Aaron Hill Juli 2014, HERE ist eine Stackoverflow-Seite mit weiteren Kommentaren dazu.