lehrkraefte:blc:informatik:glf4-24:analyse-scripts

Folgende Scripts konvertieren die Social-Media-Daten in eine .csv-Datei.

spotify.py
import re        # Regular Expressions
import datetime  # Datum/Zeit 
import os        # Files suchen
import json
# Erklärungen zu diesem Code sind Analog dem Youtube-Extraktor.
 
rootdir = "C:/Users/Simon.Knaus/OneDrive - Kt. SG BLD/ksbg/Informatik/bigdata/spotify_data"
 
# Resultat, das am Schluss geschrieben werden soll
csv = ""   # Comma separated values
# Wie viele Kontrollausgaben?
debug = 100
 
# Alle HTML-Dateien im Verzeicznis anzeigen            
for root, dirs, files in os.walk(rootdir):
    for file in files:
        if file.endswith(".json"):
            filepath = os.path.join(root, file) 
            # Datei oeffnen
 
            f = open(filepath, "r")
            #html = f.read()  # Alles einlesen
            data=json.load(f)
            print(data)
            f.close()        # Datei schliessen
 
            for d in (data):
                # Einträge in Zahlen umwandeln
                # Monat plus die anderen Einträge (ohne AM/PM) in Zahlen umgewandelt 
                #   Die Zeichenkette "42" ist nicht das gleiche wie die Zahl 42.
 
 
                # Datum daraus generieren (macht die Datumsmanipulation einfacher).
                # Jahr, Monat, Tag, Stunde, Minute, Sekunde
 
 
                if debug>0:
                    # Ausgabe zur Kontrolle, produziert folgendes Format
                    print(d["endTime"])   # 2021-01-06 21:23:12
                    debug -= 1  # Um 1 vermindern
 
 
                # Formatierte Ausgabe des Datums, siehe https://www.w3schools.com/python/python_datetime.asp
                # \n heisst neue Zeile.
                csv += str(d["endTime"])+";"+str(d["msPlayed"])+"\n"
 
            # Ausgabe in Datei schreiben
        f = open("resultat_spotify.csv", "w")
        f.write(csv)
        f.close() 
twitter.py
import re        # Regular Expressions
import datetime  # Datum/Zeit 
import os        # Files suchen
 
# Erklärungen zu diesem Code sind Analog dem Youtube-Extraktor.
 
rootdir = "C:/Users/Simon.Knaus/OneDrive - Kt. SG BLD/ksbg/Informatik/bigdata/twitter/data"
 
# Resultat, das am Schluss geschrieben werden soll
csv = ""   # Comma separated values
# Wie viele Kontrollausgaben?
debug = 100
 
# Alle HTML-Dateien im Verzeicznis anzeigen            
for root, dirs, files in os.walk(rootdir):
    for file in files:
        if file.endswith(".js"):
            filepath = os.path.join(root, file) 
            # Datei oeffnen
            f = open(filepath, "r")
            html = f.read()  # Alles einlesen
            f.close()        # Datei schliessen
 
 
            # Datum der aus zwei verschiedenen Formaten einlesen
            # Alle nötigen Angaben werden in Klammern "ge-captured"
            daten = re.findall("(\d{1,4})-(\d{1,2})-(\d{1,2})T(\d{1,2}):(\d{1,2}):(\d{1,2}).000Z", html)
            daten2 = re.findall("(\d{1,4})-(\d{1,2})-(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})", html)
            #print(daten2)
            #print(daten2)
 
            if(debug>0):
                print(file,": ",len((daten+daten2)))
                debug-=1
 
 
            # Alle Einträge durchgehen, d enthält jeweils den nächsten Eintrag
            for d in (daten2+daten):
                # Einträge in Zahlen umwandeln
                # Monat plus die anderen Einträge (ohne AM/PM) in Zahlen umgewandelt 
                #   Die Zeichenkette "42" ist nicht das gleiche wie die Zahl 42.
 
                e = [int(x) for x in d]
                if debug>0:
                    # Ausgabe zur Kontrolle, sollte folgendes Format Produzieren
                    print(e) # [1, 6, 2021, 21, 23, 12]
                    debug -= 1  # Um 1 vermindern
 
                # Datum daraus generieren (macht die Datumsmanipulation einfacher).
                # Jahr, Monat, Tag, Stunde, Minute, Sekunde
                datum = datetime.datetime(e[0], e[1], e[2], e[3], e[4],e[5])
 
                if debug>0:
                    # Ausgabe zur Kontrolle, produziert folgendes Format
                    print(datum)   # 2021-01-06 21:23:12
                    debug -= 1  # Um 1 vermindern
 
 
                # Formatierte Ausgabe des Datums, siehe https://www.w3schools.com/python/python_datetime.asp
                # \n heisst neue Zeile.
                csv += datum.strftime("%Y-%m-%d %H:%M:%S;"+os.path.splitext(file)[0]+"\n")  #Das Format soll so angepasst werden, damit die Tabellenkalkulation dann damit umgehen kann.
 
            # Ausgabe in Datei schreiben
        f = open("resultat_twitter.csv", "w")
        f.write(csv)
        f.close()
snapchat.py
import re        # Regular Expressions
import datetime  # Datum/Zeit 
import os        # Files suchen
 
# Erklärungen zu diesem Code sind Analog dem Youtube-Extraktor.
 
rootdir = "C:/Users/Simon.Knaus/OneDrive - Kt. SG BLD/ksbg/Informatik/bigdata/mydata_1678177023208/html"
 
# Resultat, das am Schluss geschrieben werden soll
csv = ""   # Comma separated values
# Wie viele Kontrollausgaben?
debug = 30
 
# Alle HTML-Dateien im Verzeicznis anzeigen            
for root, dirs, files in os.walk(rootdir):
    for file in files:
        if file.endswith(".html"):
            filepath = os.path.join(root, file) 
            # Datei oeffnen
            f = open(filepath, "r")
            html = f.read()  # Alles einlesen
            f.close()        # Datei schliessen
 
 
            # Datum der Form 30.12.2021, 22:13 einlesen
            # Alle nötigen Angaben werden in Klammern "ge-captured"
            daten = re.findall("(\d{1,4})-(\d{1,2})-(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2}) UTC", html)
            if(debug>0):
                print(file,": ",len(daten))
                debug-=1
 
 
            # Alle Einträge durchgehen, d enthält jeweils den nächsten Eintrag
            for d in daten:
                # Einträge in Zahlen umwandeln
                # Monat plus die anderen Einträge (ohne AM/PM) in Zahlen umgewandelt 
                #   Die Zeichenkette "42" ist nicht das gleiche wie die Zahl 42.
 
                e = [int(x) for x in d]
                if debug>0:
                    # Ausgabe zur Kontrolle, sollte folgendes Format Produzieren
                    print(e) # [1, 6, 2021, 21, 23, 12]
                    debug -= 1  # Um 1 vermindern
 
                # Datum daraus generieren (macht die Datumsmanipulation einfacher).
                # Jahr, Monat, Tag, Stunde, Minute, Sekunde
                datum = datetime.datetime(e[0], e[1], e[2], e[3], e[4],e[5])
 
                if debug>0:
                    # Ausgabe zur Kontrolle, produziert folgendes Format
                    print(datum)   # 2021-01-06 21:23:12
                    debug -= 1  # Um 1 vermindern
 
 
                # Formatierte Ausgabe des Datums, siehe https://www.w3schools.com/python/python_datetime.asp
                # \n heisst neue Zeile.
                csv += datum.strftime("%Y-%m-%d %H:%M:%S;"+os.path.splitext(file)[0]+"\n")  #Das Format soll so angepasst werden, damit die Tabellenkalkulation dann damit umgehen kann.
 
            # Ausgabe in Datei schreiben
        f = open("resultat_snapchat.csv", "w")
        f.write(csv)
        f.close()
snapchat_locations.py
import json
import re
import datetime
 
 
filename = "location_history.json"
with open(filename) as f:
    mydata = json.load(f)
 
#print(mydata.keys())
#toplevelkeys = ['Frequent Locations', 'Latest Location', 'Home & Work', 'Daily Top Locations', 'Top Locations Per Six-Day Period', 'Location History', 'Businesses and public places you may have visited', 'Areas you may have visited in the last two years']
 
# Kopfzeile der CSV-Datei
csv = ""
 
# Muster zum extrahieren der Koordinaten
geomuster = re.compile("([0-9.]+).*?, ([0-9.]+)")
 
# Muster der Zeitangabe
zeitformat = "%Y/%m/%d %H:%M:%S"
 
minlat = 100
maxlat = -100
minlon = 200
maxlon = -200
 
# Alle Anagaben in 'Location History' durchgehen und als CSV-Zeile anfügen
for location in mydata['Location History']:
    # Extrahieren der geographischen Koordinaten
    res = geomuster.search(location['Latitude, Longitude'])
    try:
        latitude = float(res.group(1))
        longitude = float(res.group(2))
        minlat = min([minlat, latitude])
        maxlat = max([maxlat, latitude])
        minlon = min([minlon, longitude])
        maxlon = max([maxlon, longitude])
        # Umwandlunmaxer Datum/Zeitangabe in internes Format
        dt = datetime.datetime.strptime(location['Time'], zeitformat)
        # Zeile in der CSV Datei
        csv += f"{dt},{latitude},{longitude}\n"
    except AttributeError:
        pass
 
 
# Noch einen Header mit den minimalen/maximalen Koordinaten ausgeben
csv = f"Time,Latitude,Longitude, \"minLong minLat maxLong maxLat\",{minlat},{minlon},{maxlat},{maxlon}\n"+csv
 
# CSV Datei schreiben
with open("location_history.csv","w") as f:
    f.write(csv)

Visualisierung mit Excel:

insta_deutsch.py
import re        # Regular Expressions
import datetime  # Datum/Zeit 
import os        # Files suchen
 
# Erklärungen zu diesem Code sind Analog dem Youtube-Extraktor.
 
rootdir = "C:/pfad/zum/entpackten/instagram/ordner/"
 
# Resultat, das am Schluss geschrieben werden soll
csv = ""   # Comma separated values
# Wie viele Kontrollausgaben?
debug = 10
 
# Alle HTML-Dateien im Verzeicznis anzeigen            
for root, dirs, files in os.walk(rootdir):
    for file in files:
        if file.endswith(".html"):
            filepath = os.path.join(root, file) 
            # Datei oeffnen
            f = open(filepath, "r")
            html = f.read()  # Alles einlesen
            f.close()        # Datei schliessen
 
 
            # Datum der Form 30.12.2021, 22:13 einlesen
            # Alle nötigen Angaben werden in Klammern "ge-captured"
            daten = re.findall("(\d{1,2}).(\d{1,2}).(\d{1,4}), (\d{1,2}):(\d{1,2})", html)
            if(debug>0):
                print(file,": ",len(daten))
                debug-=1
 
 
            # Alle Einträge durchgehen, d enthält jeweils den nächsten Eintrag
            for d in daten:
                # Einträge in Zahlen umwandeln
                # Monat plus die anderen Einträge (ohne AM/PM) in Zahlen umgewandelt 
                #   Die Zeichenkette "42" ist nicht das gleiche wie die Zahl 42.
 
                e = [int(x) for x in d]
                if debug>0:
                    # Ausgabe zur Kontrolle, sollte folgendes Format Produzieren
                    print(e) # [1, 6, 2021, 21, 23, 12]
                    debug -= 1  # Um 1 vermindern
 
                # Datum daraus generieren (macht die Datumsmanipulation einfacher).
                # Jahr, Monat, Tag, Stunde, Minute, Sekunde
                datum = datetime.datetime(e[2], e[1], e[0], e[3], e[4],0)
 
                if debug>0:
                    # Ausgabe zur Kontrolle, produziert folgendes Format
                    print(datum)   # 2021-01-06 21:23:12
                    debug -= 1  # Um 1 vermindern
 
 
                # Formatierte Ausgabe des Datums, siehe https://www.w3schools.com/python/python_datetime.asp
                # \n heisst neue Zeile.
                csv += datum.strftime("%Y-%m-%d %H:%M:%S;"+os.path.splitext(file)[0]+"\n")  #Das Format soll so angepasst werden, damit die Tabellenkalkulation dann damit umgehen kann.
 
            # Ausgabe in Datei schreiben
        f = open("resultat.csv", "w")
        f.write(csv)
        f.close()
insta_englisch.py
import re        # Regular Expressions
import datetime  # Datum/Zeit 
import os        # Files suchen
 
# Erklärungen zu diesem Code sind Analog dem Youtube-Extraktor.
 
rootdir = "C:/pfad/zum/entpackten/instagram/ordner/"
mnum = {"Jan":1, "Feb":2, "Mar":3, "Apr":4, "May":5, "Jun":6, "Jul":7, "Aug":8, "Sep":9, "Oct":10,"Nov":11, "Dec":12}; 
 
# Resultat, das am Schluss geschrieben werden soll
csv = ""   # Comma separated values
# Wie viele Kontrollausgaben?
debug = 10
 
# Alle HTML-Dateien im Verzeicznis anzeigen            
for root, dirs, files in os.walk(rootdir):
    for file in files:
        if file.endswith(".html"):
            filepath = os.path.join(root, file) 
            # Datei oeffnen
            f = open(filepath, "r")
            html = f.read()  # Alles einlesen
            f.close()        # Datei schliessen
 
 
            # Datum der Form 30.12.2021, 22:13 einlesen
            # Alle nötigen Angaben werden in Klammern "ge-captured"
            daten = re.findall("([A-Z][a-z][a-z]) (\d{1,2}), (\d{4}), (\d{1,2}):(\d{1,2}) ([AP]M)", html)
 
 
            if(debug>0):
                print(file,": ",len(daten))
                debug-=1
 
 
            # Alle Einträge durchgehen, d enthält jeweils den nächsten Eintrag
            for d in daten:
                # Einträge in Zahlen umwandeln
                # Monat plus die anderen Einträge (ohne AM/PM) in Zahlen umgewandelt 
                #   Die Zeichenkette "42" ist nicht das gleiche wie die Zahl 42.
 
                e = [mnum[d[0]]] + [int(x) for x in d[1:-1]]
                if d[5]=="PM":  # Nachmittag? Plus 12 Stunden (Ausser Mitternacht = 0)
                   e[3]=(e[3]+12) % 24
                if debug>0:
                    # Ausgabe zur Kontrolle, sollte folgendes Format Produzieren
                    print(e) # [1, 6, 2021, 21, 23, 12]
                    debug -= 1  # Um 1 vermindern
 
                # Datum daraus generieren (macht die Datumsmanipulation einfacher).
                # Jahr, Monat, Tag, Stunde, Minute, Sekunde
                datum = datetime.datetime(e[2], e[1], e[0], e[3], e[4],0)
 
                if debug>0:
                    # Ausgabe zur Kontrolle, produziert folgendes Format
                    print(datum)   # 2021-01-06 21:23:12
                    debug -= 1  # Um 1 vermindern
 
                # Wochentag (Mo=0, Di=1, ..., So=6)
                # Sämtliche Methoden für datetime-Objekte sind hier beschrieben: https://docs.python.org/3/library/datetime.html#datetime-objects
                wday = datum.weekday()
 
                # Formatierte Ausgabe des Datums, siehe https://www.w3schools.com/python/python_datetime.asp
                # \n heisst neue Zeile.
                csv += datum.strftime("%Y-%m-%d %H:%M:%S;"+os.path.splitext(file)[0]+"\n")  #Das Format soll so angepasst werden, damit die Tabellenkalkulation dann damit umgehen kann.
 
            # Ausgabe in Datei schreiben
        f = open("resultat.csv", "w")
        f.write(csv)
        f.close()
youtube-json.py
import sys,os,glob
import json
import datetime
 
# Diese Zeile anpassen (kann auch z.B. *.json sein)
defaultFilePattern = "watch-history.json"
 
 
# Sucht nach passenden Dateien
def searchForInputFiles():
    if len(sys.argv)==2:
        if os.path.exists(sys.argv[1]):
            if os.path.isfile(sys.argv[1]):
                return [sys.argv[1]]
            else:
                return glob.glob(sys.argv[1]+"/**/"+defaultFilePattern)
    return glob.glob("**/"+defaultFilePattern)
 
def showHelp():
    print("Als Parameter kann direkt eine Datei angeben werden.\nAlternativ kann auch ein Verzeichnis angegeben werden,\ndas dann rekursiv nach dem Must\n")
    print(defaultFilePattern)
    print("durchsucht wird.")
    print("Wird nichts angegben, wird vom aktuellen Verzeichnis aus gesucht.")
 
 
files = searchForInputFiles()
if len(files)==0:
    print("Keine Inputdateien gefunden\n")
    showHelp()
 
with open("output.csv", 'w') as output:
    for file in files:
        with open(file, "r") as f:
            data = json.load(f)
        for d in data:
            # Zeitangabe in Python datetime objekt umwandeln (Das Z kennt Python nicht)
            zeit = datetime.datetime.fromisoformat(d['time'].replace("Z", "+00:00"))
            # Folgende Zeile anpassen, falls Excel nicht mit diesem Datumsformat umgegehn kann
            output.write(zeit.strftime("%Y-%m-%d %H:%M:%S\n"))
youtube_englisch.py
import re        # Regular Expressions
import datetime  # Datum/Zeit 
 
# Erklärungen zu diesem Code gibt es auch als Video hier:
# https://web.microsoftstream.com/video/4c478e5b-609d-4429-bc20-78b9f8abab93
# und für Datensparsame und solche ohne BLDSG-Account auch hier:
# https://fginfo.ksbg.ch/~ivo/videos/informatik/vierte-klasse/daten-extraktion-youtube-watchtime-extraktion.mp4
 
# Daten einlesen
# Entweder vollständiger Pfad zur Datei oder (wie z.B. C:\Users\Hansli\Desktop\watch-history.html) oder
# nur Dateiname, wenn die Datei im gleichen Verzeichnis wie das Pythonprogramm liegt.
f = open("jan14-history.html", "r")
html = f.read()  # Alles einlesen
f.close()        # Datei schliessen
 
 
# Datum der Form Jan 6, 2021, 9:23:12 PM CET
# Alle nötigen Angaben werden in Klammern "ge-captured"
daten = re.findall(r"([A-Z][a-z][a-z]) (\d{1,2}), (\d{4}), (\d{1,2}):(\d{1,2}):(\d{1,2}) ([AP]M) CET", html)
 
#Erste 3 Einträge zur Kontrolle ausgeben
print(daten[0:3])
 
# Zuordnung der Monatsnamen zu Monatsnummern, z.B. ist mnum["Jul"] gleich 7
mnum = {"Jan":1, "Feb":2, "Mar":3, "Apr":4, "May":5, "Jun":6, "Jul":7, "Aug":8, "Sep":9, "Oct":10,"Nov":11, "Dec":12}; 
 
# Resultat, das am Schluss geschrieben werden soll
csv = ""   # Comma separated values
 
# Wie viele Kontrollausgaben?
debug = 10
 
# Alle Einträge durchgehen, d enthält jeweils den nächsten Eintrag
for d in daten:
    # Einträge in Zahlen umwandeln
    # Monat plus die anderen Einträge (ohne AM/PM) in Zahlen umgewandelt 
    #   Die Zeichenkette "42" ist nicht das gleiche wie die Zahl 42.
    e = [mnum[d[0]]] + [int(x) for x in d[1:-1]]
    if d[6]=="PM":  # Nachmittag? Plus 12 Stunden (Ausser Mitternacht = 0)
        e[3]=(e[3]+12) % 24
 
    if debug>0:
        # Ausgabe zur Kontrolle, sollte folgendes Format Produzieren
        print(e) # [1, 6, 2021, 21, 23, 12]
        debug -= 1  # Um 1 vermindern
 
    # Datum daraus generieren (macht die Datumsmanipulation einfacher).
    # Jahr, Monat, Tag, Stunde, Minute, Sekunde
    datum = datetime.datetime(e[2], e[0], e[1], e[3], e[4], e[5])
 
    if debug>0:
        # Ausgabe zur Kontrolle, produziert folgendes Format
        print(datum)   # 2021-01-06 21:23:12
        debug -= 1  # Um 1 vermindern
 
    # Wochentag (Mo=0, Di=1, ..., So=6)
    # Sämtliche Methoden für datetime-Objekte sind hier beschrieben: https://docs.python.org/3/library/datetime.html#datetime-objects
    wday = datum.weekday()
 
    # Formatierte Ausgabe des Datums, siehe https://www.w3schools.com/python/python_datetime.asp
    # \n heisst neue Zeile.
    csv += datum.strftime("%Y-%m-%d %H:%M:%S\n")  #Das Format soll so angepasst werden, damit die Tabellenkalkulation dann damit umgehen kann.
 
# Ausgabe in Datei schreiben
f = open("resultat.csv", "w")
f.write(csv)
f.close()
youtube_deutsch.py
import re        # Regular Expressions
import datetime  # Datum/Zeit 
 
# VERSION FUER DEUTSCHE EXPORTE, Datumsangabe in der Form 09.02.2012, 14:15:59 MEZ
 
# Erklärungen zu diesem Code gibt es auch als Video hier:
# https://web.microsoftstream.com/video/4c478e5b-609d-4429-bc20-78b9f8abab93
# und für Datensparsame und solche ohne BLDSG-Account auch hier:
# https://fginfo.ksbg.ch/~ivo/videos/informatik/vierte-klasse/daten-extraktion-youtube-watchtime-extraktion.mp4
 
# Daten einlesen
# Entweder vollständiger Pfad zur Datei oder (wie z.B. C:\Users\Hansli\Desktop\watch-history.html) oder
# nur Dateiname, wenn die Datei im gleichen Verzeichnis wie das Pythonprogramm liegt.
f = open("jan14-history.html", "r")
html = f.read()  # Alles einlesen
f.close()        # Datei schliessen
 
 
# Datum der Form Jan 6, 2021, 9:23:12 PM CET
# Alle nötigen Angaben werden in Klammern "ge-captured"
 
# Datum der Form 09.02.2012, 14:15:59 MESZ
daten = re.findall(r"(\d{2})\.(\d{2})\.(\d{4}), (\d{2}):(\d{2}):(\d{2}) MESZ", html)
 
 
#Erste 3 Einträge zur Kontrolle ausgeben
print(daten[0:3])
 
# Zuordnung der Monatsnamen zu Monatsnummern, z.B. ist mnum["Jul"] gleich 7
mnum = {"Jan":1, "Feb":2, "Mar":3, "Apr":4, "May":5, "Jun":6, "Jul":7, "Aug":8, "Sep":9, "Oct":10,"Nov":11, "Dec":12}; 
 
# Resultat, das am Schluss geschrieben werden soll
csv = ""   # Comma separated values
 
# Wie viele Kontrollausgaben?
debug = 10
 
# Alle Einträge durchgehen, d enthält jeweils den nächsten Eintrag
for d in daten:
    # Einträge in Zahlen umwandeln
    # Monat plus die anderen Einträge (ohne AM/PM) in Zahlen umgewandelt 
    #   Die Zeichenkette "42" ist nicht das gleiche wie die Zahl 42.
    e = [int(x) for x in d]
 
    if debug>0:
        # Ausgabe zur Kontrolle, sollte folgendes Format Produzieren
        print(e) # [1, 6, 2021, 21, 23, 12]
        debug -= 1  # Um 1 vermindern
 
    # Datum daraus generieren (macht die Datumsmanipulation einfacher).
    # Jahr, Monat, Tag, Stunde, Minute, Sekunde
    datum = datetime.datetime(e[2], e[1], e[0], e[3], e[4], e[5])
 
    if debug>0:
        # Ausgabe zur Kontrolle, produziert folgendes Format
        print(datum)   # 2021-01-06 21:23:12
        debug -= 1  # Um 1 vermindern
 
    # Wochentag (Mo=0, Di=1, ..., So=6)
    # Sämtliche Methoden für datetime-Objekte sind hier beschrieben: https://docs.python.org/3/library/datetime.html#datetime-objects
    wday = datum.weekday()
 
    # Formatierte Ausgabe des Datums, siehe https://www.w3schools.com/python/python_datetime.asp
    # \n heisst neue Zeile.
    csv += datum.strftime("%Y-%m-%d %H:%M:%S\n")  #Das Format soll so angepasst werden, damit die Tabellenkalkulation dann damit umgehen kann.
 
# Ausgabe in Datei schreiben
f = open("resultat.csv", "w")
f.write(csv)
f.close()
  • lehrkraefte/blc/informatik/glf4-24/analyse-scripts.txt
  • Last modified: 2024/03/18 18:42
  • by Ivo Blöchliger