Ich habe einen Tweet mit Streaming erhalten und versucht, eine JSON-Datei zu exportieren. Machen Sie sich also eine Notiz. Als ich nachgeschlagen habe, habe ich festgestellt, dass viele Tweets mit Tweepy erhalten wurden. Vielleicht ist das also der Mainstream? Also benutze es nicht! Ich habe tweepy nicht verwendet, weil ich nicht verwenden konnte, was ich mit der REST-API gemacht habe. Übrigens Python3.5
Beziehen Sie sich auf diesen Bereich 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 = { #Listen Sie unten die Schlüssel auf, die Sie mit Ihrem Konto erhalten haben
'consumer_key':'*******',
'consumer_secret':'*******',
'access_token':'*******',
'access_secret':'*******'
}
#Stellen Sie eine Verbindung zur Twitter-API her
twitter = OAuth1Session(KEYS['consumer_key'],KEYS['consumer_secret'],
KEYS['access_token'],KEYS['access_secret'])
nRstTm = 15 #Rate Begrenzte Wartezeit
stKeyWrd = 'twitter' #Suchbegriff
url = 'https://stream.twitter.com/1.1/statuses/filter.json'
#Konvertieren Sie die Tweet-Datumszeit in die japanische Standardzeit
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)
#Wenn Sie in kurzer Zeit zu viel zugreifen, wird ein 420-Fehler angezeigt. Warten Sie also
elif req.status_code == 420:
print('Rate Limited:',nRstTm,'Warten Sie Minuten')
time.sleep(nRstTm)
else:
#Die Bearbeitung entfällt vorerst
print('req.status_code',req.status_code)
break
#Wenn es nicht per Stream erfasst werden kann, tritt die folgende Ausnahme auf. Erfassen Sie es daher erneut.
except json.JSONDecodeError as e:
print('Erneut erwerben')
pass
except KeyboardInterrupt:
print('Verarbeitung beenden')
f.close()
break
except:
print('except', sys.exc_info())
pass
Starten Sie hier das Streaming. Wenn der Status 200 lautet, führen Sie eine Schleife durch und schreiben Sie JSON. Mein Level ist zu niedrig und das ist einfach ehrlich.
Die Sache, die stecken blieb, ist, dass req.iter_lines () eins nach dem anderen verarbeitet.
for line in req.iter_lines():
work = json.loads(line.decode('utf-8'))
Bei der Übergabe von Daten ist die variable Zeile vom Typ Bytes. Wenn Sie also einfach json.loads verwenden, werden Sie über den Typ str verärgert. Ich weiß nicht, dass ich es mit decode ('utf-8') konvertieren muss.
Wenn Sie etwas streamen, das überhaupt nicht getwittert wurde, auch wenn Sie json.loads möchten, setzen Sie es nicht in die variable Zeile! Also habe ich es unten gefangen.
except json.JSONDecodeError as e:
print('Erneut erwerben')
pass
Es gibt zwei Dinge, die ich bei der Implementierung nicht verstehe, daher kann ich sie nicht gut behandeln.
Wenn einige Wörter vor und nach dem nach Schlüsselwörtern gesuchten Wort angehängt werden, kann es anscheinend nicht erhalten werden. https://github.com/tsupo/Twitter-API-Specification--written-in-Japanese-/blob/master/twitterAPI.txt
Zum Beispiel können Sie nach "Aikatsu!" Nach Schlüsselwörtern suchen und ein Hash-Tag (halber Abstand zwischen Wörtern) wie "#Aikatsu!" Verwenden. Aber das süßeste an Aikatsu! Ist Aoi Kiriya. Es kommt nicht sofort.
Aikatsu Stars! Ehrlich gesagt bin ich in Schwierigkeiten, weil es schwierig ist, den tatsächlichen Zustand von Twitter zu ermitteln.
Gibt es einen Weg daran vorbei? Vertrauen Niki Professor Onashisu!
Wenn Sie in kurzer Zeit mehrmals versuchen, eine Verbindung herzustellen und die Verbindung wiederherzustellen, wird Ihnen mitgeteilt, dass Sie zu verbunden sind, und es wird ein 420-Fehler angezeigt. https://dev.twitter.com/overview/api/response-codes https://dev.twitter.com/rest/public/rate-limiting
Es ist in Ordnung, auf eine erneute Verbindung mit einem 420-Fehler zu warten, aber ich habe keine Ahnung, wie viele Minuten tatsächlich gewartet werden muss. Warum wird Streaming nicht explizit angegeben, wenn es REST ist?
Um ehrlich zu sein, erhalte ich diesen Fehler und Tweets fließen, während ich auf die erneute Verbindung warte. Daher möchte ich diesen Fehler vermeiden, damit er nicht ausgegeben wird, aber ich weiß nicht, wie ich das machen soll. Kannst du es überhaupt nicht tun?
Ich bin der Meinung, dass die Wahrscheinlichkeit groß ist, dass die Implementierung schlecht ist. Ich finde es schlecht, viele Male wie REST anzugreifen.
Recommended Posts