Antony Vigneron
Antony Vigneron

Reputation: 1

get round twitter api limits

I have some problem that I can't get out of. I'm trying to use the API twitter to get some tweets with a certain query. I make a count with the api.rate_limit_status()['resources']['search']['/search/tweets']['remaining'] not to have the error code 429 of "Too Many Requests". But before the end I have another error code 88 that means " The request limit for this resource has been reached for the current rate limit window."

So, I'd like to know what's the return limits per request or per 15 minutes ? does i have some errors in my code ?

My code is here :

# coding: utf8

import chardet
import tweepy
import csv
import unidecode
import codecs
import datetime
import time

code_dep = "80"
motcle = "inondations"
#optionnel
motcle1 = "Pas-de-Calais"





#Entrer Twitter API informations
consumer_key = 'XXX'
consumer_secret = 'XXX'
access_token = 'XXX'
access_secret = 'XXX'

#connexion à l'API twitter avec les codes ci-dessus
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)


#Création d'un fichier de sortie au format .csv
with codecs.open("D:/VIGNERON/test_inondations_80.csv", "w" , encoding='iso8859-1') as csvfile:
        file = csv.writer(csvfile, delimiter=';',quotechar='|', quoting=csv.QUOTE_MINIMAL, dialect='excel')
        file.writerow(['Nom_utilisateur'] + ['Date'] + ['Evenement'] + ['Source'] + ['Commune'] + ['Insee'] +['Localisation'] + ['Contenu'] + ['media']+ ['X'] + ['Y'] + ['Confiance'])


# Lecture de mes fichier commune, le traite regroupant les commuene sans caractères spéciaux
# Le brut regroupant les communes avec caractères spéciaux
# Les recherche par mot clé passent outre les accents
r = csv.reader(open("D:/VIGNERON/BD_Commune_traite.csv", "r"),delimiter = ';')
r1 = csv.reader(open("D:/VIGNERON/BD_Commune_brut.csv", "r"),delimiter = ';')

# Récuperation des communes brutes et placement dans un liste
com_brut_in_dep = []
for row in r1 :
        if row[4] == code_dep :
                com_brut_in_dep.append(str(row[0]))

# Récuperation des communes traitées ainsi que le code Insee et intégration dans deux listes
com_traite_in_dep = []
code_insee = []
for row in r :
        if row[4] == code_dep :
                com_traite_in_dep.append(str(row[0]))
                code_insee.append(str(row[1]))
print ("Nombre de commune présente dans le " + str(code_dep) + " : " + str(len(com_traite_in_dep)))
lst_rech = []
tZero=time.time() #Récupération de tZero
print datetime.datetime.today()
t=time.time() -tZero # Temps après tZero
boucle = True
compteur = 0


# Parcour de ma liste de commune
while boucle == True :
    global count
    global compteur

    if compteur < 7 :
        for i in range (0,len(com_traite_in_dep)):
            if i < len(com_traite_in_dep) : 
                commune = com_traite_in_dep[i]
                test =commune + " " + motcle + " " + "since:\"2017-05-17\""  
                print test

                nb_demande_restante = api.rate_limit_status()['resources']['search']['/search/tweets']['remaining']
                print ("Demandes restantes : " + str(nb_demande_restante) )
                if nb_demande_restante > 1 :
                    t = time.time() - tZero
                    # print t 
                    time.sleep(0.01)

                    # Recherche de tweets.
                    # items(200) permet de récupérer les 200 premiers status
                    for status in tweepy.Cursor(api.search, q = test, count= 60 ).items():
                        #print commune 
                        nb_demande_restante = api.rate_limit_status()['resources']['search']['/search/tweets']['remaining']
                        try :
                            # Récupération des données twitter et lecture du format Json
                            json_data = status._json
                            # Récuperation du nom de l'utilisateur
                            user = status.user.name.encode('ascii', 'ignore')
                            tweet_id = status.user.id
                            #print tweet_id
                            print ("Nom d'utilisateur : " + user)
                            # Récuperation de la date de publication
                            date = str(status.created_at)
                            print("Date de publication : " + str(status.created_at))
                            # Evenement survenu                                        
                            evenement = u"Innondation"
                            print ("Evenement : " + evenement)
                            # Source de l'information
                            source = u"twitter"
                            print ("source : " + source )
                            # Récuperation du nom de la commune
                            commune = com_brut_in_dep[i]
                            print ("Nom de la commune : " + commune)
                            # Récuparation du code Insee de la commune
                            insee = code_insee[i]
                            print ("Code Insee commune : " + insee)
                            # Information complémentaire
                            localisation = u"Null"
                            print ("localisation : " + localisation)
                            # récuperation du texte tweeter 
                            contenu = status.text
                            contenu = contenu.replace("\n" , ". ")
                            contenu = contenu.replace(";" , ".")
                            contenu = contenu.encode('iso8859-1','ignore')
                            print ("Tweet text: " + contenu)
                            url = json_data["entities"]["urls"]
                            if not url :
                                url = u"None"
                            else :
                                url = url[0]['expanded_url']
                            media = url.encode('iso8859-1', 'ignore')
                            print ("Media present : " + str(media))   
                            # récuperation des coordonnées du tweet
                            coord = json_data["coordinates"]
                            if status.coordinates != None :
                                lon = coord["coordinates"][0]
                                lat =  coord["coordinates"][1]
                                if lat < 51.40 and lat > 41.00 and lon < 10.50 and lon > -5.00 :
                                    lon = lon
                                    lat = lat
                                else :
                                    lon = u"None"
                                    lat = u"None"
                           print ("Longitude : " + str(lon))
                           print ("Latitude : " + str(lat))
                           confiance = u"Null"
                           print ("Indice de confiance : " + confiance)
                           print ("")
                           # Ajout des informations dans le .csv de sortie  
                           file =open("D:/VIGNERON/test_inondations_80.csv", "a" )
                           wri = csv.writer( file , csvfile, delimiter = ';' , quotechar = '|' , quoting = csv.QUOTE_MINIMAL )
                           wri.writerow([user]+[date]+[evenement]+[source]+[commune]+[insee]+[localisation]+[contenu]+[media]+[lon]+[lat])
                           #fermeture du fichier rempli
                           #/!\ si le fichier n'est pas fermé il est inutilisable 
                           file.close()                                                       
                       except :
                           break

               else :
                   i = i
                   print i
                   compteur += 1
                   print compteur
                   print t
                   time.sleep (905 - t)
                   tZero=time.time() 
                   #t = time.time() - tZero
           else:
               boucle = False
        else :
            boucle = False

Upvotes: 0

Views: 639

Answers (1)

asongtoruin
asongtoruin

Reputation: 10359

Twitter's rate limit documentation seems to suggest you can apply 900 searches per 15 minute window - though if you're using a cursor to tab through pages, I think each page counts as 1 towards this limit.

To help avoid crashes on hitting rate limits, Tweepy as rate limit handling built into its API - if you change:

api = tweepy.API(auth)

to

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

Tweepy will be able to catch the rate limit errors, and waits the minimum amount of time before trying again.

EDIT: also, you shouldn't try to "get around" the rate limits - they exist for a reason, and trying to exceed them violates Twitter's terms of service.

Upvotes: 2

Related Questions