[PYTHON] Exportieren Sie die von der Twitter Streaming API erfassten Inhalte im JSON-Format

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

Quelle

# -*- 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

Wo es mit der Verarbeitung gestaut ist

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

Was ich nicht verstehe

Es gibt zwei Dinge, die ich bei der Implementierung nicht verstehe, daher kann ich sie nicht gut behandeln.

  1. Ich kann kein Wort mit einem Hilfswort durch Stichwortsuche erhalten
  2. 420 Fehler treten auf

Ich kann bei einer Stichwortsuche kein Wort finden, das ein Hilfswort enthält

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!

420 Fehler

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

Exportieren Sie die von der Twitter Streaming API erfassten Inhalte im JSON-Format
Beseitigen Sie verstümmelte japanische Zeichen in JSON-Daten, die von der API erfasst wurden.
Greifen Sie mit Python auf die Twitter-API zu
Tweet mit der Twitter-API in Python
Speichern Sie die vom Browser erfassten Sprachdaten im WAV-Format auf dem Server
Twitter-Streaming-Client zum Genießen im Terminal
Formatieren und anzeigen Sie das von der OpenWeatherMap-API erfasste XML.
Erstellen Sie mithilfe der Twitter-Streaming-API einen Echtzeit-Bot für die automatische Antwort
Einfaches Formatieren von JSON mit Python
Gzip komprimiert Daten durch Streaming
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der Twitter-API
[Python / Django] Erstellen Sie eine Web-API, die im JSON-Format antwortet
Spielen Sie, indem Sie die Riot Games-API in Python First Half drücken
Kopieren und Einfügen des Inhalts eines Blattes im JSON-Format mit einer Google-Tabelle (mithilfe von Google Colab)
Abrufen der arXiv-API in Python
Klicken Sie in Python auf die Sesami-API
Klicken Sie auf die Web-API in Python
Kontinuierliche Erfassung durch Twitter API (Tipps)
Speichern Sie den von Bio.Phylos Funktion draw_ascii gezeichneten phylogenetischen Baum im Textformat
Codebeispiel zum Abrufen von oauth_token und oauth_token_secret der Twitter-API in Python 2.7