Twitteranalyse: Big Data über #BigData (Teil 1)

Tweet, like and share – das soziale Netzwerk mit dem charakteristischen blauen Vogel bietet heute über 211 Millionen aktiven Nutzern täglich und allgemein einem jedem die Möglichkeit, sich mit Menschen aus aller Welt über die unterschiedlichsten Themenbereiche von Politik und Wissenschaft über Sportevents und Trends hin zu alltäglichen Situationen aus dem privaten Alltag auszutauschen. Dabei stehen angemeldeten Nutzern je Tweet (dt. Gezwitscher oder Piepsen) maximal 280 Zeichen zur Verfügung, um Gedanken und Emotionen auf dem sozialen Netzwerk zu teilen. Zahlen wie etwa 350.000 Tweets jede Minute, 500 Millionen Tweets täglich und 200 Milliarden Tweets im Jahr (Ahlgren 2022) unterstreichen die (noch immer steigende) Beliebtheit des sozialen Netzwerkes zusätzlich.

In einem Anwendungsbeispiel sammeln Prof. Dr. Christoph Laroque und sein Forschungsteam seit Juli 2020 die steigende Datenmenge rund um den Suchbegriff „Big Data“ und den dazugehörenden Hashtag #BigData. Das Forschungsteam selbst ist bei Twitter unter @IndustAnalytics (Abbildung 1) auffindbar.

Abbildung 1: Industry Analytics bei Twitter (@IndustAnalytics)

Im Folgenden soll in einem ersten Teil einer kleinen Beitragsreihe bestehend aus drei Beiträgen ein Python-Skript für die Erhebung und Sammlung von Tweets für eine konkrete Suchabfrage vorgestellt und erläutert werden.

Für einen Zugriff auf öffentliche Twitter-Daten muss danach zunächst eine Verbindung über die Twitter-API (Twitter-eigene Programmierschnittstelle zur Programmanbindung) geschaffen werden. Hierfür ist neben einer bestehenden Anmeldung als Nutzer des sozialen Netzwerkes gleichermaßen ein Entwicklerkonto notwendig, welches infolge eines kurzen Bewerbungsprozesses von Twitter freigeschalten werden muss.

Nach erfolgreicher Freischaltung für ein Entwicklerkonto bietet sich die Möglichkeit diverse Applikationen für die angestrebten Projekte zu erstellen und Identifikationsschlüssel zu generieren. Diese Identifikationsschlüssel definieren ferner vier Variablen, um sich bei Twitter zu identifizieren, Zugriff auf öffentliche Twitter-Daten zu erhalten und den Twitter-Streamer zu eröffnen.

# Variablen für Zugriff auf Twitter API
ACCESS_TOKEN = "XXXXXXXXXXXXXXX"
ACCESS_TOKEN_SECRET = "XXXXXXXXXXXXXXX"
CONSUMER_KEY = "XXXXXXXXXXXXXXX"
CONSUMER_SECRET = "XXXXXXXXXXXXXXX"

from tweepy.streaming import StreamListener
from tweepy import OAuthHandler
from tweepy import Stream

#Twitterstream
class TwitterStreamer():

    def stream_tweets(self, fetched_tweets_filename, hash_tag_list):
        # Twitter Authenfizierung und Verbindung Twitter API

        listener = StdOutListener(fetched_tweets_filename)
        auth = OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
        auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

        stream = Stream(auth,listener)

        stream.filter(track=hash_tag_list)

Danach wird die Suchabfrage stream.filter(track=hash_tag_list) entsprechend hash_tag_list = [‚big data‘] definiert, während self.fetched_tweets_filename = fetched_tweets_filename in Verbindung mit fetched_tweets_filename = “tweets.json“ die Ausgabedatei im JSON-Format festlegt. An dieser Stelle wäre es jedoch ebenso möglich, die Datei in ein anderes Dateiformat wie beispielsweise das CSV-Format schreiben zu lassen.

# Definitions- und Schreibbefehl der durchzuführenden Suchabfrage
class StdOutListener(StreamListener):

    def __init__(self, fetched_tweets_filename):
        self.fetched_tweets_filename = fetched_tweets_filename
        
    def on_data(self, data):
        try:
            print(data)
            with open(self.fetched_tweets_filename, 'a') as tf:
                tf.write(data)    
            return True
        except BaseException as e:
            print("Error on_data: %s" % str(e))
        return True

    def on_error(self, status):
        if status == 420:
            return False
        print(status)

if __name__ == "__main__":

# Definition der Suche bzw. des Hashtags
# Festlegung der Ausgabedatei
    hash_tag_list = ['big data']
    fetched_tweets_filename = "tweets.json"

    twitter_streamer = TwitterStreamer()
    twitter_streamer.stream_tweets(fetched_tweets_filename, hash_tag_list)

Im Falle eines Fehler während des Abfragevorganges, beispielsweise bei einer Überschreitung des Abfragelimits innerhalb eines Zeitraumes einer Viertelstunde (maximal 18.000 Tweets), wird der Stream entsprechend on_error(self, status) unterbrochen.

Die Ausgabe des Streams (Abbildung 2) als JSON-Datei kann nachfolgend, beispielsweise, unter Verwendung eines weiteren Python-Skripts oder einer Datenvisualisierungssoftware wie Tableau aufbereitet und visualisiert werden.

Abbildung 2: Auszug des Abfragestreams des Python-Skripts im Terminal

Im nächsten Teil dieser Beitragsreihe soll die Erhebung und Sammlung von Tweets über die freie Software für interaktive Datenanalyse KNIME („Konstanz Information Miner“) beschrieben werden, welche sich für den Anwendungsfall und die nachfolgende Visualisierung der Datenmenge rund um den Suchbegriff „Big Data“ und den dazugehörenden Hashtag #BigData bewähren konnte.