J'ai reçu un tweet avec Streaming et j'ai essayé d'exporter un fichier JSON, alors prenez note. Quand j'ai recherché, j'ai trouvé que de nombreux tweets avaient été obtenus en utilisant tweepy, alors peut-être que c'est le courant dominant? Alors ne l'utilisez pas! Je n'ai pas utilisé tweepy car je ne pouvais pas utiliser ce que j'ai fait avec l'API REST tel quel. Au fait, python3.5
Référez-vous à cette zone https://dev.twitter.com/streaming/reference/post/statuses/filter http://qiita.com/kenmatsu4/items/23768cbe32fe381d54a2 http://qiita.com/yubais/items/dd143fe608ccad8e9f85 http://qiita.com/Gen6/items/ce83a77217a86a26d907
# -*- coding:utf-8 -*-
from requests_oauthlib import OAuth1Session
import json, datetime, time, sys
KEYS = { #Répertoriez ci-dessous les clés que vous avez obtenues avec votre compte
'consumer_key':'*******',
'consumer_secret':'*******',
'access_token':'*******',
'access_secret':'*******'
}
#Connectez-vous à l'API Twitter
twitter = OAuth1Session(KEYS['consumer_key'],KEYS['consumer_secret'],
KEYS['access_token'],KEYS['access_secret'])
nRstTm = 15 #Tarif Temps d'attente limité
stKeyWrd = 'twitter' #Rechercher un mot
url = 'https://stream.twitter.com/1.1/statuses/filter.json'
#Convertir l'heure du tweet en heure standard japonaise
def str_to_datetime_jp(datetimes):
dts = datetime.datetime.strptime(datetimes,'%a %b %d %H:%M:%S +0000 %Y')
return(dts+ datetime.timedelta(hours=9)).strftime("%Y-%m-%d %H:%M:%S")
f = open("teststream.json", "w",encoding='utf-8')
while(True):
try:
req = twitter.post(url,
data= {"track":stKeyWrd},
stream = True)
if req.status_code == 200:
for line in req.iter_lines():
work = json.loads(line.decode('utf-8'))
workuser = work['user']
tweet_json = {"tweetId":workuser["id"],
"name":workuser["name"],
"screen_name":workuser["screen_name"],
"text":work["text"],
"created_at":str_to_datetime_jp(work["created_at"])
}
print('write')
json.dump(tweet_json, f, ensure_ascii=False, indent=2,sort_keys=True)
#Si vous accédez trop en peu de temps, vous obtiendrez une erreur 420, alors attendez
elif req.status_code == 420:
print('Rate Limited:',nRstTm,'Attendez quelques minutes')
time.sleep(nRstTm)
else:
#Pour le moment, le traitement est omis
print('req.status_code',req.status_code)
break
#S'il ne peut pas être acquis par flux, l'exception suivante se produira, alors acquérez-le à nouveau.
except json.JSONDecodeError as e:
print('Réacquérir')
pass
except KeyboardInterrupt:
print('Sortie de traitement')
f.close()
break
except:
print('except', sys.exc_info())
pass
Commencez le streaming ici, et si l'état est 200, bouclez et écrivez JSON. Mon niveau est trop bas et c'est juste honnête.
La chose qui est restée bloquée est req.iter_lines (), qui traite un par un.
for line in req.iter_lines():
work = json.loads(line.decode('utf-8'))
Dans la manière de passer des données ici, la ligne de variable est de type bytes, donc si vous simplement json.loads, vous vous fâcherez contre le type str. Je ne sais pas si je dois le convertir avec decode ('utf-8').
De plus, si vous diffusez quelque chose qui n'a pas du tout été tweeté, même si vous voulez json.loads, ne le mettez pas dans la ligne variable! Alors je l'ai attrapé ci-dessous.
except json.JSONDecodeError as e:
print('Réacquérir')
pass
Il y a deux choses que je ne comprends pas quand je l'implémente, donc je ne peux pas bien le couvrir.
Apparemment, si certains mots sont attachés avant et après le mot recherché par mot-clé, il ne peut pas être obtenu. https://github.com/tsupo/Twitter-API-Specification--written-in-Japanese-/blob/master/twitterAPI.txt
Par exemple, vous pouvez rechercher "Aikatsu!" Par mot-clé et utiliser une balise de hachage (espace demi-largeur entre les mots) comme "#Aikatsu!", Mais la chose la plus mignonne à propos d'Aikatsu! C'est Aoi Kiriya. Cela ne vient pas immédiatement.
Étoiles Aikatsu! Honnêtement, je suis en difficulté car il est difficile de connaître l'état réel de Twitter.
Y a-t-il un moyen de contourner cela? Confiance Niki Professeur Onashisu!
Si vous essayez de vous connecter et de vous reconnecter plusieurs fois dans un court laps de temps, vous serez informé que vous êtes trop connecté et vous obtiendrez une erreur 420. https://dev.twitter.com/overview/api/response-codes https://dev.twitter.com/rest/public/rate-limiting
Il est normal d'attendre une reconnexion avec une erreur 420, mais je n'ai aucune idée du nombre de minutes à attendre. Pourquoi le streaming n'est-il pas explicitement indiqué lorsqu'il s'agit de REST?
Pour être honnête, j'obtiens cette erreur et les tweets circulent en attendant la reconnexion, donc j'aimerais éviter cette erreur pour qu'elle ne s'affiche pas, mais je ne sais pas comment le faire. Tu ne peux pas le faire en premier lieu?
Je pense qu'il existe une forte possibilité que la mise en œuvre soit mauvaise. Je pense qu'il est mauvais d'attaquer plusieurs fois comme REST.
Recommended Posts