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