[PYTHON] Versuchen Sie, Twitter-Trends zu analysieren

Hallo. Als ich morgens aufwachte, war ich überrascht, dass "#Protest gegen die Gesetzesvorlage zur Änderung des Gesetzes über die Staatsanwaltschaft" im Twitter-Trend war, also analysierte ich es. Twitter, das mit politischen Tweets gefüllt ist, ist nicht Twitter. Twitter, das ich kenne, ist eine Welt voller "Kintama Glitter Friday". Ich glaube nicht, dass es auf Twitter 2 Millionen politische Tweets geben wird. image.png Shinzo Abe ... Es ist eine Lüge ...

Zunächst sagte mein Urgroßvater während des Krieges, dass Sie diese Zahlen nicht als Voraussetzung glauben sollten. Als ich das sah, vermutete ich zuerst, dass "der absichtliche Trend durch Bot und Spam verursacht wurde". Es besteht auch das Risiko, dass dieselbe Person mehrere Beiträge verfasst. Glücklicherweise habe ich mich vor einigen Monaten für die Twitter-API beworben, und jetzt kann ich die Twitter-Suche im Programm frei berühren, sodass ich den Code sofort schreiben möchte.

Codierung

from requests_oauthlib import OAuth1Session
import json
from datetime import datetime
import calendar
import csv
import time
from bs4 import BeautifulSoup

#Code für den Zugriff auf die Twitter-API
consumer_key = *****
consumer_key_secret = *****
access_token = *****
access_token_secret = *****


#Greifen Sie auf die Twitter-API zu
twitter = OAuth1Session(consumer_key, consumer_key_secret, access_token, access_token_secret)

#Definieren Sie eine Funktion für die Suche auf Twitter. que ist das Suchwort, bot ist, ob bot eingeschlossen werden soll, count ist die Anzahl der erfassten Tweets, max_id ist die maximale ID des zu durchsuchenden Tweets.

def get(que,max_id):
    params = {'q': que, 'count': 100, 'max_id': max_id, 'modules': 'status', 'lang': 'ja'}
    #Greifen Sie auf Twitter zu.
    req = twitter.get("https://api.twitter.com/1.1/search/tweets.json", params=params)

    #Wenn der Zugriff erfolgreich ist, bleiben die Tweet-Informationen erhalten.
    if req.status_code == 200:
        search_timeline = json.loads(req.text)
        limit = req.headers['x-rate-limit-remaining']
        reset = int(req.headers['x-rate-limit-reset'])
        print("API remain: " + limit)
        if int(limit) == 1:
            print('sleep')
            time.sleep((datetime.fromtimestamp(reset) - datetime.now()).seconds)

    #Wenn dies fehlschlägt, beenden Sie den Vorgang.
    elif req.status_code == 503:
        time.sleep(30)
        req = twitter.get("https://api.twitter.com/1.1/search/tweets.json", params=params)
        if req.status_code == 200:
            search_timeline = json.loads(req.text)
            #API-Rest
            limit = req.headers['x-rate-limit-remaining']
            reset = int(req.headers['x-rate-limit-reset'])
            print("API remain: " + limit)
            if limit == 0:
                print('sleep')
                time.sleep((datetime.fromtimestamp(reset) - datetime.now()).seconds)

        else:
            print(req.status_code)
            return [], 0
    else:
        print(req.status_code)
        return [], 0

    for i in range(len(search_timeline['statuses'])):
        bs3obj = BeautifulSoup(search_timeline['statuses'][i]['source'], 'html.parser')
        search_timeline['statuses'][i]['source'] = bs3obj.text


    #Gibt eine Liste mit Tweet-Informationen zurück, wenn diese Funktion ausgeführt wird.
    return search_timeline['statuses'], search_timeline['statuses'][-1]['id']


def TweetSearch(que, bot, rep):
    max_id = 1259158522710730000 - 1
    global search_timeline, tweetTime
    tweetList = []
    #Geben Sie an, ob Tweets von Bot ausgeschlossen werden sollen.
    if bot:
        que = str(que + ' -bot -rt')
    else:
        que = str(que + ' -rt')

    for i in range(rep):
        time.sleep(1)
        result, max_id = get(que,max_id)
        if max_id == 0:
            break

        tweetList.extend(result)


    return tweetList



word = '#Protest gegen die Gesetzesvorlage zur Änderung des Gesetzes der Staatsanwaltschaft'
tweetList = TweetSearch(word,False,200)

head = [i for i in tweetList[0]]

#Ausgabe in CSV-Datei
with open('tweetanalysis_02.csv','w',newline='', encoding='utf_8') as f:
    writter = csv.writer(f)
    writter.writerow(head)
    for i in tweetList:
        writter.writerow([i[key] for key in head])

Es gibt einen relativ losen Teil, der mit Eile endet. Um eine Sache hinzuzufügen, wird jedem Tweet eine ID zugewiesen, und Sie können diese überprüfen, indem Sie sich die letzten 18 Ziffern der Tweet-URL ansehen. Und der Wert, den diese ID annimmt, wird größer, wenn die Tweet-Zeit später wird. Indem Sie diese Eigenschaft verwenden, um die Suche nach Tweets mit max_id einzuschränken, können Sie verhindern, dass doppelte Tweets extrahiert werden, wenn mehrere Abfragen gesendet werden. (Die Anzahl der Tweets, die mit einer Abfrage durchsucht werden können, beträgt bis zu 100 Tweets.)

Schauen Sie sich die Daten an

Führen Sie dieses Programm aus, 5/9 23:46 --5 / 10 2:58 37935 Tweets in CSV gespeichert.

An diesem Punkt können Sie sehen, dass es nicht überwältigend 1 Million erreicht. (Eigentlich hätte der Trend zu diesem Zeitpunkt 1 Million Tweets überschreiten sollen) Übrigens gibt es in den erfassten Daten ein Element namens 'Retweet_count', und Sie können wissen, wie oft jeder der erfassten Tweets Retweet war. Wenn Sie sie kurz addieren, wird es 391675 sein, also scheint es besser zu denken, dass der Trend von Twitter Retweet einschließt. (Tatsächlich wird auch davon ausgegangen, dass Tweets vor dem 5. Mai um 23:46 Uhr zum Trend beitragen.) Es ist auch die erste aufgeworfene Frage ・ Gepostet von demselben Benutzer ・ Bot, Spam-Posting Lassen Sie uns kurz überprüfen. Ich bin keine großartige Person, die mit CSV mit statistischer Software wie R umgehen kann. Diesmal ist es also eine klassische Methode, aber ich werde es einfach mit Excel versuchen. (Weil die Datenmenge nicht so groß ist und ich dachte, mein PC könnte es aushalten)

Aktivieren Sie auf der Registerkarte [Daten] den Befehl 'Benutzer' im Element [Duplikate löschen] und aktivieren SieImage.png /0/596394/04981035-8aa0-125f-ceee-1b3044ed2dc4.png) Löschen! image.png Oh. Etwa 1/4 der Tweets wurden als doppelte Benutzer entfernt. Dies allein sagt Ihnen natürlich nicht, ob derselbe Benutzer durcheinander gebracht wurde oder ob viele Benutzer mehrmals getwittert wurden, aber zumindest können Sie sehen, dass die Anzahl der Benutzer, die twittern, viel geringer ist, als es aussieht.

Lassen Sie uns als Nächstes die Datenquellenquelle herausfinden. Es werden Daten analysiert, wobei Benutzerduplikate entfernt werden. image.png Infolgedessen machte Twitter für iPhone mehr als die Hälfte aus. Auch in Bezug auf andere Dinge gibt es viele offizielle Kunden wie "Twitter für iPad" und "Twitter Web Client" und inoffizielle Kunden, und Sie können sehen, dass es aufgrund der automatischen Veröffentlichung und des Spam so wenige Tweets gibt. (Übrigens können Sie die Quelle Ihres eigenen Tweets, der die Zeichenfolge "Twitter" enthält, nicht festlegen. Solange Twitter in der Zeichenfolge enthalten ist, können Sie daraus schließen, dass 100% der Beiträge nicht per Spam veröffentlicht werden.)

Es ist einfach, aber ich habe Twitter-Trends analysiert. Ich habe den Python-Code und die erhaltene CSV-Datei auf github hochgeladen.  https://github.com/ogadra/twitter_analysis Nächstes Mal möchte ich die Daten erhöhen und mit R usw. analysieren.

Nachtrag

Ich bin mir nicht sicher, aber es scheint eine Auslassung des Erwerbs zu geben. Ich bin mir immer noch nicht sicher, ob dies die Twitter-API verwendet oder ob ich schlecht bin, also werde ich versuchen, es erneut zu bekommen.

Recommended Posts

Versuchen Sie, Twitter-Trends zu analysieren
Ich fing an zu analysieren
Versuchen Sie, yolact zu implementieren
Versuchen Sie, die Anzahl der Likes auf Twitter zu schätzen
Versuchen Sie, Twitter-Daten in SPAM und HAM zu unterteilen
Versuchen Sie, Tweets mithilfe der Twitter-API in großen Mengen zu löschen
Versuchen Sie, Python selbst zu verstehen
Versuchen Sie es mit der Twitter-API
Mit Python auf Twitter posten
Versuchen Sie, die Genauigkeit der Twitter-ähnlichen Zahlenschätzung zu verbessern
Versuchen Sie es mit der Twitter-API
[Python] Versuchen Sie, die WAV-Datei zu analysieren (Ver, für die kein zusätzliches Plug-In erforderlich ist)
Versuchen Sie, eine Sprache auszuwählen
Versuchen Sie, Online-Familien-Mahjong mit Python zu analysieren (TEIL 1: Daten aufnehmen)
Versuchen Sie, eine Bezier-Kurve zu zeichnen
Versuchen Sie, Facebook mit Python zu betreiben
[Lambda] [Python] Von Lambda auf Twitter posten!
Versuchen Sie, sich mit ONNX Runtime zu profilieren
Versuchen Sie, Nagios mit pynag zu konfigurieren
Versuchen Sie, das Thema Pelican vorzustellen
Versuchen Sie, Trace in Python zu berechnen
Versuchen Sie, Daten in MongoDB abzulegen
Versuchen Sie, die cloudmonkey-CLI in python3 -1 zu konvertieren
Versuchen Sie, Statistiken mit e-Stat abzurufen
Probieren Sie Cython in kürzester Zeit aus
Mit Python 3 einfach auf Twitter posten
Versuchen Sie, Audio mit M5 STACK auszugeben
Der schnellste Weg, EfficientNet auszuprobieren
Der einfachste Weg, PyQtGraph auszuprobieren
Skript zur Automatisierung der OAuth-Anmeldung für Twitter
Setzen Sie Cabocha 0.68 in Windows ein und versuchen Sie, die Abhängigkeit mit Python zu analysieren