Als klanten in meerdere TikTok-video’s dezelfde vraag stellen, is het handig als het supportteam een lijst met oorspronkelijke video’s en formuleringen krijgt die het kan controleren. Je kunt beginnen met zoekresultaten voor meerdere opdrachten te verzamelen, die op video-ID samen te voegen en de steekproef handmatig te laten labelen.
Hieronder staat een Python-script dat de opgehaalde resultaten verzamelt en een CSV-bestand maakt met links, videobeschrijvingen en de zoektermen waarmee elke video is gevonden. Het helpt overeenkomsten tussen zoekopdrachten te zien; op zichzelf stelt het geen semantisch vergelijkbare vragen vast. Die beoordeling gebeurt door een specialist of een aparte classifier, gevolgd door controle.
Welke vraag moet de verzameling beantwoorden?
Stel dat een team een thermosbeker verkoopt en wil weten waar openbare video’s over gaan. De zoekopdracht ‘thermosbeker lekt’ kan video’s met klachten, reviews en instructies opleveren. De zoekopdracht ‘thermosbeker schoonmaken’ levert een andere steekproef op. Meerdere formuleringen vormen een werkset met voorbeelden om te controleren voor support en de contentplanning.

Het resultaat van het script is een tabel met voor elke vermelding het publicatie-ID, de beschrijving, de link en de zoektermen waarmee de video is gevonden. Als een video in meerdere resultaten voorkomt, wijst dat op overlap tussen zoekresultaten, maar bewijst het nog niet dat de video een herhaalde vraag bevat. Open de links, controleer de context en wijs bevestigde formuleringen een thema toe om een vragenwachtrij samen te stellen.
Dit proces is handig voor een ontwikkelaar die het verzamelen automatiseert en voor een analist die een reproduceerbare dataset nodig heeft om te beoordelen. Dankzij de koppeling met de oorspronkelijke video kun je de conclusie controleren voordat je de instructies aanpast of nieuw materiaal maakt.
Welke gegevens levert de zoekopdracht op?
De route /searchVideo en de parameters staan vermeld in de handleiding voor de TikTok API. keyword is verplicht; als aanvullende parameters worden onder meer count, cursor, region, date_posted, sort_by en cache_timeout genoemd. De aanvraag wordt geauthenticeerd met de parameter license_key. In het voorbeeld hieronder worden een zoekterm en de paginagrootte gebruikt.
De gecontroleerde antwoordstructuur bevat een status op het hoogste niveau en een object tiktok. Items kunnen een ID, beschrijving, link, auteursgegevens en statistieken bevatten, waaronder weergaven en reacties. Sommige velden kunnen ontbreken: in de CSV blijven die waarden daarom leeg en worden ze niet vervangen door nul.
Het zoekantwoord ondersteunt twee structuren: items kunnen in aweme_list staan of in search_item_list[].aweme_info. De normalisatiefunctie verwerkt beide varianten. De code controleert ook of het object tiktok aanwezig is, zodat een onverwachte antwoordstructuur niet als een succesvolle lege zoekopdracht wordt beschouwd.
Een kant-en-klare verzamelaar in Python
Het voorbeeld is compatibel met Python 3.8+ en de bibliotheek requests. Het voert één aanvraag uit per zoekterm, controleert het HTTP-antwoord en de API-status, voegt records samen op ID, bewaart de zoektermen die overeenkomen en schrijft een CSV-bestand. De sleutel wordt uit een omgevingsvariabele gelezen en niet weergegeven.

import csv
import os
import sys
import requests
BASE_URL = "https://tiktok.evelode.com/searchVideo"
KEY = os.environ.get("JSONSCRAPER_TIKTOK_LICENSE_KEY")
QUERIES = [
"термокружка протекает",
"как мыть термокружку",
"термокружка не держит тепло",
]
if not KEY:
sys.exit("Задайте JSONSCRAPER_TIKTOK_LICENSE_KEY")
def extract_items(payload):
data = payload.get("tiktok")
if not isinstance(data, dict):
raise RuntimeError("В ответе отсутствует объект tiktok")
items = list(data.get("aweme_list") or [])
for entry in data.get("search_item_list") or []:
video = entry.get("aweme_info") if isinstance(entry, dict) else None
if isinstance(video, dict):
items.append(video)
return items
rows = {}
for query in QUERIES:
response = requests.get(
BASE_URL,
params={"license_key": KEY, "keyword": query, "count": 20},
timeout=30,
)
response.raise_for_status()
payload = response.json()
if payload.get("status") != "ok":
raise RuntimeError("API вернул статус, отличный от ok")
for item in extract_items(payload):
video_id = item.get("aweme_id")
if not video_id:
continue
stats = item.get("statistics") or {}
author = item.get("author") or {}
row = rows.setdefault(video_id, {
"video_id": video_id,
"description": item.get("desc"),
"share_url": item.get("share_url"),
"author": author.get("nickname"),
"play_count": stats.get("play_count"),
"comment_count": stats.get("comment_count"),
"matched_queries": set(),
})
row["matched_queries"].add(query)
fields = ["video_id", "description", "share_url", "author",
"play_count", "comment_count", "matched_queries"]
with open("tiktok_questions.csv", "w", newline="", encoding="utf-8-sig") as file:
writer = csv.DictWriter(file, fieldnames=fields)
writer.writeheader()
for row in rows.values():
output = dict(row)
output["matched_queries"] = " | ".join(sorted(row["matched_queries"]))
writer.writerow(output)
Installeer de afhankelijkheid met de opdracht python -m pip install requests, stel JSONSCRAPER_TIKTOK_LICENSE_KEY in de procesomgeving in en voer het bestand uit. Zet de sleutel niet in de broncode, CSV of logbestanden. Voor geplande uitvoeringen gebruik je een beveiligde omgeving waarin de taak toegang heeft tot de variabele.
Van CSV naar een vragenwachtrij
Open na het verzamelen de video’s en haal er handmatig de feitelijke vragen uit. Groepeer vervolgens de bevestigde formuleringen per thema, bijvoorbeeld ‘lekdichtheid’, ‘onderhoud’ of ‘warmte vasthouden’. De zoekterm helpt de publicatie te vinden, maar de videobeschrijving en overeenkomsten tussen zoekopdrachten vervangen geen controle van de context.
Als je een taalmodel gebruikt, geef het dan de beschrijving en vraag om een korte themalabel en een mogelijke vraag. Bewaar de oorspronkelijke tekst, link en modeluitkomst naast elkaar, zodat een specialist de basis voor de classificatie kan controleren. Presenteer een door het model voorgestelde formulering niet als een letterlijk gestelde vraag als die niet in de beschrijving staat.
Het aantal gevonden records beschrijft alleen de resultaten die voor de specifieke zoekopdrachten zijn teruggegeven. Het meet niet het totale volume aan gesprekken of de vraag. Bewaar voor interne rapportage de datum van uitvoering, de oorspronkelijke zoekterm, het ID en het onbewerkte API-antwoord. Zo kun je resultaten van herhaalde uitvoeringen vergelijken en nieuwe ID’s afzonderlijk markeren.
Automatische paginering ontbreekt bewust in dit voorbeeld. Voor volgende pagina’s noemt de documentatie de parameter cursor; de waarde daarvan haal je uit het vorige antwoord en geef je zonder wijzigingen door. Eén pagina vertegenwoordigt slechts de opgehaalde resultaten, niet alle zoekresultaten.
Wat het team te zien krijgt
Het bestand tiktok_questions.csv bevat één rij per uniek ID dat met de opgegeven zoektermen is gevonden. De kolom matched_queries laat zien met welke zoekopdrachten de video is gevonden. Dit is een handige manier om overlap tussen zoekresultaten te signaleren en voorbeelden te kiezen voor controle; de vragen moeten afzonderlijk worden geclassificeerd.
Daarna kun je de CSV opnemen in een wekelijkse automatisering: een planner start de verzameling, een opslaglocatie bewaart een momentopname en er wordt een melding verstuurd wanneer een ID verschijnt dat nog niet in het logboek staat. Dit is externe orkestratielogica, geen functie van het zoekendpoint. Het team krijgt een wachtrij met links om te analyseren, geen kant-en-klare conclusie over het gedrag van klanten.
De routeparameters staan in de API-documentatie; je kunt een aanvraag uitproberen op de demopagina van de TikTok API. Controleer voordat je regelmatig gegevens verzamelt de feitelijke antwoordstructuur en bewaar de waarden die nodig zijn om vanuit het overzicht naar een specifieke video te gaan. De productbeschrijving staat op de pagina van de TikTok Scraper API.
Het nuttige resultaat is een controleerbare verzameling video’s die aan specifieke zoektermen zijn gekoppeld. Daarmee kun je materiaal voor handmatige analyse selecteren en de bronnen bewaren van elk onderwerp dat je in de contentplanning opneemt.