[PYTHON] Experimentieren Sie, um Tweets für eine lange Zeit zu sammeln (Programmvorbereitung (2))

Bis zum letzten Mal

Überprüfen Sie vorerst die Quelle

Es war das letzte Programm, das überraschend gut funktionierte, obwohl es ziemlich angemessen gemacht wurde, aber da es durch Nachahmung gemacht wurde ~~ Ist das wirklich gut? Ich kann die Frage nicht loswerden. Die offizielle Erklärung befindet sich auf der Ebene eines Blattes, und es gibt keine API-Referenz. Die Stream-API wird tatsächlich unbeaufsichtigt gelassen ~~ Ist sie nicht beliebt?

Vielleicht gibt es eine Seite, die irgendwo ausführlich erklärt, aber ich kann kaum Englisch lesen, deshalb verstehe ich nicht gut. Selbst wenn Sie Tweepy verwenden, sehen Sie nichts anderes als die wichtigsten Dinge, oder denken Sie, dass dies bis auf die eingeführten Teile selbstverständlich ist?

Wenn Sie es nicht wissen, müssen Sie die Quelle lesen.

Auf jeden Fall gibt es zu wenig Informationen rund um die Stream-API, als ich mir vorgestellt habe. Vor allem das offizielle Dokument unbeaufsichtigt zu lassen, ist am wenigsten in Mode. Ich habe Angst, weil die gewünschte Funktion "tatsächlich implementiert" ist oder so. In diesem Fall müssen Sie die Quelle direkt überprüfen . Glücklicherweise ist Tweepy eine Open-Source-Software, die unter der MIT-Lizenz veröffentlicht und auf GitHub veröffentlicht wurde. Mit anderen Worten, wenn Sie versuchen, es zu lesen, ist es nicht unmöglich - wenn Sie die Zeit, die Motivation und die Fähigkeit haben -.

Schauen wir uns die Quelle genauer an.

Streaming.py gab es eine Quelle mit dem Namen selbst. Öffnen Sie diese Wenn ich es versuche, gibt es drei Klassen. * StreamListener * ReadBuffer * Stream Die beiden anderen als ReadBuffer werden in dem ersten Programm verwendet, das ich erstellt habe. Wenn die ReadBuffer-Klasse genau so klingt, wie sie sich anhört, ist es in Ordnung, sie vorerst in Ruhe zu lassen. Werfen wir einen Blick auf "StreamListener" und "Stream".

StreamListener-Klasse

Ist es nicht in Ordnung zu verstehen, dass die Klasse die von der Stream-Klasse empfangenen Informationen weitergibt und tatsächlich verarbeitet? Tatsächlich wird nach dem Erben dieser Klasse die Methode der übergeordneten Klasse überschrieben, um die ursprüngliche Operation zu implementieren, und ansonsten wird die vorbestimmte Operation der übergeordneten Klasse ausgeführt ... , richtig? </ small>

Es gab ziemlich viele Methoden, die überschrieben werden konnten. Unten finden Sie die Liste (überprüfen Sie die Beschreibung anhand der Referenz in dev.twitter.com ). ..

Was ist das? Wird nicht eine gute Nachricht gesendet? Es scheint eine richtige "verbundene" Nachricht zu geben. Ich war ein wenig erleichtert. Bei der von on_data aufgerufenen Methode wird die Verbindung anscheinend getrennt, wenn der Rückgabewert False ist. on_error wird implementiert, um False zurückzugeben, wenn es nicht überschrieben wird. Dies kann nur durch Betrachten der Stream-Klasse und Überprüfen des Anrufers festgestellt werden.

Die von der Stream-API gesendeten Nachrichten werden übrigens unter dev.twitter.com veröffentlicht. Es scheint jedoch, dass die Nachrichten "status_withheld", "user_withheld", "scrub_geo", "for_user" und "control" nicht von on_data überprüft werden. Liegt es daran, dass es nicht viel Sinn macht? Wenn Sie diese sehen möchten, müssen Sie on_data überschreiben und die meisten der oben genannten Methoden überschreiben. Ich weiß es nicht.

Stream-Klasse

Es sieht aus wie eine Klasse, die Schleifen zum Verbinden, Trennen und Empfangen implementiert. Nehmen Sie die anfänglichen Einstellungen für die Verbindung mit "init (Konstruktor)" vor und rufen Sie die Methoden auf, die der Stream-API von "userstream", "firehose", "retweet", "sample", "filter" und "sitestream" entsprechen, um "_start" zu durchlaufen. Rufen Sie "_run" auf.

Die Schleife von "while self.running:" führt eine bestimmte Verbindungsverarbeitung durch, und die Ausführungsschleife nach der Verbindung wird von "_read_loop" behandelt. Wenn der Verbindungsprozess mit "self.session.request ()" fehlschlägt, rufen Sie on_error der StreamListener-Klasse auf, verlassen Sie im Fall von False die While-Schleife und stellen Sie die Verbindung wieder her, während Sie eine bestimmte Zeit warten, während Sie in anderen Fällen den Fehlerzähler drehen ...

** Gibt es keine Wiederverbindungsfunktion! ** ** **

Das ist richtig, es gibt keinen Grund, die lästige Geschichte nicht in der Bibliothek zu implementieren. Es ist keine Geschichte, den Benutzer das tun zu lassen.

Die Hürde für die wichtigste Anforderungsspezifikation "** Eine Funktion zum erneuten Verbinden bei unerwarteter Trennung **" ist plötzlich gesunken. Andererseits möchte ich eine Stunde lang fragen, warum die Details dieser wichtigen Funktionen nicht leicht verständlich beschrieben werden ...

Übrigens wird in "\ _read_loop" "on_data" der StreamListener-Klasse aufgerufen, und wenn hier False zurückgegeben wird, wird die Schleife maskiert. Zu diesem Zeitpunkt wird in der Verbindungsschleife des Aufrufers "_run" auch self.running angezeigt, in dem False gespeichert ist, und die Verbindungsschleife wird beendet und die Sitzung beendet.

Schauen Sie sich die Quelle an und entscheiden Sie sich für eine Richtlinie.

nimm das Herz. Als Ergebnis der Betrachtung der Quelle

  1. Die Methode, die von on_data der StreamListener-Klasse verzweigt, wird getrennt und endet, wenn False zurückgegeben wird.
    → Überschreiben Sie alles, was in der ursprünglichen Methode False zurückgibt, so dass True zurückgegeben wird.
  2. Wenn on_error und on_timeout False zurückgeben, werden sie ohne erneute Verbindung beendet.
    → Überschreiben Sie dies und geben Sie True zurück.
  3. on_exception kann nicht behandelt werden, denken Sie also an einige Mittel

Wenn man sich speziell die Quelle ansieht, gibt es nichts, was (1) entspricht. Ich meine, es gibt nicht True oder False als Rückgabewert zurück. ...... Ist das in Ordnung? * Ich überprüfe mit "ist falsch:", also ist es in Ordnung *, weil es im Vergleich nicht gleich ist, wenn der Wert nicht zurückgibt? In Bezug auf (2) gibt on_timeout keinen Wert zurück und gibt zurück. Daher ist es in Ordnung, wenn Sie nur on_error überschreiben und True zurückgeben. (3) Was soll ich tun?

Für Warnungen und Fehler scheint es jedoch nützlich zu sein, später ein Protokoll zu führen. Überschreiben Sie daher "on_connect" "on_disconnect" "on_limit" "on_timeout" "on_warning" "on_exception". Zu

Umgang mit Ausnahmen

Ausnahmen sind Ausnahmen, daher ist es schwierig, mit ihnen umzugehen. Die Ausnahme in der Verarbeitungsschleife der Stream-Klasse wird nach dem Aufruf von on_exception von StreamListener ausgelöst, daher sollte es möglich sein, dies beim Aufrufer auszuschließen. Was ist sonst, wenn es während der einzelnen Verarbeitung in StreamListener passiert? Wenn Sie jedoch dem Anrufer folgen, handelt es sich um einen StreamListener, der sich schließlich dort sammelt ...? Wenn es mit einer Ausnahme immer noch stoppt ... Möchten Sie das Skript in einer Schleife mit einer Batchdatei aufrufen? ??

Quelle bisher

Basierend auf der obersten Priorität "** Fähigkeit, die Verbindung im Falle einer unerwarteten Trennung wieder herzustellen **" sieht die Quelle bisher so aus.

tweetcheck2.py


#!/usr/bin/env python
# -*- coding:utf-8 -*-

import tweepy

#Hol es dir selbst und leg es hinein
CK = ''   # Consumer Key
CS = ''   # Consumer Secret
AT = ''   # Access Token
AS = ''   # Accesss Token Secert

class Listener(tweepy.StreamListener):
    def on_status(self, status):
        print('Tweet')    #Ich kann es sowieso nicht lesen, also sage ich dir nur, dass es eine Nachricht gab
        return True

    def on_error(self, status_code):
        print('Ein Fehler ist aufgetreten: ' + str(status_code))
        return True

    def on_connect(self):
        print('In Verbindung gebracht')
        return

    def on_disconnect(self, notice):
        print('Getrennt:' + str(notice.code))
        return

    def on_limit(self, track):
        print('Empfangslimit ist aufgetreten:' + str(track))
        return

    def on_timeout(self):
        print('Auszeit')
        return True

    def on_warning(self, notice):
        print('Warnmeldung:' + str(notice.message))
        return

    def on_exception(self, exception):
        print('Ausnahmefehler:' + str(exception))
        return


#Hauptverarbeitung von hier
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

while True:     #Endlosschleife
        try:
                listener = Listener()
                stream = tweepy.Stream(auth, listener)

                #Wählen Sie eine aus und kommentieren Sie sie aus.
                #stream.filter(track=['#xxxxxx'])
                stream.sample()
                #stream.userstream()
        except:
                pass    #Ignoriere alle Ausnahmen und Schleife

Stellen Sie sicher, dass alle Meldungen angezeigt werden, die die Ausführung gefährden, z. B. Fehler und Warnungen, und stellen Sie die Verbindung wieder her, wenn ein Fehler auftritt. In dem unwahrscheinlichen Fall, dass eine Ausnahme auftritt, schließt der Hauptverarbeitungsabschnitt sie aus, ignoriert die Ausnahme, schleift sie und führt sie erneut aus.

Fertig? …… Strg + C …… </ klein>

(Als ich es tatsächlich ausprobiert habe, konnte ich es nicht stoppen (dumm. Gibt es eine Möglichkeit, der Schleife nur zu entkommen, wenn Strg + C?)

Die Grundform der Twitter-bezogenen Verarbeitung ist wahrscheinlich vorerst so. Ich frage mich, ob das wirklich in Ordnung ist, aber ... ** Ich suche Tsukkomi . Nächstes Mal werde ich auf der MongoDB-Seite mit der höchsten Priorität " Speicherung empfangener Daten in MongoDB **" beginnen. (Fortsetzen)

Recommended Posts

Experimentieren Sie, um Tweets für eine lange Zeit zu sammeln (Programmvorbereitung (3))
Experimentieren Sie, um Tweets für eine lange Zeit zu sammeln (Programmvorbereitung (1))
Experimentieren Sie, um Tweets für eine lange Zeit zu sammeln (Programmvorbereitung (2))
Experimentieren Sie, um Tweets für eine lange Zeit zu sammeln (Programmvorbereitung (5))
Experimentieren Sie, um Tweets für eine lange Zeit (unmittelbar vor der Ausführung) zu sammeln.
Experimentieren Sie, um Tweets über einen längeren Zeitraum zu sammeln (Aggregation und Bestätigung des Inhalts).
Experimentieren Sie mit Python, um ein PDF für Selbstversorger für Kindle zu erstellen
Eine Lernmethode für Anfänger zum Erlernen der Zeitreihenanalyse
Ich möchte vorerst eine Docker-Datei erstellen.
[Profil] Identifizieren Sie, wo das Programm lange dauert (google-perftool)
[Python] Es war sehr praktisch, die Python-Klasse für das ROS-Programm zu verwenden.
So stoppen Sie das Programm bis zu einem bestimmten Datum und einer bestimmten Uhrzeit in Python
Ich habe versucht, einen Linebot zu erstellen (Vorbereitung)
Einführung in discord.py (1. Tag) -Preparation for discord.py-
Eine einfache Problemumgehung für Bots, um zu versuchen, Tweets mit demselben Inhalt zu veröffentlichen
Das Herunterfahren von CentOS 7 mit LVM-Konfiguration dauert lange.