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

  1. Projekt 1: Globale COVID-19-Stimmung (2020): Monitoring von 500.000 Locations zu #COVID19, abgeglichen mit der RKI-Map.
  2. Projekt 2: Fridays for Future Hotspots (2018-2019): Analyse von 300.000 Locations mit #FridaysForFuture.
  3. Projekt 3: Reisebewegungen während der Pandemie (2020): Tracking von Nutzern zwischen Locations, mit RKI-Daten-Korrelation.
  4. Projekt 4: Klimaproteste in Europa (2019): 100.000 Locations in EU-Städten.
  5. Projekt 5: Interaktionen an Hotspots (2019): Netzwerke von Nutzern an denselben Locations.
  6. Projekt 6: Pandemie-Desinformation (2020): #COVID19-Fake-News an 200.000 Locations, mit RKI-Abgleich.
  7. Projekt 7: Fridays for Future Digital (2020): Digitale Proteste nach Lockdowns.
  8. 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

  1. Datenimport:
  2. Datenbereinigung:

3.2 Bot- und Fake-Account-Analyse

3.3 Hate Speech Analyse

3.4 Individuelle Account-Beobachtung und Reisebewegungen

3.5 RKI-Map-Abgleich und Geovisualisierung

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

6. Ableitungen

  1. Reisebewegungen: 2019 hohe Mobilität, 2020 Rückgang – bestätigt durch RKI-Lockdowns.
  2. Thematische Entwicklung: Pandemie digitalisierte Proteste, Klimanarrative nutzten #COVID19.
  3. 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

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert