jsonscraper
Markten

Hoe je de thematische consistentie van een TikTok-maker beoordeelt aan de hand van openbare posts

Een stapsgewijze Python-pijplijn om de feed van een maker op te halen, onderwerpen te vergelijken en AI zorgvuldig in te zetten

Redactioneel beleid Een fout melden

Een maker lijkt op basis van zijn profiel en een paar geslaagde video’s misschien geschikt voor een campagne, maar zijn recente feed vertelt een belangrijker verhaal: blijft hij regelmatig over het gewenste onderwerp praten? Handmatige controles zijn snel verouderd, en een eenmalige blik kan gemakkelijk neerkomen op het selecteren van de meest opvallende posts. Voor een bureau of merk is het nuttiger om herhaaldelijk een steekproef van openbare video’s te verzamelen, de gegevens op de controledatum vast te leggen en de thematische aansluiting volgens steeds dezelfde regels te beoordelen.

Artikel: Hoe je de thematische consistentie van een TikTok-maker beoordeelt aan de hand van openbare posts
Samenvatting: Lees hoe een merk of bureau kan beoordelen of een TikTok-maker regelmatig content over een gewenst onderwerp publiceert: haal de feed via een API op, bewaar momentopnamen, bereken transparante indicatoren en laat video-omschrijvingen thematisch classificeren.
Beeldrol: omslag — het centrale idee
Sectie: 
Visueel onderwerp: Een gedrukt analyserapport met videokaarten van TikTok-makers, weergegeven als neutrale pictogrammen, ' loading=
© jsonscraper · AI-gegenereerde illustratie

Hieronder staat een praktische werkwijze om de openbare feed van een TikTok-maker te beoordelen. De aanpak gebruikt de TikTok Scraper API van jsonscraper en Python: publicaties worden opgehaald via een gedocumenteerde route, de oorspronkelijke JSON wordt opgeslagen, bevestigde velden worden in een tabel gezet en het aandeel video’s dat aan een bepaald thema voldoet, wordt berekend. Desgewenst kun je de omschrijvingen vervolgens aan een tekstclassificator voorleggen als een afzonderlijke, gecontroleerde stap.

Bepaal eerst wat ‘passend’ betekent

Stel dat een team een maker zoekt voor een campagne over thuis koffiezetten. Het aantal volgers en de populariteit van afzonderlijke video’s kunnen helpen het bereik te beschrijven, maar beantwoorden op zichzelf niet de vraag hoe nauw de feed met koffie samenhangt. Voor een eerste selectie zijn inhoudelijke kenmerken nodig: noemt de video-omschrijving koffiezetten, apparatuur, recepten of recensies; hoeveel publicaties over dit onderwerp vallen binnen de gekozen observatieperiode; en welk aandeel van de verzamelde video’s is thematisch relevant?

Leg vóór het verzamelen de criteria vast in een korte woordenlijst, bijvoorbeeld ‘espresso’, ‘koffiemolen’, ‘latte’ en ‘zetten’. Voeg uitsluitingen en dubbelzinnige woorden toe. ‘Koffie’ kan voorkomen in een grap, een gesponsorde integratie of een toevallige context. Een automatische tekstmatch is dus een eerste classificatie, geen definitief oordeel over de maker. Maak ten minste onderscheid tussen drie statussen: duidelijk passend, mogelijk passend en niet relevant.

Leg ook de steekproef vooraf vast. Je kunt bijvoorbeeld bij elke wekelijkse run de laatste 20 opgehaalde publicaties analyseren. Dat is een voorwaarde van je monitoring, geen belofte dat de API precies dat aantal oplevert: de beschikbaarheid en samenstelling van de resultaten hangen af van het antwoord op de specifieke aanvraag. Noteer het verzameltijdstip, het aantal opgehaalde items en de aanvraagparameters, zodat je momentopnamen volgens dezelfde regels kunt vergelijken.

De feed van een maker opvragen

Volgens de documentatie van jsonscraper accepteert de route GET /getUserFeed de verplichte parameter query: de gebruikersnaam of profiel-URL. Genoemde optionele parameters zijn count, region, sort_type, with_pinned_posts en max_cursor. De API-sleutel wordt als license_key in de querystring meegestuurd; bewaar hem in een omgevingsvariabele, niet in de broncode. Details over routes en parameters staan in de officiële documentatie van de TikTok API.

Controleer in het antwoord eerst de buitenste status en benader daarna het object tiktok. De lijst met gebruikersposts staat in tiktok.aweme_list. Het waargenomen schema bevat de video-ID, de omschrijvingstekst, de publicatietijd, de maker, een URL en een statistiekobject. Afzonderlijke velden kunnen ontbreken; laat de verwerker die dan leeg in plaats van ze te vervangen door verzonnen getallen.

Het volgende minimale voorbeeld is bedoeld voor Python 3.8+ en de bibliotheek requests. Sla de sleutel op in JSONSCRAPER_TIKTOK_LICENSE_KEY. De code voert één aanvraag uit, controleert de HTTP-respons en de externe API-status, slaat de oorspronkelijke JSON op en toont genormaliseerde regels.

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

import requests

API_KEY = os.environ["JSONSCRAPER_TIKTOK_LICENSE_KEY"]
PROFILE = "creator_username"

params = {
    "license_key": API_KEY,
    "query": PROFILE,
    "count": 20,
    "region": "US",
    "sort_type": 0,
    "with_pinned_posts": 0,
}

response = requests.get(
    "https://tiktok.evelode.com/getUserFeed",
    params=params,
    timeout=30,
)
response.raise_for_status()
payload = response.json()

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

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

stamp = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ")
Path("snapshots").mkdir(exist_ok=True)
Path(f"snapshots/{PROFILE}_{stamp}.json").write_text(
    json.dumps(payload, ensure_ascii=False, indent=2),
    encoding="utf-8",
)

rows = []
for item in items:
    stats = item.get("statistics") or {}
    author = item.get("author") or {}
    rows.append({
        "aweme_id": item.get("aweme_id"),
        "created_at": item.get("create_time"),
        "description": item.get("desc") or "",
        "share_url": item.get("share_url"),
        "creator": author.get("unique_id") or author.get("nickname"),
        "play_count": stats.get("play_count"),
        "digg_count": stats.get("digg_count"),
        "comment_count": stats.get("comment_count"),
        "share_count": stats.get("share_count"),
    })

print(json.dumps(rows, ensure_ascii=False, indent=2))

Voor deze route staat sort_type volgens de beschrijving op 0 voor de nieuwste feed en 1 voor de populairste. In het voorbeeld is de nieuwste feed gekozen en zijn vastgezette video’s uitgesloten met with_pinned_posts=0, zodat een oude vastgezette post niet in de steekproef van nieuwe publicaties terechtkomt. Als je een andere modus nodig hebt, sla die parameter dan op in de metadata van de momentopname en gebruik hem bij elke run op dezelfde manier.

De respons verwerken: van JSON naar een reproduceerbare tabel

Het is nuttig om de oorspronkelijke respons vóór elke omzetting op te slaan. Zo kun je de normalisatie controleren, nagaan waarom een regel leeg is en de verwerker aanpassen als optionele velden in latere antwoorden anders blijken te zijn. Bewaar in de opslag naast de JSON ook de verzameltijd in UTC, het opgevraagde profiel, de parameters en de versie van je script. Neem de API-sleutel niet op in het archief of logbestand.

Gebruik bij herhaalde runs aweme_id als identificatie voor een publicatie, als dat veld aanwezig is. Deduplicatie op basis van deze ID voorkomt dat dezelfde video bij herhaald ophalen als meerdere publicaties wordt geteld. Bewaar statistische momentopnamen wel afzonderlijk: het aantal weergaven en reacties hoort bij het observatiemoment en is geen onveranderlijk kenmerk van de video. Ontbreekt een statistiekveld, laat het dan leeg en sluit die registratie uit van de berekening van de betreffende metriek.

De publicatietijd wordt in het schema aangeduid met create_time. Zet die voor de analysetabel om in een datum en bewaar zowel de oorspronkelijke waarde als de genormaliseerde UTC-tijd. Controleer enkele echte records uit de ontvangen respons voordat je gaat rekenen, zodat je zeker weet welk type en welke eenheden worden gebruikt. Dat is vooral belangrijk voor tijdgrafieken: een fout bij de tijdconversie verschuift publicaties naar andere dagen en verstoort de vergelijking tussen weken.

Je kunt een eenvoudige thematische classificator bouwen zonder model: normaliseer de tekst, zoek naar opgegeven sleuteltermen en markeer de matches. Stel voor een nuttiger classificatie een set handmatig gecontroleerde omschrijvingen en regels voor twijfelgevallen samen. Vergelijk vervolgens het eenvoudige woordenfilter met de menselijke beoordeling: kijk welke uitdrukkingen valse matches opleveren en werk de woordenlijst bij. Zo ontstaat een begrijpelijke basis waarmee je het latere gebruik van AI kunt beoordelen.

import re

KEYWORDS = (
    "кофе", "эспрессо", "кофемолка", "латте", "заваривание",
)


def normalize(text):
    text = (text or "").casefold()
    return re.sub(r"\s+", " ", text).strip()


def classify(description):
    text = normalize(description)
    matches = [word for word in KEYWORDS if word in text]
    return {
        "topic_match": bool(matches),
        "matched_terms": matches,
    }

for row in rows:
    row.update(classify(row["description"]))

Een sleutelwoord in de omschrijving kan een bruikbaar signaal zijn, maar laat de classificator een uitlegbare reden geven: een lijst met overeenkomende termen, niet alleen een label ‘ja/nee’. Gebruik voor taalmodellen een gestructureerde opdracht: geef de video-omschrijving en vaste categorieën mee, en vraag om een categorie, een korte onderbouwing en een betrouwbaarheidsniveau. Bewaar de oorspronkelijke tekst en het modelantwoord afzonderlijk. Controleer beslissingen die gevolgen hebben voor het budget of de keuze van een partner aan de hand van de publicatielinks.

Bereken indicatoren met een duidelijke noemer

Voor een eenvoudig rapport zijn het aandeel thematische video’s en de publicatiefrequentie geschikt. Het aandeel is het aantal video’s waarvan de thematische aansluiting is bevestigd, gedeeld door het aantal video’s dat kon worden geclassificeerd. Toon altijd beide aantallen, bijvoorbeeld: ‘7 van de 18 gecontroleerde omschrijvingen’. Zo is het resultaat begrijpelijk en valt op wanneer een percentage op een te kleine steekproef berust.

Je kunt de publicatiefrequentie uitdrukken als het aantal opgehaalde video’s binnen een vaste periode, bijvoorbeeld de afgelopen 30 dagen. Bepaal de periodegrenzen aan de hand van de verzameltijd en de publicatiedata. Bewaar bij wekelijkse momentopnamen het resultaat van elke run in plaats van alleen één bijgewerkte totaallijn: zo worden veranderingen in onderwerp en activiteit zichtbaar. Interpreteer het aantal verzamelde items niet als het volledige publicatiearchief van de maker; analyseer de steekproef die daadwerkelijk is opgehaald en vermeld duidelijk volgens welke regel die is samengesteld.

Weergaven, likes, reacties en reposts zijn bruikbaar als context bij elke video. Vergelijk absolute waarden voorzichtig: een oudere publicatie heeft mogelijk langer de tijd gehad om reacties te verzamelen. Leg voor vergelijkingen binnen één profiel het tijdstip van elke verzameling vast en bekijk de ontwikkeling van dezelfde video tussen momentopnamen. Noem het verschil tussen twee momentopnamen geen ‘groeisnelheid’ als het interval en de beschikbaarheid van de metingen niet zijn vastgelegd.

Een nuttige eindregistratie per profiel bevat de verzameldatum, de gekozen parameters, het aantal opgehaalde publicaties, het aantal geclassificeerde omschrijvingen, het aantal thematische matches, een lijst met voorbeeld-URL’s en een korte notitie over twijfelgevallen. Zo kan een medewerker de conclusie controleren en kan een andere analist de methode bij een volgend profiel herhalen.

Paginering en planning

Als de steekproef een volgende pagina vereist, gebruikt de documentatie voor de profiel-feed max_cursor, afkomstig uit de vorige respons. Geef die waarde ongewijzigd door: de cursor is een ondoorzichtige waarde die je moet opslaan en weer aan de API moet doorgeven. Controleer in de respons ook has_more als je verder wilt opvragen. Beperk het aantal pagina’s of het totale aanvraagbudget, zodat het verzamelen voorspelbaar eindigt.

cursor = None
all_items = []
max_pages = 3

for _ in range(max_pages):
    page_params = dict(params)
    if cursor is not None:
        page_params["max_cursor"] = cursor

    page_response = requests.get(
        "https://tiktok.evelode.com/getUserFeed",
        params=page_params,
        timeout=30,
    )
    page_response.raise_for_status()
    page_payload = page_response.json()

    if page_payload.get("status") != "ok":
        raise RuntimeError("TikTok API returned a non-ok status")

    page = page_payload.get("tiktok") or {}
    all_items.extend(page.get("aweme_list") or [])

    if not page.get("has_more"):
        break

    cursor = page.get("max_cursor")
    if cursor is None:
        break

Kies de frequentie op basis van het doel: voor een eerste beoordeling volstaat een handmatige run; voor een lijst met makers kan een wekelijkse planning veranderingen zichtbaar maken zonder voortdurend op te vragen. Je kunt de run onderbrengen in cron, een CI-taak of een orchestrator. De opzet is eenvoudig: haal profielen uit een tabel, voer aanvragen uit met beperkte paralleliteit, sla momentopnamen op, controleer het aandeel geslaagde antwoorden en stuur een overzicht naar een werkblad. Probeer het na een tijdelijke fout opnieuw met een beperkt aantal pogingen en een vertraging; bewaar fouten bij geauthenticeerde aanvragen afzonderlijk om de sleutel en configuratie te controleren.

Waar AI nuttig is en waar controle nodig blijft

AI kan nuttig zijn voor het classificeren van omschrijvingen met slang, meerdere talen of formuleringen zonder een exact sleutelwoord. Stel eerst een gesloten lijst met categorieën op en vraag het model alleen de tekst van de omschrijving te gebruiken. Meet vervolgens de kwaliteit op een kleine, handmatig gelabelde steekproef: vergelijk de modelcategorieën met de beslissingen van een redacteur en bespreek fouten en twijfelgevallen afzonderlijk. Vermeld in het rapport liever het aandeel overeenkomsten tussen de modeluitkomst en de handmatige beoordeling, plus het aantal gecontroleerde voorbeelden, dan één ondoorzichtige totaalscore.

Geef een model geen opdracht om ‘de beste maker te kiezen’ zonder criteria. Splits het proces in plaats daarvan op in meetbare kenmerken: het thematische aandeel, de regelmaat, voorbeelden van relevante video’s en het bereik van openbare reacties. Het model kan deze velden kort samenvatten en links naar de onderbouwing vermelden; de uiteindelijke beslissing blijft bij het team, dat rekening houdt met de campagnevorm, het publiek en de afspraken met de maker.

Als de analyse betrekking heeft op gesponsorde integraties, controleer dan op basis van de publicaties zelf en de toepasselijke regels of de relatie tussen de maker en het merk wordt bekendgemaakt. De richtlijn van de Amerikaanse Federal Trade Commission legt uit dat de band met een merk duidelijk zichtbaar naast de aanbeveling moet worden vermeld; een profielbio of een verborgen deel van de tekst is mogelijk onvoldoende om het publiek goed te informeren. Zie de FTC-richtlijnen voor makers op sociale media. Monitoring van openbare gegevens helpt materiaal voor controle te verzamelen, maar beoordelen of aan de regels is voldaan vereist context van de specifieke post en campagne.

Wat het oplevert

Na het instellen van de pijplijn beschikt het team over gedateerde momentopnamen van de openbare feed, een tabel met publicaties, omschrijvingen en beschikbare statistieken, en een reproduceerbare berekening van het thematische aandeel. Daarmee kunnen profielen sneller worden geselecteerd voor verdere controle, veranderingen in onderwerpen worden opgemerkt en de redenen voor een beoordeling worden gedocumenteerd. De methode blijft controleerbaar: met de oorspronkelijke JSON, aanvraagparameters, classificatieregels en videolinks is de weg van gegevens naar conclusie te volgen.

Voer voor de eerste test het script uit op één profiel, sla de ruwe respons op en controleer handmatig enkele classificaties. Leg vervolgens de thematische woordenlijst, de steekproefregels en het rapportformaat vast. Voeg een planning en een wachtrij met profielen toe zodra het resultaat reproduceerbaar is. Raadpleeg de API-documentatie voor een beschrijving van routes en parameters; een productoverzicht en beschikbare integratieopties vind je op de pagina van de TikTok Scraper API.

Praktische checklist voor de start

  • Leg het campagnethema, de inclusiewoordenlijst en voorbeelden van twijfelgevallen vast.
  • Leg de steekproefperiode, de waarde van count, de sortering en de instelling voor vastgezette publicaties vast.
  • Bewaar de oorspronkelijke JSON, de verzameldatum en de parameters apart van de geheime sleutel.
  • Gebruik aweme_id voor deduplicatie als de identificatie aanwezig is.
  • Maak onderscheid tussen een ontbrekende waarde en nul, en bereken geen gemiddelden zonder duidelijke grondslag.
  • Toon de omvang van de steekproef naast het thematische aandeel en voeg voorbeeldlinks toe.
  • Controleer AI-classificaties op een handmatig beoordeelde steekproef voordat je ze gebruikt bij campagnebeslissingen.
  • Werk de beoordeling volgens een planning bij en vergelijk momentopnamen die volgens dezelfde regels zijn verzameld.

Mensen

Er zijn nog geen mensen vermeld voor dit artikel.

Blijf lezenTikTok-leadkwaliteit beoordelen aan de hand van openbare video’s: een stapsgewijze Python-pijplijn
Lees het volgende artikel

Maak van wat je leest een werkende integratie

Ontdek de socialdata-API's van jsonscraper, test aanvragen en bouw je volgende workflow.

API's verkennen