===== Analyse-Scripts ===== Folgende Scripts konvertieren die Social-Media-Daten in eine .csv-Datei. ==== Spotify ==== 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 ==== 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 Datum-Zeit Angaben ==== 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 Location Data ==== 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: * https://data.solita.fi/visualizing-location-data-by-time-excel-3d-map/ * https://jmw-geo.com/showing-geographic-data-with-spreadsheet-software/ * https://www.youtube.com/watch?v=f2bZ7EkIcpU * https://locationhistoryvisualizer.com/heatmap/ ==== Instagram Deutsch ==== 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() ==== Instagram Englisch ==== 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-Export ==== 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 (HTML-Export)==== 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 (HTML-Export) ==== 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()