jsonscraper

Jak porovnávat kreativní obsah konkurence na TikToku podle veřejných metrik: pipeline v Pythonu

Shromážděte výsledky z několika vyhledávacích dotazů, odstraňte duplicity a porovnávejte videa podle zhlédnutí, lajků a komentářů

Redakční zásady Nahlásit chybu

Dva týmy zveřejňují videa o podobném produktu, ale každý je ručně hodnotí podle jiných ukazatelů: jeden si všímá zhlédnutí, druhý komentářů a třetí ukládá odkazy do chatu. Po týdnu je těžké zjistit, které formáty se u konkurence opakují, které příspěvky získávají výrazné reakce a co se změnilo od poslední kontroly.

Řešením je sestavit omezený a reprodukovatelný vzorek veřejných videí podle předem stanovených klíčových slov, uložit původní JSON a vytvořit tabulku s jednotnými poli. Díky tomu můžete videa porovnávat v rámci jednoho pracovního postupu, místo abyste směšovali náhodná pozorování se závěry o trhu. Níže najdete postup pro menší monitoring konkurence v Pythonu pomocí TikTok Scraper API od jsonscraper.

Nejprve určete otázku analýzy

Sběr dat je užitečný, když předem víte, jaké rozhodnutí na jeho základě uděláte. Marketingový tým výrobce sportovních lahví může například chtít zjistit, jak konkurenti představují produkt v krátkých videích: prostřednictvím ukázky používání, rozbalování, srovnání nebo reakcí uživatelů. Není třeba kopírovat celý TikTok. Stačí několik cílených vyhledávacích dotazů a opakované sledování videí, která API pro tyto dotazy vrací.

Formulujte otázku tak, aby ji bylo možné ověřit: „Které formáty popisu a ukázek se objevují mezi zveřejněnými videi pro našich pět klíčových frází a která z nalezených videí mají právě teď nejvyšší počet zhlédnutí a reakcí?“ Tato formulace rozděluje analýzu do dvou vrstev. Text a popis pomáhají seskupit kreativní přístupy; počty zhlédnutí, lajků, komentářů a sdílení zachycují veřejné reakce v okamžiku sběru.

Tento snímek se hodí pro stanovení priorit při ruční kontrole a sledování změn. Popisuje videa vrácená pro konkrétní dotazy, parametry a čas spuštění. Správný závěr proto zní například „v našem vzorku se často objevují rozbalovací videa“ nebo „tato skupina videí má nyní vyšší medián zhlédnutí“. Právě takto vymezená analýza pomáhá týmu vybírat náměty pro vlastní obsah.

Navrhněte jednoduchý datový proces

Rozdělte práci do čtyř fází: sběr, uložení nezpracované odpovědi, normalizace a analýza. Sběr volá API pro každé schválené klíčové slovo. Nezpracovanou odpověď ukládejte celou, abyste ji mohli znovu ověřit. Normalizace převede vnořenou strukturu JSON na řádky tabulky a analýza vypočítá metriky a seskupí videa podle klíčových slov nebo ručně přiřazených formátů.

  • Sběr. Pro každé klíčové slovo vyžádejte stanovený počet výsledků se stejným regionem a řazením.
  • Archivace. Uložte původní JSON a čas získání, abyste mohli ověřit extrahované hodnoty.
  • Normalizace. Ponechte ID videa, odkaz, popis, autora, čas zveřejnění a dostupné čítače.
  • Kontrola kvality. Odstraňte duplicity podle ID, označte chybějící hodnoty a uložte klíčové slovo, které video přivedlo do výsledků.
  • Porovnání. Počítejte vlastní ukazatele pouze z dostupných zdrojových polí a porovnávejte skupiny v rámci jednoho snímku.

Tento přístup je lepší než pouhý seznam odkazů, protože uchovává původ každého řádku a umožňuje rozlišit opakovaný výskyt téhož videa od nového materiálu. Ukládejte také datum sběru: veřejné čítače se mohou měnit, takže hodnotu z dnešní odpovědi nelze považovat za trvalou vlastnost videa.

Co podporuje TikTok Scraper API

Dokumentace jsonscraper popisuje pro vyhledávání videí podle textového dotazu GET endpoint /searchVideo na základní adrese https://tiktok.evelode.com. Povinným parametrem je keyword; dostupné jsou také count, cursor, region, date_posted, sort_by a cache_timeout. Dokumentace uvádí možnosti řazení most-liked, relevance a date-posted a mezi obdobími zveřejnění také yesterday, this-week, this-month, last-3-months, last-6-months a all-time. Názvy a význam parametrů si ověřte v referenční příručce endpointů TikToku.

Klíč se předává v parametru dotazu license_key. V pracovním skriptu jej uložte do proměnné prostředí JSONSCRAPER_TIKTOK_LICENSE_KEY, nikoli do zdrojového souboru, tabulky nebo protokolu spuštění. V odpovědi kontrolujte nejprve nejvyšší úroveň status a pak zpracujte objekt tiktok. Výsledek vyhledávání může obsahovat seznam aweme_list i search_item_list, kde jsou informace o videu vloženy v aweme_info. Níže uvedený kód podporuje obě podoby.

Mezi potvrzenými poli odpovědi vyhledávání jsou ID videa, popis, čas zveřejnění, odkaz, údaje o autorovi a metriky jako zhlédnutí, lajky, komentáře, uložení a sdílení. V konkrétním záznamu mohou některá pole chybět. V tabulce takové hodnoty ponechte prázdné, místo abyste je nahrazovali nulou: nula znamená naměřenou hodnotu, prázdné pole znamená, že hodnota v získaném objektu chybí.

Jednoduchý příklad v Pythonu

Níže uvedený skript provede jeden dotaz pro každé klíčové slovo, uloží úplnou odpověď do souboru JSON a vytvoří CSV pro tabulkový procesor nebo další zpracování. Je určen pro Python 3.8+ a používá pouze standardní knihovnu. Před spuštěním nastavte proměnnou prostředí s licenčním klíčem. Seznam klíčových slov a počet výsledků upravte podle svého scénáře.

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 = ["termo láhev", "sportovní láhev", "rozbalování lahve"]
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")

Skript ukládá klíčové slovo spolu s videem: to je důležité, pokud se jeden klip objeví ve výsledcích více dotazů. Deduplikace zde probíhá v rámci každého klíčového slova, takže jedno ID může mít samostatný řádek pro různé dotazy. Pro jedinou tabulku bez opakování nahraďte klíč (keyword, video_id) hodnotou video_id a klíčová slova ukládejte do seznamu nebo samostatné propojovací tabulky.

Kód záměrně provádí jeden dotaz pro každé slovo a automaticky neprochází stránky výsledků. Pokud potřebujete další stránku, dokumentace definuje cursor jako hodnotu pro posun ve výsledcích, získanou z předchozí odpovědi. Předávejte ji jako neprůhlednou hodnotu a nic sami nevypočítávejte. U konkrétního pracovního postupu ověřte stránkování na testovací odpovědi a zastavte se, když nejsou k dispozici nové výsledky nebo další kurzor.

Jak vytvořit srovnatelnou tabulku

CSV můžete otevřít v tabulkovém procesoru, nahrát do databáze nebo použít v Pythonu k výpočtu souhrnných hodnot. V prvním přehledu seskupte řádky podle data sběru, klíčového slova a formátu videa. Formát je nejlepší označit až po zhlédnutí popisu i samotného videa: například „ukázka“, „rozbalování“, „recenze“ nebo „srovnání“. U menšího vzorku lze klasifikaci provést ručně, případně požádat model o návrh štítků a následně je nechat ověřit člověkem.

Pokud texty klasifikujete automaticky, předávejte modelu jen potřebná pole — například popis a identifikátor — a požádejte jej o jednu značku z předem schváleného seznamu. Původní popis uchovávejte odděleně od výsledku klasifikace. Analytik tak může ověřit spornou značku a přepočítat přehled po změně taxonomie, aniž by musel znovu volat API.

Pro srovnávací metriky používejte hodnoty ze stejného okamžiku sběru. Poměr lajků ke zhlédnutím lze například vypočítat jako likes / views, pokud jsou k dispozici obě pole a počet zhlédnutí je vyšší než nula. Podobně lze vypočítat podíl komentářů nebo sdílení. Tyto poměry popisují aktuální veřejné počítadlo daného videa; neměří zásah u konkrétního publika, dokoukanost ani konverzi. Při obchodním rozhodování je porovnávejte s vlastní kampaní a berte je jako vodítko pro výběr nápadů, nikoli jako příslib výsledků při opakování cizího formátu.

Medián bývá vhodnější než průměr, pokud vzorek obsahuje několik mimořádně úspěšných videí. Medián zhlédnutí a reakcí porovnávejte mezi skupinami jen při stejných pravidlech sběru: stejná sada dotazů, region, časový filtr a přibližně stejný čas datového snímku. Parametry spuštění zaznamenávejte spolu s datem. Pokud se změní vyhledávání nebo složení vzorku, rozdíl mezi dvěma přehledy může být způsoben i změnou metody.

Opakované spouštění a sledování změn

Chcete-li z jednorázové analýzy vytvořit monitoring, spouštějte skript podle plánu — například denně nebo jednou týdně — a ke každému záznamu přidávejte datum sběru. U každého videa ukládejte dvojice „čas snímku — hodnota čítače“. Změny veřejných ukazatelů tak můžete sledovat mezi pozorováními a přitom zachovat každý měřený bod samostatně. Staré hodnoty nepřepisujte aktuálními, jinak se dynamika ztratí.

V produkčním prostředí přesuňte nezpracovaný JSON z místní složky do objektového úložiště nebo jiného archivačního systému a normalizované řádky ukládejte do databáze s jedinečným klíčem, například kombinací ID videa a času sběru. Přidejte protokol chyb bez tajného klíče, omezený počet opakovaných pokusů a upozornění na neúspěšný dotaz. Po dočasné chybě můžete požadavek zopakovat s prodlevou; při strukturální chybě raději odpověď uložte a označte spuštění ke kontrole, aby se z výpadku nestal nenápadně prázdný přehled.

Hodnotu cursor nepoužívejte jako trvalý identifikátor výzkumu: jde o značku pro pokračování ve výpisu. Ukládejte ji spolu s parametry odpovídajícího dotazu, používejte ji pouze k pokračování tohoto výpisu a nemíchejte stránky z různých klíčových slov. Zaznamenávejte také skutečný počet zpracovaných výsledků: požadovaná hodnota count určuje zamýšlenou velikost odpovědi, ale nezaručuje úplné pokrytí všech odpovídajících příspěvků.

Jak pracovní postup rozšířit

Pokud jsou výsledky vyhledávání příliš zašuměné, můžete samostatně sledovat konkrétní veřejné profily nebo hashtagy. Dokumentace uvádí endpointy /getUserFeed a /getHashtagFeed s parametry dotazu a stránkování. Jde o jiné vzorky s vlastními pravidly pokračování: u profilu se používá max_cursor, u hashtagu cursor. Připojujte je jako samostatné zdroje a ukládejte typ zdroje i jeho parametry, abyste nemíchali výsledky vyhledávání podle klíčového slova s příspěvky z profilu nebo hashtagu.

Týmu bez vlastní infrastruktury lze CSV předávat do Google Sheets prostřednictvím API: dokumentace Google Sheets API popisuje čtení a zápis hodnot buněk. Přidejte samostatné listy pro nezpracovaná spuštění, normalizovaná videa a souhrn. Tato varianta se hodí pro společné označování; až bude historie příliš velká pro tabulku, přesuňte řádky do úložiště SQL a zachovejte stejná pole i původ dat.

U AI agenta dává smysl svěřit mu stručné shrnutí již shromážděných a normalizovaných záznamů: seskupení popisů, návrh formátů a vyznačení neobvyklých hodnot. Agentovi nesvěřujte vytváření tvrzení o celé platformě na základě malého výpisu. Předejte mu období, seznam dotazů a počet řádků, požádejte ho, aby odkazoval na ID videí a vracel neurčená či chybějící pole jako prázdná. Analytik pak může příklady ověřit prostřednictvím uložených odkazů.

Co získáte

Po nastavení bude mít tým reprodukovatelný registr nalezených videí s identifikátory, odkazy, popisy, autory, časy zveřejnění a dostupnými veřejnými čítači. Uložená nezpracovaná odpověď umožňuje znovu ověřit převod a CSV usnadňuje řazení videí, filtrování podle klíčových slov a porovnávání snímků podle data. Můžete z něj sestavit týdenní přehled: které formáty se opakovaly, které příspěvky stojí za zhlédnutí a které kreativní hypotézy se vyplatí otestovat ve vlastním obsahu.

Praktickým výsledkem není univerzální žebříček konkurence, ale disciplinovaný vzorek s jasně doloženým původem. Jeho kvalita závisí na zvolených dotazech, filtrech a období sledování. Proto ukládejte parametry sběru, jednotlivá videa kontrolujte ručně a oddělujte dostupné metriky od jejich interpretace. Tento postup pomáhá nahradit nesourodé záložky srovnatelnými daty a diskutovat o kreativním obsahu na konkrétních příkladech.

Vyhledávací endpoint a jeho parametry si můžete ověřit v oficiální dokumentaci jsonscraper; informace o službě a přístup k ní najdete na stránce TikTok Scraper API. Začněte několika vyhledávacími frázemi, uložte jednu testovací odpověď a před naplánováním pravidelného spouštění ověřte její strukturu.

People

No people listed for this article yet.

Keep readingJak zachytit rané signály trendů na TikToku: automatické monitorování výsledků vyhledávání
Read the next article

Proměňte přečtené ve funkční integraci

Prozkoumejte API sociálních dat jsonscraper, testujte požadavky a sestavte další workflow.

Prozkoumat API