Kaksi tiimiä julkaisee videoita samankaltaisesta tuotteesta, mutta arvioi niitä käsin eri perustein: yksi painaa mieleen näyttökerrat, toinen kommentit ja kolmas tallentaa linkit keskusteluun. Viikon päästä on vaikea tietää, mitkä muodot toistuvat kilpailijoiden sisällöissä, mitkä julkaisut saavat huomattavasti reaktioita ja mikä on muuttunut edelliseen tarkasteluun verrattuna.
Ratkaisu on kerätä rajattu ja toistettava otos julkisista videoista ennalta määritellyillä avainsanoilla, tallentaa alkuperäinen JSON ja koota tiedot yhtenäiset kentät sisältäväksi taulukoksi. Näin videoita voi vertailla saman työnkulun puitteissa sekoittamatta satunnaisia havaintoja markkinaa koskeviin päätelmiin. Alla on Python-pohjainen malli pieneen kilpailijaseurantaan jsonscraperin TikTok Scraper API -rajapinnalla.
Määritä analyysin kysymys ensin
Datankeruu on hyödyllistä, kun tiedetään etukäteen, mitä päätöstä sen perusteella tehdään. Esimerkiksi urheilujuomapulloja valmistavan yrityksen markkinointitiimi haluaa selvittää, miten kilpailijat esittelevät tuotteitaan lyhyillä videoilla: käyttöä havainnollistamalla, avaamalla pakkauksen, vertailemalla tuotetta tai näyttämällä käyttäjien reaktioita. Koko TikTokia ei tarvitse kopioida. Tarvitaan muutama kohdennettu hakukysely ja toistettava tapa seurata videoita, joita API palauttaa näillä kyselyillä.
Muotoile kysymys niin, että sen voi tarkistaa: ”Mitä esittely- ja havainnollistamismuotoja esiintyy julkaistuissa videoissa viidellä avainsanallamme, ja mitkä löydetyistä videoista saavat juuri nyt eniten näyttökertoja ja reaktioita?” Tämä muotoilu erottaa kaksi analyysin tasoa. Tekstin ja kuvauksen avulla voi ryhmitellä luovia lähestymistapoja; näyttökerta-, tykkäys-, kommentti- ja jakomäärät kuvaavat julkisia reaktioita keruuhetkellä.
Tällainen tilannekuva auttaa priorisoimaan manuaalista tarkastelua ja seuraamaan muutoksia. Se kuvaa videoita, jotka palautettiin tietyillä kyselyillä ja parametreilla tiettynä ajankohtana. Siksi asianmukainen johtopäätös on esimerkiksi ”otos sisältää usein pakkausten avaamisvideoita” tai ”tämän videoryhmän näyttökertojen mediaani on tällä hetkellä suurempi”. Tällainen analyysin rajaus auttaa tiimiä valitsemaan omalle sisällölleen testattavia hypoteeseja.
Suunnittele pieni datan käsittelyputki
Jaa työ neljään vaiheeseen: keruu, raakavastauksen tallennus, normalisointi ja analysointi. Keruu tekee API-kutsun jokaisella hyväksytyllä avainsanalla. Raakavastaus tallennetaan kokonaisuudessaan myöhempää tarkistusta varten. Normalisointi muuntaa sisäkkäisen JSON-rakenteen taulukon riveiksi, ja analyysissä lasketaan mittareita ja ryhmitellään videoita avainsanojen tai käsin määriteltyjen sisältömuotojen mukaan.
- Keruu. Pyydä jokaisella avainsanalla määrätty määrä tuloksia käyttäen samaa aluetta ja lajittelua.
- Arkistointi. Tallenna alkuperäinen JSON ja noutoaika, jotta poimittujen arvojen oikeellisuuden voi tarkistaa.
- Normalisointi. Säilytä videon tunniste, linkki, kuvaus, tekijä, julkaisuaika ja saatavilla olevat mittarilukemat.
- Laadunvalvonta. Poista kaksoiskappaleet tunnisteen perusteella, merkitse puuttuvat arvot ja säilytä avainsana, jolla video löytyi.
- Vertailu. Laske omat tunnusluvut vain saatavilla olevista lähdekentistä ja vertaa ryhmiä saman tilannekuvan sisällä.
Tämä lähestymistapa on linkkilistaa parempi, koska se säilyttää rivin alkuperän ja auttaa erottamaan saman videon löytymisen uudelleen uudesta sisällöstä. Tallenna myös keruupäivä: julkiset mittarilukemat voivat muuttua, joten tämän päivän vastauksen arvoa ei pidä tulkita videon pysyväksi ominaisuudeksi.
Mitä TikTok Scraper API tukee
Tekstikyselyllä tehtävää videohakua varten jsonscraperin dokumentaatiossa kuvataan GET-reitti /searchVideo perusosoitteessa https://tiktok.evelode.com. Pakollinen parametri on keyword; käytettävissä ovat myös count, cursor, region, date_posted, sort_by ja cache_timeout. Dokumentaatiossa luetellaan lajitteluvaihtoehdot most-liked, relevance ja date-posted sekä julkaisuajanjaksot yesterday, this-week, this-month, last-3-months, last-6-months ja all-time. Tarkista parametrien nimet ja tarkoitukset TikTok-reittien ohjeesta.
Avain välitetään kyselyparametrina license_key. Tuotantoskriptissä se kannattaa tallentaa ympäristömuuttujaan JSONSCRAPER_TIKTOK_LICENSE_KEY, ei lähdekoodiin, taulukkoon tai ajolokiin. Tarkista vastauksen ylätason status ja käsittele sitten tiktok-objekti. Haun rakenne voi sisältää aweme_list-listan sekä search_item_list-listan, jonka sisällä videon tiedot ovat aweme_info-kentässä. Alla oleva koodi tukee molempia rakenteita.
Vahvistetuissa hakuvastauksen esimerkeissä on videon tunniste, kuvaus, julkaisuaika, linkki, tekijän tiedot sekä mittareita, kuten näyttökerrat, tykkäykset, kommentit, tallennukset ja jaot. Yksittäisestä tietueesta voi puuttua kenttiä. Jätä tällaiset arvot taulukossa tyhjiksi sen sijaan, että korvaisit ne nollalla: nolla tarkoittaa mitattua arvoa, tyhjä kenttä puolestaan sitä, ettei arvoa ollut vastaanotetussa objektissa.
Yksinkertainen Python-esimerkki
Alla oleva skripti tekee yhden kyselyn kutakin avainsanaa kohti, tallentaa koko vastauksen JSON-tiedostoon ja muodostaa CSV-tiedoston taulukkolaskentaa tai jatkokäsittelyä varten. Se on tarkoitettu Python 3.8:lle tai uudemmalle ja käyttää vain vakiokirjastoa. Aseta lisenssiä sisältävä ympäristömuuttuja ennen käynnistystä. Muokkaa avainsanalistaa ja tulosten määrää omaan käyttötapaukseesi sopivaksi.
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 = ["termosjuomapullo", "urheilujuomapullo", "juomapullon pakkauksen avaus"]
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 palautti muun kuin ok-tilan")
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("Tallennettiin", len(records), "videoriviä tiedostoon tiktok_creatives.csv")
Skripti tallentaa avainsanan videon yhteyteen, mikä on tärkeää, jos sama video löytyy usealla kyselyllä. Tässä kaksoiskappaleet poistetaan kunkin avainsanan sisällä, joten sama tunniste voi olla omalla rivillään eri hakusanoille. Jos haluat yhtenäisen taulukon ilman toistoja, korvaa avain (keyword, video_id) avaimella video_id ja kerää avainsanat listaan tai erilliseen linkitystaulukkoon.
Koodi tekee tarkoituksella yhden kyselyn kutakin sanaa kohti eikä käy sivuja automaattisesti läpi. Jos tarvitset seuraavan sivun, dokumentaation mukaan cursor on edellisestä vastauksesta saatava arvo, jolla tuloksia selataan eteenpäin. Käsittele sitä läpinäkymättömänä arvona äläkä laske sitä itse. Tarkista sivutus testivastauksella omaa työnkulkuasi varten ja lopeta, kun uusia tuloksia tai seuraavaa kohdistinta ei ole.
Näin saat vertailukelpoisen taulukon
CSV-tiedoston voi avata taulukkolaskentaohjelmassa, ladata tietokantaan tai käyttää Pythonissa koosteiden laskemiseen. Jaa ensiraportissa rivit keruupäivän, avainsanan ja videon muodon mukaan. Muoto kannattaa merkitä kuvauksen ja itse videon tarkastelun jälkeen, esimerkiksi ”esittely”, ”pakkauksen avaus”, ”arvostelu” tai ”vertailu”. Pienen otoksen voi luokitella käsin tai pyytää mallia tekemään alustavan luokittelun, jonka ihminen tarkistaa.
Jos luokittelet tekstejä automaattisesti, anna mallille vain tarvittavat kentät, kuten kuvaus ja tunniste, ja pyydä sitä palauttamaan yksi ennalta hyväksytyn luettelon luokista. Säilytä alkuperäinen kuvaus luokittelutuloksesta erillään. Näin analyytikko voi tarkistaa epäselvän luokan ja laskea raportin uudelleen taksonomian muuttuessa ilman uutta API-kyselyä.
Käytä vertailumittareissa samalla keruuhetkellä saatuja arvoja. Esimerkiksi tykkäysten suhteen näyttökertoihin voi laskea likes / views, kun molemmat kentät ovat saatavilla ja näyttökertoja on enemmän kuin nolla. Vastaavasti voi laskea kommenttien tai jakojen osuuden. Nämä suhdeluvut kuvaavat kyseisen videon julkisia laskureita kyseisellä hetkellä; ne eivät mittaa tietyn yleisön tavoittamista, loppuun katsomista tai konversiota. Yhdistä ne liiketoimintapäätöksiä varten oman kampanjasi tietoihin ja käytä niitä ideoiden valintaa ohjaavina suuntaviivoina, älä lupauksena siitä, että kilpailijan muodon toistaminen tuottaa saman tuloksen.
Mediaani on usein keskiarvoa hyödyllisempi, jos otoksessa on muutama erittäin suosittu video. Vertaa ryhmien näyttökertojen ja reaktioiden mediaaneja vain, jos keruusäännöt ovat samat: samat kyselyt, alue ja aikarajaus sekä ajankohdaltaan lähellä toisiaan olevat tilannekuvat. Tallenna ajon parametrit ja päivämäärä. Jos haun tai otoksen muuttaminen muuttaa rivien koostumusta, raporttien välinen ero voi johtua myös menetelmän muutoksesta.
Uudelleenajo ja muutosten seuranta
Voit muuttaa kertaluonteisen analyysin seurannaksi ajamalla skriptin aikataulun mukaan, esimerkiksi päivittäin tai viikoittain, ja lisäämällä jokaiseen tietueeseen keruupäivän. Tallenna jokaisen videon kohdalla parit ”tilannekuvan aika – mittarilukema”. Näin näet, miten julkiset mittarit muuttuvat havaintojen välillä, ja jokainen mittauspiste säilyy erillisenä. Älä korvaa vanhoja mittarilukemia nykyisillä, sillä muuten kehitys katoaa.
Tuotantokäytössä siirrä raakamuotoinen JSON paikallisesta kansiosta objektitallennukseen tai muuhun arkistointijärjestelmään ja normalisoidut rivit tietokantaan, jossa on yksilöllinen avain, esimerkiksi videon tunnisteen ja keruuajan yhdistelmä. Lisää virheloki ilman salaista avainta, rajoita uudelleenyritysten määrää ja lähetä ilmoitus epäonnistuneesta kyselystä. Tilapäisen virheen jälkeen kyselyn voi tehdä uudelleen viiveellä; rakenteellisen virheen kohdalla vastaus kannattaa tallentaa ja merkitä ajo tarkistettavaksi, jotta virhe ei tuota huomaamatta tyhjää raporttia.
Älä käytä cursor-arvoa tutkimuksen pysyvänä tunnisteena: se on tulosjoukon jatkomerkki. Tallenna se vastaavan kyselyn parametrien kanssa, käytä sitä vain kyseisen tulosjoukon jatkamiseen äläkä sekoita eri avainsanojen sivuja toisiinsa. Kirjaa myös käsiteltyjen tulosten todellinen määrä: pyydetty count-arvo määrittää toivotun vastauskoon, mutta ei takaa kaikkien sopivien julkaisujen kattavaa löytymistä.
Näin laajennat työnkulkua
Jos hakutulokset ovat liian kohinaisia, voit seurata erikseen tiettyjä julkisia profiileja tai hashtageja. Dokumentaatiossa on reitit /getUserFeed ja /getHashtagFeed, joissa on kysely- ja sivutusparametrit. Nämä ovat erillisiä otoksia, joilla on omat jatkamissääntönsä: profiilin syötteessä käytetään max_cursor-arvoa ja hashtag-syötteessä cursor-arvoa. Lisää ne erillisiksi lähteiksi ja tallenna lähteen tyyppi sekä parametrit, jotta avainsanahaun tuloksia ei sekoiteta profiilin tai hashtagin julkaisuihin.
Tiimi, jolla ei ole omaa infrastruktuuria, voi siirtää CSV-tiedot Google Sheetseihin API:n kautta: Google Sheets API:n dokumentaatio kuvaa soluarvojen lukemista ja kirjoittamista. Luo omat välilehdet raakakeruille, normalisoiduille videoille ja yhteenvedolle. Tämä sopii yhteiseen luokitteluun; kun historiatietojen määrä käy taulukkolaskentaan hankalaksi, siirrä rivit SQL-tallennukseen säilyttäen samat kentät ja tietojen alkuperä.
Tekoälyagentin sopiva tehtävä on laatia lyhyt yhteenveto jo kerätyistä ja normalisoiduista tietueista: ryhmitellä kuvauksia, ehdottaa sisältömuotoja ja nostaa esiin poikkeavia arvoja. Agentin ei pidä antaa muodostaa koko alustaa koskevia väitteitä pienen tulosjoukon perusteella. Anna sille ajanjakso, kyselylista ja rivien määrä, pyydä viittaamaan videoiden tunnisteisiin ja palauttamaan epävarmat tai puuttuvat kentät tyhjinä. Analyytikko tarkistaa sitten esimerkit tallennettujen linkkien avulla.
Mitä saat lopputulokseksi
Asetusten jälkeen tiimillä on toistettava rekisteri löydetyistä videoista. Se sisältää tunnisteet, linkit, kuvaukset, tekijät, julkaisuaikojen tiedot sekä saatavilla olevat julkiset mittarilukemat. Tallennettu raakavastaus mahdollistaa muunnosten tarkistamisen, ja CSV:stä voi lajitella videoita, suodattaa avainsanoittain ja vertailla eri päivien tilannekuvia. Tiedoista voi tehdä viikoittaisen yhteenvedon: mitkä muodot toistuivat, mitkä julkaisut kannattaa katsoa ja mitkä sisältöideat kannattaa testata omassa tekemisessä.
Käytännön tulos ei ole yleispätevä kilpailijoiden paremmuusjärjestys vaan kurinalaisesti koottu otos, jonka alkuperä tunnetaan. Sen laatu riippuu valituista kyselyistä, suodattimista ja seuranta-ajanjaksosta. Tallenna siis keruuparametrit, tarkista yksittäisiä videoita käsin ja erota saatavilla olevat mittarit niiden tulkinnasta. Näin hajanaiset kirjanmerkit voi korvata vertailukelpoisella datalla ja keskustella sisällöistä konkreettisten esimerkkien avulla.
Hakureitin ja parametrit voi tarkistaa jsonscraperin virallisesta dokumentaatiosta, ja palvelun kuvaus sekä käyttöoikeudet ovat TikTok Scraper API -sivulla. Aloita muutamalla hakulausekkeella, tallenna yksi testivastaus ja tarkista sen rakenne ennen aikataulutetun ajon määrittämistä.