2017-05-23 3 views
0

J'ai un problème dont je ne peux pas sortir. J'essaie d'utiliser l'API twitter pour obtenir des tweets avec une certaine requête. Je fais un compte avec le api.rate_limit_status()['resources']['search']['/search/tweets']['remaining'] pour ne pas avoir le code d'erreur 429 de "trop ​​de demandes". Mais avant la fin j'ai un autre code d'erreur 88 qui signifie "La limite de demande pour cette ressource a été atteinte pour la fenêtre de limite de débit actuelle." Donc, je voudrais savoir quelles sont les limites de retour par demande ou par 15 minutes? Est-ce que j'ai des erreurs dans mon code?contourner les limites de twitter api

Mon code est ici:

# 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 

Répondre

1

rate limit documentation de Twitter semble suggérer que vous pouvez appliquer 900 recherches par intervalle de 15 minutes - mais si vous utilisez un curseur sur l'onglet à travers les pages, je pense que chaque page compte comme 1 vers cette limite.

Pour éviter les accidents sur les frapper limites de taux, Tweepy comme limite de vitesse manutention construit dans son API - si vous changez:

api = tweepy.API(auth) 

à

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

Tweepy sera en mesure de rattraper le taux Limitez les erreurs et attendez le minimum de temps avant de réessayer.

EDIT: aussi, vous ne devriez pas essayer de "contourner" les limites de débit - elles existent pour une raison, et essayer de les dépasser viole les conditions d'utilisation de Twitter.

+0

Donc, si je remplace api, mon résultat fait une pause quand la limite est terminée? c'est tout ? Mais at-il redémarré où il était avant la pause? –

+0

Oui - Tweepy sait continuer là où elle s'est arrêtée, mais attendre jusqu'à ce qu'il soit autorisé à réessayer. – asongtoruin

+0

Je vais essayer d'obtenir le numéro de repos de la requête de statut et le mettre dans mon test: "si nb_demande_restante> 1 et nb_status_restant> 1:" Savez-vous comment obtenir le reste de la requête de statut? J'ai essayé api.rate_limit_status() ['resources'] ['lists'] ['/ lists/statuses'] ['restant'] mais le nombre ne change jamais –