Обойти ограничения 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.