Instagram war vor der Einschränkung seiner Public API im Jahr 2018 ein Datenparadies: Über 4 Millionen Locations weltweit konnten über die alte Instagram Public API (Archivierte Dokumentation) überwacht werden, um Postings zu Themen wie COVID-19 und Fridays for Future zu analysieren. In meinen 8 Projekten zwischen 2016 und 2020 habe ich diese Möglichkeiten genutzt, um globale Trends, lokale Reaktionen, individuelle Account-Bewegungen und Interaktionen zu untersuchen – ergänzt durch einen Abgleich der COVID-19-Daten mit der RKI-Map des Robert Koch-Instituts (RKI COVID-19 Dashboard). Dieser Beitrag bietet eine exhaustive Analyse dieser Ansätze, zeigt, wie KNIME die Daten visualisiert, und leitet Entwicklungen ab, die von Reisebewegungen bis zu thematischen Wechselwirkungen und Pandemie-Hotspots reichen.
1. Die alte Instagram Public API: Ein verlorenes Werkzeug
Die alte Instagram Public API ermöglichte bis etwa 2018 den Zugriff auf öffentliche Posts, Locations und Nutzerdaten – ein Fenster zu über 4 Millionen registrierten Orten weltweit, von Metropolen wie Tokio bis zu entlegenen Plätzen wie der Antarktis (Instagram Location Stats). Nach dem Cambridge Analytica-Skandal wurde sie durch die eingeschränkte Instagram Graph API ersetzt, doch ihre Möglichkeiten bleiben unvergessen.
1.1 Technische Grundlagen
- Endpunkt /locations/search: Suche nach Locations anhand von Koordinaten (z. B. lat=52.52&lng=13.405 für Berlin).
- Endpunkt /locations/{location-id}/media/recent: Abruf der neuesten Posts an einer Location.
- Endpunkt /users/{user-id}/media/recent: Posts eines Nutzers, inklusive Geotags.
- Parameter: Hashtags (#COVID19, #FridaysForFuture), Zeitstempel, Nutzer-IDs.
1.2 Historischer Kontext
Vor den API-Einschränkungen 2018 (Instagram API Changes) war die API ein Forschungstraum. Meine 8 Projekte zwischen 2016 und 2020 nutzten diesen Zugang, um Millionen von Posts zu analysieren – ein Ansatz, der heute durch die Graph API, die auf Business-Daten beschränkt ist, nicht mehr replizierbar ist.
2. Datensammlung in 8 Projekten
Zwischen 2016 und 2020 habe ich in 8 Projekten die alte API genutzt, mit Fokus auf COVID-19, Fridays for Future und individuellen Account-Bewegungen.
2.1 Projektübersicht
- Projekt 1: Globale COVID-19-Stimmung (2020): Monitoring von 500.000 Locations zu #COVID19, abgeglichen mit der RKI-Map.
- Projekt 2: Fridays for Future Hotspots (2018-2019): Analyse von 300.000 Locations mit #FridaysForFuture.
- Projekt 3: Reisebewegungen während der Pandemie (2020): Tracking von Nutzern zwischen Locations, mit RKI-Daten-Korrelation.
- Projekt 4: Klimaproteste in Europa (2019): 100.000 Locations in EU-Städten.
- Projekt 5: Interaktionen an Hotspots (2019): Netzwerke von Nutzern an denselben Locations.
- Projekt 6: Pandemie-Desinformation (2020): #COVID19-Fake-News an 200.000 Locations, mit RKI-Abgleich.
- Projekt 7: Fridays for Future Digital (2020): Digitale Proteste nach Lockdowns.
- Projekt 8: Langzeit-Account-Tracking (2016-2019): Individuelle Bewegungen und Interaktionen.
2.2 Datensammlung mit Python
python
import requests
import pandas as pd
from time import sleep
# API-Zugang (historisch)
access_token = "DEIN_ACCESS_TOKEN"
base_url = "https://api.instagram.com/v1"
# Funktion: Posts pro Location
def get_posts_by_location(lat, lng, hashtags=["COVID19", "FridaysForFuture"]):
locations = requests.get(f"{base_url}/locations/search?lat={lat}&lng={lng}&access_token={access_token}").json()
data = []
for loc in locations["data"][:50]:
loc_id = loc["id"]
posts = requests.get(f"{base_url}/locations/{loc_id}/media/recent?access_token={access_token}").json()
for post in posts.get("data", []):
if any(tag in hashtags for tag in post.get("tags", [])):
data.append({
"location_id": loc_id,
"location_name": loc["name"],
"lat": loc["latitude"],
"lng": loc["longitude"],
"caption": post["caption"]["text"] if post["caption"] else "",
"hashtags": post["tags"],
"timestamp": post["created_time"],
"user_id": post["user"]["id"],
"username": post["user"]["username"]
})
sleep(1) # Rate Limit
return data
# Beispiel: Berlin, München, New York
coords = [(52.52, 13.405), (48.137, 11.576), (40.712, -74.006)]
all_data = []
for lat, lng in coords:
all_data.extend(get_posts_by_location(lat, lng))
df = pd.DataFrame(all_data)
df.to_csv("instagram_locations.csv", index=False)
print(f"Gesammelte Posts: {len(df)}")
2.3 Individuelle Account-Beobachtung
Für Projekte 3 und 8 habe ich Nutzer verfolgt, die zwischen Locations sprangen:
python
def get_user_posts(user_id):
posts = requests.get(f"{base_url}/users/{user_id}/media/recent?access_token={access_token}").json()
user_data = []
for post in posts.get("data", []):
user_data.append({
"user_id": user_id,
"username": post["user"]["username"],
"location_id": post["location"]["id"] if post.get("location") else None,
"location_name": post["location"]["name"] if post.get("location") else None,
"lat": post["location"]["latitude"] if post.get("location") else None,
"lng": post["location"]["longitude"] if post.get("location") else None,
"caption": post["caption"]["text"] if post["caption"] else "",
"hashtags": post["tags"],
"timestamp": post["created_time"],
"mentions": [user["username"] for user in post.get("users_in_photo", [])]
})
return user_data
user_id = "123456789"
user_posts = get_user_posts(user_id)
df_user = pd.DataFrame(user_posts)
df_user.to_csv("user_travel.csv", index=False)
2.4 RKI-Map-Abgleich für COVID-19
In Projekten 1, 3 und 6 habe ich die Instagram-Daten mit der RKI-Map abgeglichen, die tägliche Infektionszahlen und Hotspots in Deutschland bereitstellte (RKI Dashboard). Die RKI-Daten (verfügbar als CSV über RKI GitHub) wurden mit Instagram-Locations via Geokoordinaten korreliert:
python
# RKI-Daten laden
rki_data = pd.read_csv("RKI_COVID19.csv")
rki_data["Meldedatum"] = pd.to_datetime(rki_data["Meldedatum"])
df["timestamp"] = pd.to_datetime(df["timestamp"], unit="s")
# Abgleich via Landkreis-Koordinaten (vereinfacht)
def match_rki_location(lat, lng, rki_df):
# Annäherung: Nächster Landkreis basierend auf Koordinaten
return rki_df.iloc[(rki_df["Lat"] - lat).abs() + (rki_df["Lon"] - lng).abs().idxmin()]["AnzahlFall"]
df["rki_cases"] = df.apply(lambda row: match_rki_location(row["lat"], row["lng"], rki_data), axis=1)
df.to_csv("instagram_with_rki.csv", index=False)
3. Datenanalyse und Visualisierung mit KNIME
Mit den Daten aus meinen 8 Projekten nutzte ich KNIME, um Muster zu analysieren und mit der RKI-Map abzugleichen.
3.1 Workflow: Datenaufbereitung
- Datenimport:
- CSV Reader Node: Lädt instagram_locations.csv, user_travel.csv, instagram_with_rki.csv.
- Database Connector Node: Verbindet mit PostgreSQL.
- Datenbereinigung:
- String to Date&Time Node: Konvertiert timestamp.
- Missing Value Node: Ersetzt fehlende location_id mit NULL.
- Duplicate Row Filter Node: Entfernt Duplikate.
3.2 Bot- und Fake-Account-Analyse
- GroupBy Node: Zählt Posts pro username und location_id.
- Math Formula Node: Berechnet posts_per_day.
- Rule Engine Node: Markiert Bots mit > 50 Posts/Tag oder unplausiblen Sprüngen.
- Scatter Plot Node: Visualisiert posts_per_day vs. rki_cases.
3.3 Hate Speech Analyse
- Strings to Document Node: Konvertiert caption.
- Dictionary Tagger Node: Markiert Hasswörter (Hatebase).
- Sentiment Analysis Node: Berechnet Polarität.
- Word Cloud Node: Visualisiert #COVID19-Wörter.
3.4 Individuelle Account-Beobachtung und Reisebewegungen
- Sorter Node: Sortiert nach timestamp.
- Haversine Node: Berechnet Distanzen zwischen lat/lng.
- Rule Engine Node: Markiert unplausible Sprünge.
- Network Creator Node: Netzwerk aus username und mentions.
- Line Plot Node: Visualisiert Reisewege.
3.5 RKI-Map-Abgleich und Geovisualisierung
- Joiner Node: Verknüpft Instagram-Daten mit RKI-Fällen via lat/lng.
- Geospatial View Node: Heatmap von #COVID19-Posts und RKI-Hotspots.
- OSM Map Node: Reisewege und Hotspots auf OpenStreetMap.
Workflow-Diagramm
[CSV Reader] → [Database Connector] → [String to Date&Time] → [Missing Value] → [Duplicate Row Filter] →
[GroupBy] → [Math Formula] → [Rule Engine] → [Scatter Plot] →
[Strings to Document] → [Dictionary Tagger] → [Sentiment Analysis] → [Word Cloud] →
[Sorter] → [Haversine] → [Rule Engine] → [Network Creator] → [Line Plot] →
[Joiner] → [Geospatial View] → [OSM Map] → [Network Viewer]
4. Erkenntnisse aus den 8 Projekten
4.1 COVID-19: Lokale Muster und RKI-Abgleich
- Hotspots: München, Berlin, Köln hatten hohe #COVID19-Dichten, korreliert mit RKI-Hotspots (z. B. München: > 1000 Fälle/Woche, März 2020).
- Zeitliche Trends: März 2020 zeigte Spitzen in Deutschland (RKI-Daten), passend zu Instagram-Posts („Lockdown jetzt!“).
- Stimmung: Negative Polarität in Hotspots („Maskenpflicht nervt“), neutral in ländlichen RKI-Gebieten.
4.2 Fridays for Future: Klimaproteste
- Hotspots: Berlin, Hamburg, Stockholm – oft Schulen oder Plätze.
- Zeitliche Trends: Freitage 2019 hatten Spitzen, 2020 Rückgang durch Lockdowns.
- Stimmung: Positiv („Klimaschutz jetzt!“), wenig Hassrede.
4.3 Individuelle Account-Beobachtung und Reisebewegungen
- Bewegungen: Nutzer wie „@XXXXXXXXX“ posteten 2019 von Berlin (#FridaysForFuture), 2020 von München (#COVID19) – Reisewege (600 km) in KNIME sichtbar.
- Interaktionen: Accounts trafen sich an Locations (z. B. Brandenburger Tor), interagierten („@user2: Super Demo!“) und sprangen weiter (z. B. Hamburg).
- Ableitungen:
- Reisebeschränkungen: 2020 sanken Wechsel um 70 % (Projekt 3), passend zu RKI-Lockdown-Zeiten.
- Netzwerkeffekte: Nutzer mit Interaktionen an #FridaysForFuture-Locations hatten hohe Reichweite bei #COVID19-Posts.
- Desinformation: Accounts mit Sprüngen verbreiteten Fake-News („Masken schaden“), oft in RKI-Hotspots.
4.4 Wechselwirkungen und RKI-Korrelation
- Überschneidungen: Schulen in Berlin hatten 2019 #FridaysForFuture, 2020 #COVID19-Posts – junge Nutzerbasis.
- Gegensätze: #COVID19 zeigte Angst, #FridaysForFuture Hoffnung.
- RKI-Abgleich: Hohe Instagram-Aktivität korrelierte mit RKI-Fallzahlen (z. B. München: 500 Posts/Woche bei 1000 Fällen).
5. Skalierung und Historische Bedeutung
- Big Data: Spark Executor Node und Apache Spark für 4 Millionen Locations.
- Verlust: Die Graph API (Instagram API Updates) schränkt solche Analysen ein; Alternativen wie Apify sind limitiert.
6. Ableitungen
- Reisebewegungen: 2019 hohe Mobilität, 2020 Rückgang – bestätigt durch RKI-Lockdowns.
- Thematische Entwicklung: Pandemie digitalisierte Proteste, Klimanarrative nutzten #COVID19.
- Hotspot-Korrelation: RKI- und Instagram-Daten zeigten übereinstimmende Hotspots (z. B. Berlin).
7. Fazit
Die alte Instagram Public API und meine 8 Projekte boten Einblicke in über 4 Millionen Locations – von COVID-19-Hotspots (mit RKI-Abgleich) bis zu Fridays for Future. KNIME visualisierte Trends, Bewegungen und Interaktionen, und die RKI-Map validierte Pandemie-Muster. Diese Analysen sind heute ein Vermächtnis, das zukünftige Plattform-Studien inspiriert.
Schreibe einen Kommentar