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.
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 ...
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!
Dies erfüllt immer noch das, was ich tun möchte, aber es ist die Menschlichkeit, die mich dazu bringt, nach Bequemlichkeit zu streben.
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.
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".
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.)
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