Обойти ограничения Twitter API

У меня есть проблема, из которой я не могу выйти. Я пытаюсь использовать API Twitter, чтобы получить твиты с определенным запросом. Я считаю с api.rate_limit_status()['resources']['search']['/search/tweets']['remaining'] не иметь код ошибки 429 "Слишком много запросов". Но перед концом у меня есть еще один код ошибки 88, который означает, что "предел запроса для этого ресурса был достигнут для текущего окна ограничения скорости".

Итак, я хотел бы знать, каковы пределы возврата для запроса или за 15 минут? у меня есть ошибки в моем коде?

Мой код здесь:

# 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

1 ответ

Документация по ограничению скорости в Твиттере, кажется, предполагает, что вы можете применять 900 поисков за 15-минутное окно - хотя, если вы используете курсор для перемещения по страницам, я думаю, что каждая страница считается равной 1 к этому пределу.

Чтобы избежать сбоев при достижении ограничений скорости, Tweepy как обработка ограничения скорости встроена в его API - если вы измените:

api = tweepy.API(auth)

в

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

Tweepy сможет отлавливать ошибки ограничения скорости и ждет минимальное количество времени, прежде чем пытаться снова.

РЕДАКТИРОВАТЬ: также, вы не должны пытаться "обойти" ограничения скорости - они существуют по причине, и попытка превысить их нарушает условия обслуживания Twitter.

Другие вопросы по тегам