[PYTHON] Experimentieren Sie, um Tweets über einen längeren Zeitraum zu sammeln (Aggregation und Bestätigung des Inhalts).

Bis zum letzten Mal.

Versuchen Sie, nach Stunden zu aggregieren

Vorerst ist ungefähr eine Woche vergangen. Derzeit scheint es sicher zu funktionieren. Als nächstes möchte ich die aktuelle Anzahl der Eingaben oder die Summe für jede Stunde.

>>> db.xxx.count()

Wenn Sie dies tun, können Sie sehen, dass die Anzahl selbst zunimmt, aber es ist schwer zu sagen, dass irgendetwas korrekt ist ... Irgendwie ist es notwendig, es auf die stündliche Anzahl von Tweets zu bringen.

Mit MapReduce aggregieren

Es scheint, dass es in MongoDB mehrere Aggregationsmethoden gibt, aber vorerst werde ich versuchen, mit MapReduce basierend auf einem "Thin Book" zu aggregieren. ...... Ich denke, dass ich zum ersten Mal JavaScript berühre, aber ich werde gegoogelt

check.js


db.xxxxx.mapReduce(
    // map
    function() {
    	
    	d = new Date(Date.parse(this.created_at) + 32400000);
    	p = d.getFullYear() + "/" + ("0" + (d.getMonth() + 1)).slice(-2) + "/" + ("0" + d.getDate()).slice(-2) + " " + ("0" + d.getHours()).slice(-2) + ":00:00"
        emit(
            p,
            1
        );
    },

    // reduce
    function(key, values) {
        return Array.sum(values)
    },

    {
        query: {},
        out: "TweetsCount"
    }
)

So was. (Ist das Datums- und Uhrzeitformat von JavaScript nicht die einzige Möglichkeit, dies zu tun?)

# mongo localhost/TwitterDB check.js

Wenn Sie es so ausführen, wird das Ergebnis in einer anderen Sammlung "TweetsCount" gespeichert.

(Auszug nur dort, wo der Peak auftritt)
{ "_id" : "2016/10/28 13:00:00", "value" : 67 }
{ "_id" : "2016/10/28 14:00:00", "value" : 47 }
{ "_id" : "2016/10/28 15:00:00", "value" : 102 }
{ "_id" : "2016/10/28 16:00:00", "value" : 103 }
{ "_id" : "2016/10/28 17:00:00", "value" : 2850 }
{ "_id" : "2016/10/28 18:00:00", "value" : 5317 }
{ "_id" : "2016/10/28 19:00:00", "value" : 4324 }

Es scheint, dass es vorerst genommen werden kann. Ist es nicht insgesamt klein? Ich fühle mich so, aber (ich habe das Gefühl, ich habe eine Spitze von einer Ziffer ... vielleicht wegen des Suchschlüssels) </ sub>. Diese Ausführungsstufe scheint keine signifikante Belastung zu sein. Es kann sich wieder ändern, wenn es für 100 Tage abgerechnet wird ...

Lassen Sie uns den Inhalt der DB überprüfen

Das aktuell ausgeführte Erfassungsprogramm gibt nichts an die Standardausgabe auf dem Bildschirm aus, sodass nicht überprüft werden kann, was gespeichert ist. Sie können es sehen, indem Sie direkt auf MongoDB schauen, aber Sie kennen den Echtzeit-Erfassungsstatus nicht. Wenn Sie es sich nur ansehen, gibt es viele unnötige Elemente in JSON, und ehrlich gesagt ist es schwer zu sehen.

Irgendwie möchte ich ein Skript, das den Inhalt von Tweets in Echtzeit (oder mit einigen Folgemaßnahmen) überprüfen kann.

Es scheint verschiedene Mittel zu geben, aber es ist schnell und nicht übertrieben, und wenn Sie versuchen, nur das zu sehen, was Sie sehen möchten, ist es so (Implementierung ca. 2 Stunden).

InsertChecker.py


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

from pymongo import MongoClient
import json

import time

#MongoDB verbindungsbezogene Variablen
HOST = 'mongo'      #Gastgeber
PORT = 27017            #Hafen(Standard:27017)
DB_NAME = 'TwitterDB'   #DB-Name
COL_NAME= 'xxxxxx'    #Sammlungsname


# ------Hauptverarbeitung von hier------

try:
    Client = MongoClient(HOST, PORT)
    db = Client[DB_NAME]
    Collection = db[COL_NAME]
    print('DB bereit')
    
    twCnt = Collection.count()  #Holen Sie sich die allererste Zählung
    
except pymongo.errors.PyMongoError as exc:
    #Verbindungsfehler
    print('DB-Verbindungsfehler')


while(True):        #Endlosschleife
    try:
        
        if(Collection.count() > twCnt):
            for doc in Collection.find(skip=twCnt):
                
                if("retweeted_status" in doc):
                    if("extended_tweet" in doc["retweeted_status"]):
                        #RT langer Satz
                        print("RT @" + doc["retweeted_status"]["user"]["screen_name"] + ": " +doc["retweeted_status"]["extended_tweet"]["full_text"])
                    else:
                        #RT kurzer Satz
                        print("RT @" + doc["retweeted_status"]["user"]["screen_name"] + ": " +doc["retweeted_status"]["text"])
                else:
                    if("extended_tweet" in doc):
                        #Langer Satz
                        print(doc["extended_tweet"]["full_text"])
                    else:
                        #Kurzer Satz
                        print(doc["text"])
                
                print(u"{name}({screen}) {created} via {src}".format(name=doc["user"]["name"], screen=doc["user"]["screen_name"],
                    created=doc["created_at"], src=doc["source"]))
                print(u"--------------------------------------------------")
        
        twCnt = Collection.count()
        
        #Das Überprüfungsintervall beträgt ungefähr alle 3 Sekunden(Ist es je nach Strömungsgeschwindigkeit 10 Sekunden lang in Ordnung?)
        time.sleep(3)
        
    except KeyboardInterrupt:
        # CTRL+C
        print('CTRL +Beenden Sie mit C.')
        ExitCode = 0
        break

(Die Notation der print () - Anweisung in der Mitte hat sich geändert, da das Kopieren und Einfügen aus dem Referenzmaterial gemischt ist.) Es ist einfach, die Anzahl der Sammlungen regelmäßig zu überprüfen und, falls vorhanden, die erhöhte Menge zu formatieren und auszugeben.

Irgendwie Erweiterung des Tweet-Wortlauts Aufgrund der Spezifikationsänderung ist das Folgende in der mittleren Phase In 4 Muster verzweigen. ・ RT-Tweets und erweiterte (lange) Tweet-Muster ・ RT-Tweets und Standard-Tweet-Muster (kurz) ・ Tweet-Muster eines normalen Tweets und einer erweiterten Spezifikation (langer Satz) ・ Tweet-Muster des normalen Tweets und der Standardspezifikation (kurzer Satz)

Zeigen Sie danach die Uhrzeit und den Benutzernamen an. Auch wenn es so extrem geeignet ist, wird es wie "tail -f" angezeigt! Wunderbar!

Kleinere Umbauten

Dies erfüllt immer noch das, was ich tun möchte, aber es ist die Menschlichkeit, die mich dazu bringt, nach Bequemlichkeit zu streben.

Zeigen Sie die Anzahl der Favoriten und RTs an

Wie viel kosten die Tweets, die RT sind, tatsächlich RT? Ich denke ich will es.

print("\n<RT: " + str(doc["retweeted_status"]["retweet_count"]) + " cnt, Fav: " + str(doc["retweeted_status"]["favorite_count"]) + "cnt >")

Fügen Sie so etwas in den Zweig ein, der während der RT angezeigt wird (richten Sie die Einrückungen aus). Sie können sehen, dass es jedes Mal hochzählt, wenn es RT ist.

Erleichtern Sie die Lesbarkeit der Zeitanzeige

Die von Twitter gesendete Zeitanzeige in JSON ist für Japaner schwer zu lesen, daher habe ich sie geändert.

d = datetime.strptime(doc["created_at"],'%a %b %d %H:%M:%S +0000 %Y') + timedelta(hours=9)

Ändern Sie nach der Konvertierung in das Datum / Uhrzeit-Format den Zeitspeicherort

created=d.strftime("%Y/%m/%d %H:%M:%S")

Wenn Sie es so ersetzen, wird es abgeschlossen. Vergessen Sie nicht "von datetime import datetime, timedelta".

Entfernen Sie HTML-Tags aus der Anzeige des Clientnamens

Es ist möglich anzuzeigen, von welcher Art von Client der Tweet gesendet wurde, aber es ist schwer zu erkennen, da dieses Element und HTML-Tags enthalten sind und die tatsächlichen Tags enthalten sind. Wenn Sie den regulären Ausdruck als "import re" aktivieren und an der Stelle, an der doc ["source"] angegeben ist, so etwas tun, verschwindet das Tag seltsamerweise.

src=re.sub("<.+?>", "", doc["source"])

(Es ist möglich, dass es nur Tags gibt, aber es funktioniert bisher einwandfrei.)

Was als nächstes zu tun ist (kein Plan)

Vorerst damit ・ Anzahl der Tweets pro Stunde ・ Anzeige von in Echtzeit erfassten Tweets

Kann jetzt gemacht werden. Immerhin ist es geistig beruhigend zu sehen, wie die Tweets richtig fließen.

Das nächste Ziel ist ・ Extraktion von Tweets, die derzeit die meisten RT sind ・ Nutzungsstatistiken des Twitter-Clients ・ Extrahieren Sie den Namen des Geschäfts (mit anderen Worten) </ sub> aus dem Tweet und messen Sie die Anzahl der Erwähnungen. Ist es da? Ich werde von Zeit zu Zeit versuchen, es zu schaffen.

(Fährt beharrlich fort.)

Recommended Posts

Experimentieren Sie, um Tweets über einen längeren Zeitraum zu sammeln (Aggregation und Bestätigung des Inhalts).
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.
Schlafverarbeitung für einen bestimmten Zeitraum (Sekunden) oder länger in Python
[Python] Erstellen Sie eine Liste mit Datum und Uhrzeit (Datum / Uhrzeit-Typ) für einen bestimmten Zeitraum
Eine einfache Problemumgehung für Bots, um zu versuchen, Tweets mit demselben Inhalt zu veröffentlichen
Die Geschichte von Airflows Webserver und DAG, deren Laden lange dauert
[Python] Erstellen Sie eine Datums- und Zeitliste für einen bestimmten Zeitraum
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.