jsonscraper

TikTok-Themen von Creators analysieren: ein praktischer Python-Workflow

So rufen Sie mit der TikTok Scraper API öffentliche Feeds ab, speichern die Rohantworten und erstellen eine wiederholbare Analyse von Beiträgen.

Redaktionsrichtlinie Fehler melden

Wenn ein Team ein Thema für die nächste Kampagne sucht, wird das manuelle Durchsehen Dutzender Profile schnell zu einer Sammlung von Notizen ohne einheitliche Methodik. Ein Analyst notiert Aufrufe, ein anderer Videobeschreibungen, und Beiträge mit ähnlichen Formulierungen landen in unterschiedlichen Tabellen. Eine Woche später ist schwer zu erkennen, was sich häufiger wiederholt: ein Thema, die Art der Präsentation oder einfach ein erfolgreiches Video.

Artikel: TikTok-Themen von Creators analysieren: ein praktischer Python-Workflow
Zusammenfassung: Wir zeigen, wie Sie öffentliche TikTok-Konten mit Python überwachen: Route und Parameter in Postman prüfen, API-Antworten speichern, bestätigte Felder normalisieren und Beiträge im Zeitverlauf vergleichen.
Bildrolle: Titelbild – die zentrale Idee
Abschnitt: 
Visuelles Motiv: Redaktionelle Illustration anonymisierter Kurzvideo-Kacheln neben Datenkarten mit Zeitstempeln und Themenlabels auf einem Forschungstisch
© jsonscraper · KI-generierte Illustration

Ein praktikabler Ansatz besteht darin, eine kleine Liste öffentlicher Konten zu führen, regelmäßig Informationen zu deren Videos in strukturierter Form abzurufen und jeden Abruf als separaten Snapshot zu speichern. Anschließend lassen sich Beiträge und verfügbare Kennzahlen im Zeitverlauf vergleichen; ein Sprachmodell kann zur vorläufigen Gruppierung der Beschreibungen dienen. Im Folgenden finden Sie den Aufbau eines solchen Forschungsworkflows mit Python und der TikTok Scraper API von jsonscraper.

Formulieren Sie vor der Datenerhebung Ihre Fragestellung

Stellen wir uns ein Marketingteam einer kleinen Marke für Sporternährung vor. Es möchte herausfinden, welche Themen bei ausgewählten öffentlichen TikTok-Creators regelmäßig auftauchen und welche Videos sich für eine manuelle Prüfung eignen. Ziel ist es, Beiträge vorab ausgewählter Konten über einen Beobachtungszeitraum hinweg zu vergleichen – nicht, eine universelle Rangliste der TikTok-Popularität zu erstellen.

Damit sind die Grenzen der Analyse festgelegt. Der Abruf der Feeds ausgewählter Profile hilft dabei, Inhalte und Veröffentlichungshäufigkeit dieser Konten zu untersuchen. Verfügbare öffentliche Zähler können zum Zeitpunkt der Anfrage festgehalten werden. Um die Wirkung der eigenen Werbung zu bewerten, sind zusätzliche Daten erforderlich, etwa Ausgaben und Conversions aus dem Werbesystem oder der Webanalyse.

Dokumentieren Sie vor der Anbindung der API das Forschungsprotokoll: Kontenliste, Startdatum, Erhebungsrhythmus, zu analysierende Felder und Kriterien für die Aufnahme von Beiträgen. Halten Sie den Zeitpunkt jeder Anfrage fest. So lassen sich Änderungen einer Kennzahl bei einem einzelnen Video von Unterschieden zwischen zwei Beobachtungssätzen unterscheiden.

Was Sie erfassen und berechnen sollten

Für ein kleines Projekt benötigen Sie drei Datenebenen. Die erste umfasst die Konto-ID und den Zeitpunkt des Erhebungslaufs. Die zweite ist die gespeicherte API-Rohantwort, die später überprüft werden kann. Die dritte besteht aus normalisierten Feldern für Abfragen und Berichte: Video-ID, Beschreibung, Veröffentlichungszeitpunkt und verfügbare Interaktionszähler.

Die Feldnamen und die Verschachtelung der Antwort müssen anhand eines Beispiels der konkreten Route ermittelt werden. Gehen Sie nicht vorab davon aus, dass die Liste immer videos oder der Aufrufzähler views heißt. Führen Sie zunächst die dokumentierte Anfrage aus und prüfen Sie das tatsächlich zurückgegebene JSON. Richten Sie anschließend die Umwandlung in Ihr eigenes Schema ein.

Nützliche Kennzahlen sind die Zahl neuer Beiträge innerhalb eines Zeitraums, die Verteilung der Beiträge auf Themen und die Veränderung öffentlicher Zähler zwischen Snapshots desselben Videos. Vergleichen Sie für Letzteres Einträge mit übereinstimmender Video-ID. So bleibt die Entwicklung eines bereits veröffentlichten Videos von den Kennzahlen neuer Beiträge getrennt.

Die TikTok Scraper API anbinden

In der Beschreibung der TikTok Scraper API ist die Basisadresse https://tiktok.evelode.com angegeben. Das Routenverzeichnis bestätigt GET /getUserFeed sowie die Parameter query, max_cursor, count, region, with_pinned_posts, sort_type und cache_timeout. Für die erste Anfrage genügt es, das Profil unter query anzugeben und beispielsweise die Anzahl der Elemente über count festzulegen. Der Schlüssel license_key wird in der Query-String übergeben; auch seine Konfiguration wird im API-Routenverzeichnis beschrieben. In der Postman-Sammlung können Sie den Endpoint abgleichen und die Antwort vor der Integration prüfen.

Speichern Sie den Schlüssel in einer Umgebungsvariable. Fügen Sie ihn weder in den Quellcode noch in ein Repository, eine Tabelle oder eine Clientanwendung ein. Führen Sie die Anfrage aus, speichern Sie ein erfolgreiches JSON-Beispiel mit Datum und Routenname und verwenden Sie es als Grundlage für den Normalisierungsadapter und Tests.

Eine minimale Python-Anfrage für die Praxis

Dem Routenverzeichnis zufolge enthält die Antwort des Nutzer-Feeds einen äußeren Status und ein Objekt tiktok, in dem sich die Beitragsliste unter aweme_list befindet. Die Einträge können IDs, Beschreibungen, Veröffentlichungszeitpunkte, Autor und Statistiken enthalten. Prüfen Sie die konkreten Felder und Werte anhand der erhaltenen Antwort, denn einzelne Daten können fehlen.

import json
import os
from datetime import datetime, timezone
from pathlib import Path

import requests

API_KEY = os.environ["JSONSCRAPER_TIKTOK_LICENSE_KEY"]
ENDPOINT_URL = "https://tiktok.evelode.com/getUserFeed"


def fetch_user_feed(handle: str, count: int = 20) -> dict:
    response = requests.get(
        ENDPOINT_URL,
        params={
            "license_key": API_KEY,
            "query": handle,
            "count": count,
            "region": "US",
        },
        timeout=45,
    )
    response.raise_for_status()
    payload = response.json()
    if not isinstance(payload, dict):
        raise ValueError("Ein JSON-Objekt wurde erwartet")
    if payload.get("status") != "ok":
        raise RuntimeError(f"API meldete Status: {payload.get('status')!r}")
    tiktok = payload.get("tiktok")
    if not isinstance(tiktok, dict):
        raise ValueError("Das Objekt tiktok fehlt in der Antwort")
    return payload


def save_raw(payload: dict, account: str, output_dir: str = "data/raw") -> Path:
    collected_at = datetime.now(timezone.utc).isoformat()
    safe_account = "".join(c for c in account if c.isalnum() or c in "-_@")
    path = Path(output_dir) / f"{safe_account}_{collected_at.replace(':', '-')}.json"
    path.parent.mkdir(parents=True, exist_ok=True)
    path.write_text(
        json.dumps(
            {"collected_at": collected_at, "account": account, "payload": payload},
            ensure_ascii=False,
            indent=2,
        ),
        encoding="utf-8",
    )
    return path


def normalize_items(payload: dict, account: str, collected_at: str) -> list:
    items = payload["tiktok"].get("aweme_list", [])
    if not isinstance(items, list):
        raise ValueError("Das Feld tiktok.aweme_list ist keine Liste")

    observations = []
    for item in items:
        if not isinstance(item, dict):
            continue
        stats = item.get("statistics")
        stats = stats if isinstance(stats, dict) else {}
        author = item.get("author")
        author = author if isinstance(author, dict) else {}
        observations.append({
            "account_handle": account,
            "collected_at": collected_at,
            "video_id": item.get("aweme_id"),
            "caption": item.get("desc"),
            "published_at_epoch": item.get("create_time"),
            "author_handle": author.get("unique_id"),
            "views": stats.get("play_count"),
            "likes": stats.get("digg_count"),
            "comments": stats.get("comment_count"),
            "shares": stats.get("share_count"),
        })
    return observations


if __name__ == "__main__":
    account = "creator_handle"
    payload = fetch_user_feed(account, count=20)
    collected_at = datetime.now(timezone.utc).isoformat()
    raw_path = save_raw(payload, account)
    observations = normalize_items(payload, account, collected_at)
    print(f"Gespeichert: {raw_path}; Einträge: {len(observations)}")

Legen Sie vor dem Start JSONSCRAPER_TIKTOK_LICENSE_KEY in der Umgebung fest und installieren Sie die Bibliothek requests. Der Code prüft die HTTP-Antwort, den äußeren Status und das Vorhandensein des Objekts tiktok und liest anschließend aweme_list aus. Er speichert das rohe JSON und extrahiert die im Routenverzeichnis bestätigten Felder; fehlende Werte bleiben leer. Der abgerufene Feed ist der vom API zurückgegebene Ergebnissatz. Daher sollte der Bericht mit dem Anfragezeitpunkt und dem ausgewählten Profil verknüpft sein.

Snapshots speichern und Beiträge vergleichen

Für ein kleines Projekt eignen sich SQLite oder PostgreSQL. Speichern Sie die Rohantwort getrennt von den normalisierten Einträgen. Für eine Tabelle mit Beobachtungen können Sie folgendes Schema verwenden:

CREATE TABLE IF NOT EXISTS video_observations (
    account_handle TEXT NOT NULL,
    video_id TEXT NOT NULL,
    collected_at TEXT NOT NULL,
    published_at_epoch INTEGER,
    caption TEXT,
    views INTEGER,
    likes INTEGER,
    comments INTEGER,
    shares INTEGER,
    raw_file TEXT,
    PRIMARY KEY (account_handle, video_id, collected_at)
);

Jeder Lauf fügt einen neuen Snapshot hinzu, statt den vorherigen zu überschreiben. Berechnen Sie beim Vergleich der Zähler die Differenz nur dann, wenn für dasselbe Video beide Werte vorliegen. Nehmen Sie den Abstand zwischen den Anfragen und den Beobachtungszeitpunkt in den Bericht auf: So wird ersichtlich, über welchen Zeitraum sich die Veränderung angesammelt hat.

Beginnen Sie für die thematische Gruppierung mit einem kleinen Kategorienwörterbuch und ergänzen Sie bei Bedarf einen Klassifikator oder ein Sprachmodell. Übermitteln Sie dem Modell bereinigte Beschreibungen, Beitrags-IDs und vorab festgelegte Kategorien. Ein strukturiertes Ergebnis mit Kategorie und kurzer Begründung lässt sich leichter zwischen Läufen vergleichen als eine freie Zusammenfassung.

Ein Sprachmodell mit überprüfbarer Kennzeichnung ergänzen

Ein Modell kann Beschreibungen zunächst Themen wie „Rezepte“, „Training“, „Produktbewertungen“ und „persönliche Geschichten“ zuordnen. Kennzeichnen Sie zunächst manuell einige Dutzend Beiträge. Vergleichen Sie die automatischen Labels mit diesen Beispielen, präzisieren Sie die Kategoriedefinitionen und wiederholen Sie die Bewertung, nachdem Sie den Prompt oder das Modell geändert haben.

Die Zahl neuer Beiträge, den Median der Zähler und die Differenz zwischen Snapshots berechnen Sie zuverlässiger mit gewöhnlichem Code. Verwenden Sie das Modell zur Textklassifizierung und für kurze Erläuterungen. Die ursprünglichen Beschreibungen und numerischen Beobachtungen sollten zur Überprüfung verfügbar bleiben.

Speichern Sie zusammen mit dem Label die Beitrags-ID, die Prompt-Version, das Bearbeitungsdatum und das verwendete Modell. Bei einer fehlerhaften Klassifizierung kann ein Analyst die Beschreibung finden und die Regel korrigieren. Es ist sinnvoll, das ursprüngliche Label und manuelle Korrekturen getrennt aufzubewahren.

Den Ablauf automatisieren

Nachdem der manuelle Testlauf geprüft wurde, verlagern Sie das Skript nach cron, GitHub Actions, n8n oder Make. Der Scheduler startet die Erhebung nach Plan, übergibt die Kontenliste, protokolliert das Ergebnis und leitet den Bericht an den gewählten Speicherort weiter. Bewahren Sie den Schlüssel in den Secrets der Laufzeitumgebung auf. Testen Sie den Prozess zunächst mit einem Konto und erweitern Sie die Liste anschließend.

Teilen Sie die Automatisierung in einzelne Schritte auf: Kontenwarteschlange, API-Aufruf, Speicherung der Rohantwort, Normalisierung, Speicherung des Snapshots und Erstellung des Berichts. Ein Fehler bei einem Konto darf die Ergebnisse der übrigen Konten nicht löschen. Mit einer Lauf-ID und Eindeutigkeitsbedingungen in der Datenbank lässt sich ein erneuter Lauf idempotent gestalten.

Protokollieren Sie Zeitpunkt, Konto, Route, HTTP-Status, Laufzeit, Zahl der verarbeiteten Elemente und Fehlerbeschreibung. Schreiben Sie den API-Schlüssel nicht ins Protokoll. Der Parameter cache_timeout ist für /getUserFeed aufgeführt und kann der Anfrage hinzugefügt werden, wenn eine bestimmte Cache-Dauer gewünscht ist. Im API-Routenverzeichnis wird der Standardwert mit 3600 Sekunden angegeben.

Die Qualität prüfen, bevor Sie den Bericht veröffentlichen

Vergleichen Sie mehrere normalisierte Einträge mit dem Roh-JSON. Prüfen Sie, ob ein erneuter Abruf dasselbe Video anhand der ID erkennt, Datumsangaben wie erwartet verarbeitet werden, Zahlenfelder den passenden Typ haben und der Anteil fehlender Werte bekannt ist. Führen Sie anschließend einen weiteren Lauf durch und vergewissern Sie sich, dass die Datenbank ältere Beobachtungen erhalten und neue hinzugefügt hat.

Vermischen Sie keine Konten und Erhebungszeiträume. Verwenden Sie für Themenvergleiche Zeiträume gleicher Länge oder weisen Sie im Bericht ausdrücklich darauf hin. Halten Sie für die Entwicklung der Zähler den Abstand zwischen den Snapshots fest, damit die Lesenden den Umfang der verglichenen Intervalle verstehen.

Bewahren Sie den ursprünglichen Beschreibungstext auf und erstellen Sie eine bereinigte Version separat. Emojis, Hashtags, Links und sprachliche Besonderheiten können die Klassifizierung beeinflussen. Getrennte Felder helfen dabei, den Einfluss der Bereinigung zu prüfen und Kategorien ohne erneuten API-Aufruf neu zu berechnen.

Welche Ergebnisse der Workflow liefert

Nach mehreren Durchläufen verfügt das Team über eine Tabelle mit Beiträgen und Snapshots, eine vorläufige thematische Gruppierung der Beschreibungen und einen Bericht über neue Videos im ausgewählten Zeitraum. Damit lassen sich Videos für eine fachliche Prüfung auswählen, wiederkehrende Themen bei den ausgewählten Konten erkennen und Änderungen öffentlicher Zähler zwischen Beobachtungszeitpunkten prüfen.

Auf Grundlage dieser Daten lassen sich Hypothesen für einen Redaktionskalender formulieren: etwa verschiedene Darstellungsweisen derselben Frage vergleichen oder Themen für Tests mit eigenen Inhalten auswählen. Um den kommerziellen Effekt zu bewerten, gleichen Sie die Beobachtungen mit internen Kampagnendaten ab.

Wählen Sie zum Einstieg eine kleine Liste öffentlicher Konten aus und prüfen Sie GET /getUserFeed in der Postman-Anfragensammlung. Übernehmen Sie in den Code nur Parameter und Feldpfade, die durch die Routendokumentation und die tatsächliche Antwort bestätigt sind.

Verantwortungsvolle Erhebung öffentlicher Daten

Begrenzen Sie die Kontenliste auf den Forschungszweck, erheben Sie nur benötigte Felder und legen Sie eine Aufbewahrungsfrist für die Rohantwort fest. Prüfen Sie vor einer kommerziellen Nutzung der Daten die anwendbaren Plattformbedingungen und die Anforderungen an personenbezogene Daten in Ihrer Rechtsordnung. Zugriffskontrollen und das Löschen veralteter Snapshots helfen, den Prozess auf die Aufgabe zu beschränken.

Entfernen Sie vor dem Übermitteln von Daten an einen KI-Dienst Felder, die das Modell nicht benötigt. Geben Sie im Bericht die Beitrags-ID und das Beobachtungsdatum an, damit Mitarbeitende den Eintrag aufrufen und die Grundlage der Schlussfolgerung prüfen können.

Kurze Checkliste für den Start

  1. Legen Sie die Nische, die Kontenliste, den Zeitraum und die Analysefragen fest.
  2. Prüfen Sie die Parameter von GET /getUserFeed im Routenverzeichnis und die tatsächliche Antwort in Postman.
  3. Speichern Sie ein JSON-Beispiel und richten Sie den Normalisierer auf die bestätigten Felder aus.
  4. Speichern Sie die Rohantwort und separate Snapshots samt Erhebungszeitpunkt.
  5. Berechnen Sie numerische Kennzahlen mit Code und verwenden Sie KI zur vorläufigen Gruppierung von Text.
  6. Ergänzen Sie Zeitplanung, Protokollierung, Wiederholungsbehandlung und eine Aufbewahrungsfrist.

So wird das Monitoring zu einer reproduzierbaren Untersuchung: Jede Schlussfolgerung ist mit einem Beitrag und einem Beobachtungszeitpunkt verknüpft, und der Code basiert auf dem tatsächlichen Schema der gewählten Route.

People

No people listed for this article yet.

Keep readingTikTok-Suchergebnisse mit Python archivieren
Read the next article

Vom Artikel zur funktionierenden Integration

Entdecke die Social-Data-APIs von jsonscraper, teste Anfragen und entwickle deinen nächsten Workflow.

APIs entdecken