jsonscraper

TikTok-Kreative von Wettbewerbern anhand öffentlicher Kennzahlen vergleichen: eine Python-Pipeline

Ergebnisse aus mehreren Suchanfragen zusammenführen, Duplikate entfernen und Videos anhand von Aufrufen, Likes und Kommentaren vergleichen

Redaktionsrichtlinie Fehler melden

Zwei Teams veröffentlichen Videos zu ähnlichen Produkten, bewerten sie aber manuell nach unterschiedlichen Kriterien: Das eine merkt sich die Aufrufzahlen, das andere die Kommentare und ein drittes speichert Links im Chat. Eine Woche später ist kaum noch nachvollziehbar, welche Formate bei Wettbewerbern wiederkehren, welche Beiträge auffällige Reaktionen erzielen und was sich seit der letzten Sichtung verändert hat.

Die Lösung besteht darin, eine begrenzte und reproduzierbare Auswahl öffentlicher Videos anhand vorab festgelegter Schlüsselwörter zu erfassen, das ursprüngliche JSON zu speichern und eine Tabelle mit einheitlichen Feldern zu erstellen. So lassen sich Videos in einem gemeinsamen Arbeitsablauf vergleichen, statt zufällige Beobachtungen mit Schlussfolgerungen über den Markt zu vermischen. Im Folgenden finden Sie einen Ansatz für ein kleines Wettbewerbsmonitoring mit Python und der TikTok Scraper API von jsonscraper.

Legen Sie zuerst die Analysefrage fest

Die Datenerfassung ist dann nützlich, wenn bereits feststeht, welche Entscheidung auf Grundlage der Ergebnisse getroffen werden soll. Ein Marketingteam eines Sportflaschenherstellers möchte beispielsweise verstehen, wie Wettbewerber das Produkt in kurzen Videos präsentieren: durch eine Vorführung, ein Unboxing, einen Vergleich oder die Reaktion eines Nutzers. Dafür muss nicht ganz TikTok kopiert werden. Benötigt werden einige gezielte Suchanfragen und eine wiederholbare Beobachtung der Videos, die die API für diese Anfragen zurückgibt.

Formulieren Sie die Frage so, dass sie überprüfbar ist: „Welche Beschreibungs- und Demonstrationsformate finden sich unter den veröffentlichten Videos zu unseren fünf Suchbegriffen, und welche der gefundenen Videos weisen derzeit die höchsten Aufruf- und Reaktionszahlen auf?“ Diese Formulierung trennt zwei Analyseebenen. Text und Beschreibung helfen dabei, kreative Ansätze zu gruppieren; die Zähler für Aufrufe, Likes, Kommentare und geteilte Inhalte bilden eine Momentaufnahme der öffentlichen Reaktionen zum Erfassungszeitpunkt.

Diese Momentaufnahme eignet sich dazu, die manuelle Sichtung zu priorisieren und Veränderungen zu verfolgen. Sie beschreibt die Videos, die für bestimmte Suchanfragen, Parameter und einen bestimmten Ausführungszeitpunkt zurückgegeben wurden. Eine korrekte Schlussfolgerung lautet daher etwa: „In unserer Stichprobe kommen Unboxing-Videos häufig vor“ oder „Diese Videogruppe weist derzeit einen höheren Median bei den Aufrufen auf.“ Ein solcher Analyseumfang hilft dem Team, Hypothesen für eigene Inhalte auszuwählen.

Entwerfen Sie eine kompakte Datenpipeline

Teilen Sie die Arbeit in vier Schritte auf: Erfassung, Speicherung der Rohantwort, Normalisierung und Analyse. Bei der Erfassung werden für jedes freigegebene Schlüsselwort API-Anfragen gestellt. Die Rohantwort wird vollständig gespeichert, damit die extrahierten Werte später überprüft werden können. Die Normalisierung überführt die verschachtelte JSON-Struktur in Tabellenzeilen; die Analyse berechnet Kennzahlen und gruppiert Videos nach Schlüsselwörtern oder manuell zugewiesenen Formaten.

  • Erfassung. Fordern Sie für jedes Schlüsselwort dieselbe Ergebnisanzahl mit identischer Region und Sortierung an.
  • Archiv. Speichern Sie das ursprüngliche JSON und den Erfassungszeitpunkt, damit sich die extrahierten Werte überprüfen lassen.
  • Normalisierung. Übernehmen Sie die Video-ID, den Link, die Beschreibung, den Autor, den Veröffentlichungszeitpunkt und die verfügbaren Zähler.
  • Qualitätskontrolle. Entfernen Sie Duplikate anhand der ID, kennzeichnen Sie fehlende Werte und speichern Sie das Schlüsselwort, über das das Video gefunden wurde.
  • Vergleich. Berechnen Sie eigene Kennzahlen ausschließlich aus verfügbaren Ausgangsfeldern und vergleichen Sie Gruppen innerhalb derselben Momentaufnahme.

Dieser Ansatz ist einer Linkliste überlegen, weil die Herkunft jeder Zeile erhalten bleibt und sich das wiederholte Auftauchen desselben Videos von neuem Material unterscheiden lässt. Speichern Sie auch das Erfassungsdatum: Öffentliche Zähler können sich ändern, daher darf ein Wert aus der heutigen Antwort nicht als dauerhafte Eigenschaft eines Videos behandelt werden.

Was die TikTok Scraper API unterstützt

Für die Videosuche anhand einer Textanfrage beschreibt die Dokumentation von jsonscraper die GET-Route /searchVideo unter der Basisadresse https://tiktok.evelode.com. Der erforderliche Parameter ist keyword; außerdem stehen count, cursor, region, date_posted, sort_by und cache_timeout zur Verfügung. Als Sortieroptionen sind most-liked, relevance und date-posted aufgeführt, als Veröffentlichungszeiträume unter anderem yesterday, this-week, this-month, last-3-months, last-6-months und all-time. Vergleichen Sie Parameternamen und Bedeutungen mit dem Referenzhandbuch der TikTok-Routen.

Der Schlüssel wird im Query-Parameter license_key übergeben. Legen Sie ihn für ein Skript im Betrieb in der Umgebungsvariable JSONSCRAPER_TIKTOK_LICENSE_KEY ab, nicht in einer Quelldatei, Tabelle oder einem Ausführungsprotokoll. Prüfen Sie in der Antwort den obersten Wert status und verarbeiten Sie anschließend das Objekt tiktok. Bei einer Suche kann die Struktur eine Liste aweme_list sowie search_item_list enthalten, in der die Videoinformationen unter aweme_info liegen. Der folgende Code unterstützt beide Formen.

In bestätigten Beobachtungen von Suchantworten finden sich Video-ID, Beschreibung, Veröffentlichungszeitpunkt, Link, Autorenangaben und Kennzahlen wie Aufrufe, Likes, Kommentare, gespeicherte Inhalte und geteilte Inhalte. Einzelne Felder können in einem konkreten Datensatz fehlen. Lassen Sie solche Werte in der Tabelle leer, statt sie durch null zu ersetzen: Null bedeutet einen gemessenen Wert, ein leeres Feld dagegen, dass im erhaltenen Objekt kein Wert vorhanden war.

Ein minimales Python-Beispiel

Das folgende Skript stellt für jedes Schlüsselwort eine Anfrage, speichert die vollständige Antwort in einer JSON-Datei und erstellt eine CSV-Datei für Tabellenkalkulationen oder die weitere Verarbeitung. Es ist für Python 3.8+ ausgelegt und nutzt ausschließlich die Standardbibliothek. Richten Sie vor dem Start die Umgebungsvariable mit dem Lizenzschlüssel ein. Passen Sie die Liste der Schlüsselwörter und die Ergebnisanzahl an Ihren Anwendungsfall an.

import csv
import json
import os
import time
from datetime import datetime, timezone
from pathlib import Path
from urllib.parse import urlencode
from urllib.request import urlopen

BASE_URL = "https://tiktok.evelode.com/searchVideo"
LICENSE_KEY = os.environ["JSONSCRAPER_TIKTOK_LICENSE_KEY"]
KEYWORDS = ["Thermoflasche", "Sportflasche", "Flasche Unboxing"]
REGION = "US"
COUNT = 20


def request_search(keyword):
    params = {
        "license_key": LICENSE_KEY,
        "keyword": keyword,
        "count": COUNT,
        "region": REGION,
        "sort_by": "relevance",
        "date_posted": "this-month",
    }
    url = BASE_URL + "?" + urlencode(params)
    with urlopen(url, timeout=60) as response:
        return json.loads(response.read().decode("utf-8"))


def extract_videos(payload):
    if payload.get("status") != "ok":
        raise RuntimeError("API returned a non-ok status")

    tiktok = payload.get("tiktok") or {}
    rows = []

    for item in tiktok.get("aweme_list") or []:
        if isinstance(item, dict):
            rows.append(item)

    for item in tiktok.get("search_item_list") or []:
        video = item.get("aweme_info") if isinstance(item, dict) else None
        if isinstance(video, dict):
            rows.append(video)

    return rows, tiktok


Path("raw").mkdir(exist_ok=True)
seen = set()
records = []

for keyword in KEYWORDS:
    payload = request_search(keyword)
    collected_at = datetime.now(timezone.utc).isoformat()
    safe_name = keyword.replace(" ", "_")
    raw_path = Path("raw") / (safe_name + ".json")
    raw_path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")

    videos, tiktok = extract_videos(payload)
    for video in videos:
        video_id = video.get("aweme_id")
        if not video_id:
            continue
        dedupe_key = (keyword, video_id)
        if dedupe_key in seen:
            continue
        seen.add(dedupe_key)

        stats = video.get("statistics") or {}
        author = video.get("author") or {}
        records.append({
            "collected_at": collected_at,
            "keyword": keyword,
            "video_id": video_id,
            "url": video.get("share_url"),
            "created_at_epoch": video.get("create_time"),
            "description": video.get("desc"),
            "author": author.get("nickname"),
            "username": author.get("unique_id"),
            "views": stats.get("play_count"),
            "likes": stats.get("digg_count"),
            "comments": stats.get("comment_count"),
            "shares": stats.get("share_count"),
            "saves": stats.get("collect_count"),
            "cursor": tiktok.get("cursor"),
        })

    time.sleep(1)

fieldnames = [
    "collected_at", "keyword", "video_id", "url", "created_at_epoch",
    "description", "author", "username", "views", "likes", "comments",
    "shares", "saves", "cursor",
]
with open("tiktok_creatives.csv", "w", newline="", encoding="utf-8") as output:
    writer = csv.DictWriter(output, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(records)

print("Saved", len(records), "video rows to tiktok_creatives.csv")

Das Skript speichert das Schlüsselwort zusammen mit dem Video. Das ist wichtig, wenn ein Video über mehrere Anfragen gefunden wird. Hier erfolgt die Deduplizierung innerhalb jedes Schlüsselworts, sodass dieselbe ID für verschiedene Anfragen in einer eigenen Zeile stehen kann. Für eine einheitliche Tabelle ohne Wiederholungen ersetzen Sie den Schlüssel (keyword, video_id) durch video_id und sammeln Sie die Schlüsselwörter in einer Liste oder einer separaten Zuordnungstabelle.

Der Code stellt absichtlich nur eine Anfrage pro Suchbegriff und ruft keine weiteren Seiten automatisch ab. Falls eine weitere Seite benötigt wird, definiert die Dokumentation cursor als Wert zum Fortsetzen der Ergebnisse, der aus der vorherigen Antwort stammt. Übergeben Sie ihn als undurchsichtigen Wert und berechnen Sie ihn nicht selbst. Prüfen Sie das Paginierungsschema für Ihren konkreten Arbeitsablauf anhand einer Testantwort und beenden Sie die Abfrage, wenn keine neuen Ergebnisse oder kein weiterer Cursor vorliegen.

So erhalten Sie eine vergleichbare Tabelle

Sie können die CSV-Datei in einer Tabellenkalkulation öffnen, in eine Datenbank laden oder mit Python für aggregierte Auswertungen verwenden. Gruppieren Sie die Zeilen für einen ersten Bericht nach Erfassungsdatum, Schlüsselwort und Videoformat. Am besten wird das Format nach Sichtung der Beschreibung und des Videos markiert, etwa als „Demonstration“, „Unboxing“, „Rezension“ oder „Vergleich“. Bei einer kleinen Stichprobe können Sie die Klassifizierung manuell vornehmen oder einem Modell eine vorläufige Zuordnung überlassen, die anschließend von einem Menschen geprüft wird.

Wenn Sie Text automatisch klassifizieren, übermitteln Sie dem Modell nur die erforderlichen Felder, etwa Beschreibung und ID, und bitten Sie es, genau eine Bezeichnung aus einer vorab freigegebenen Liste zurückzugeben. Speichern Sie die ursprüngliche Beschreibung getrennt vom Klassifizierungsergebnis. So kann ein Analyst eine strittige Zuordnung überprüfen und den Bericht nach einer Änderung der Taxonomie neu berechnen, ohne erneut eine API-Anfrage zu stellen.

Verwenden Sie für Vergleichskennzahlen Werte aus demselben Erfassungszeitpunkt. Das Verhältnis von Likes zu Aufrufen lässt sich beispielsweise als likes / views berechnen, sofern beide Felder vorhanden sind und die Aufrufe größer als null sind. Ebenso können Sie den Anteil der Kommentare oder geteilten Inhalte berechnen. Diese Verhältnisse beschreiben den aktuellen öffentlichen Zähler des jeweiligen Videos; sie messen weder die Reichweite bei einer bestimmten Zielgruppe noch Wiedergaben bis zum Ende oder Konversionen. Für geschäftliche Entscheidungen sollten Sie sie mit Ihrer eigenen Kampagne abgleichen und als Orientierung für die Ideenauswahl nutzen, nicht als zugesichertes Ergebnis bei der Wiederholung eines fremden Formats.

Der Median ist oft aussagekräftiger als der Durchschnitt, wenn die Stichprobe einige besonders erfolgreiche Videos enthält. Vergleichen Sie den Median der Aufrufe und der Reaktionen zwischen Gruppen nur dann, wenn dieselbe Erfassungsregel gilt: derselbe Satz von Suchanfragen, dieselbe Region, derselbe Zeitraumfilter und ein ähnlicher Erfassungszeitpunkt. Notieren Sie die Ausführungsparameter zusammen mit dem Datum. Wenn eine Änderung der Suche oder Stichprobe die Zusammensetzung der Zeilen verändert, kann der Unterschied zwischen zwei Berichten auch auf eine geänderte Methode zurückzuführen sein.

Erneute Ausführung und Änderungsüberwachung

Um aus einer einmaligen Analyse ein Monitoring zu machen, führen Sie das Skript nach einem Zeitplan aus, zum Beispiel täglich oder wöchentlich, und ergänzen Sie jeden Datensatz um das Erfassungsdatum. Speichern Sie für jedes Video Paare aus „Zeitpunkt der Momentaufnahme – Zählerwert“. So können Sie Veränderungen der öffentlichen Kennzahlen zwischen Beobachtungen nachvollziehen und jeden Messpunkt separat bewahren. Überschreiben Sie alte Zähler nicht mit den aktuellen Werten, sonst geht die Entwicklung verloren.

Verlagern Sie in einer Produktionsumgebung das rohe JSON aus dem lokalen Ordner in einen Objektspeicher oder ein anderes Archivsystem und legen Sie normalisierte Zeilen in einer Datenbank mit einem eindeutigen Schlüssel ab, beispielsweise aus Video-ID und Erfassungszeitpunkt. Ergänzen Sie ein Fehlerprotokoll, das den geheimen Schlüssel nicht enthält, begrenzen Sie die Zahl der Wiederholungsversuche und richten Sie eine Benachrichtigung bei fehlgeschlagenen Anfragen ein. Bei einem vorübergehenden Fehler können Sie die Anfrage mit Verzögerung wiederholen. Bei einem strukturellen Fehler sollten Sie die Antwort besser speichern und den Lauf zur Überprüfung markieren, damit ein Fehler nicht unbemerkt zu einem leeren Bericht führt.

Verwenden Sie cursor nicht als dauerhafte Kennung einer Untersuchung: Es handelt sich um eine Markierung zum Fortsetzen der Ergebnisliste. Speichern Sie ihn zusammen mit den Parametern der jeweiligen Anfrage, verwenden Sie ihn nur zum Fortsetzen dieser Liste und mischen Sie keine Seiten verschiedener Schlüsselwörter. Halten Sie außerdem die tatsächlich verarbeitete Ergebnisanzahl fest: Der angeforderte Wert count legt die gewünschte Antwortgröße fest, garantiert aber keine vollständige Erfassung aller passenden Beiträge.

So erweitern Sie den Arbeitsablauf

Wenn die Suchstichprobe zu viele irrelevante Ergebnisse enthält, können Sie zusätzlich bestimmte öffentlich zugängliche Profile oder Hashtags beobachten. Die Dokumentation führt die Routen /getUserFeed und /getHashtagFeed mit Anfrage- und Paginierungsparametern auf. Dabei handelt es sich um andere Stichproben mit eigenen Regeln zur Fortsetzung: Für den Profil-Feed wird max_cursor verwendet, für Hashtags cursor. Binden Sie sie als getrennte Quellen ein und speichern Sie den Quellentyp sowie die Parameter, damit Suchergebnisse nach Schlüsselwort nicht mit Beiträgen eines Profils oder Hashtags vermischt werden.

Für Teams ohne eigene Infrastruktur lässt sich die CSV-Datei über die API an Google Sheets übergeben: Die Dokumentation zur Google Sheets API beschreibt das Lesen und Schreiben von Zellwerten. Richten Sie separate Tabellenblätter für Rohdatenläufe, normalisierte Videos und Zusammenfassungen ein. Das ist für die gemeinsame Klassifizierung praktisch. Sobald die gespeicherte Historie für die Tabelle zu umfangreich wird, können Sie die Zeilen in einen SQL-Speicher übertragen und dieselben Felder sowie die Datenherkunft beibehalten.

Eine sinnvolle Aufgabe für einen KI-Agenten ist es, bereits erfasste und normalisierte Datensätze kurz zusammenzufassen: Beschreibungen zu gruppieren, Formate vorzuschlagen und ungewöhnliche Werte hervorzuheben. Der Agent sollte nicht aus einer kleinen Ergebnismenge allgemeine Aussagen über die gesamte Plattform ableiten. Übermitteln Sie ihm den Zeitraum, die Suchbegriffe und die Anzahl der Zeilen, bitten Sie ihn um Verweise auf Video-IDs und lassen Sie unbestimmte oder fehlende Felder leer. Anschließend prüft ein Analyst Beispiele anhand der gespeicherten Links.

Das Ergebnis

Nach der Einrichtung erhält das Team ein reproduzierbares Register gefundener Videos mit IDs, Links, Beschreibungen, Autoren, Veröffentlichungszeitpunkten und verfügbaren öffentlichen Zählern. Anhand der gespeicherten Rohantwort lässt sich die Verarbeitung überprüfen. Die CSV-Datei erleichtert es, Videos zu sortieren, nach Schlüsselwörtern zu filtern und Momentaufnahmen nach Datum zu vergleichen. Daraus lässt sich ein wöchentlicher Überblick erstellen: Welche Formate wiederkehrten, welche Beiträge eine Sichtung verdienen und welche kreativen Hypothesen mit eigenen Inhalten getestet werden sollten.

Das praktische Ergebnis ist kein allgemeingültiges Ranking von Wettbewerbern, sondern eine disziplinierte Stichprobe mit nachvollziehbarer Herkunft. Ihre Qualität hängt von den gewählten Suchanfragen, Filtern und dem Beobachtungszeitraum ab. Speichern Sie daher die Erfassungsparameter, prüfen Sie einzelne Videos manuell und trennen Sie verfügbare Kennzahlen von ihrer Interpretation. So lassen sich verstreute Lesezeichen durch vergleichbare Daten ersetzen und kreative Ansätze anhand konkreter Beispiele diskutieren.

Die Suchroute und ihre Parameter können Sie in der offiziellen Dokumentation von jsonscraper prüfen. Eine Beschreibung des Dienstes und den Zugang dazu finden Sie auf der Seite zur TikTok Scraper API. Beginnen Sie mit einigen Suchbegriffen, speichern Sie eine Testantwort und prüfen Sie die Struktur, bevor Sie einen Zeitplan einrichten.

People

No people listed for this article yet.

Keep readingFrühe TikTok-Trendsignale finden: Suchergebnisse automatisch überwachen
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