צוות המכירות מקבל את אותה שאלה בערוצים שונים: אילו משימות לקוחות פוטנציאליים כבר מנסים לפתור? חיפוש ידני ב-TikTok מניב אוסף סרטונים, אבל קשה לחזור עליו כעבור שבוע, להשוות תוצאות ולהסביר מדוע סרטון מסוים נכלל בדוח. למחקר מצומצם אפשר להפוך תוצאות ציבוריות של כמה שאילתות מדויקות לזרם נתונים שניתן לשחזר: לשמור את התשובה הגולמית, לחלץ את פרטי הסרטון והיוצר, להסיר כפילויות ולהעריך בנפרד סימנים לכוונת רכישה או לבחירת מוצר.

להלן תהליך עבודה מעשי ב-Python באמצעות TikTok Scraper API של jsonscraper. הוא מתאים, למשל, לשירות לעריכת וידאו שרוצה לבדוק כיצד יוצרים מתארים קשיים בכתוביות, בתבניות ובייצוא. הסקריפט אוסף את תוצאות החיפוש שמוחזרות, ואנליסט בודק לאחר מכן את הסיווג ומחליט אילו ניסוחים כדאי להשתמש בהם במחקר הקהל. זו דרך לארגן מעקב אחר תוכן ציבורי, ולא ספירה אוטומטית של כל המשתמשים בעלי כוונת רכישה.
הבעיה: יש שאילתות של הקהל, אבל קשה לחזור על המחקר
מחקר ידני מאבד בקלות את ההקשר. עובד אחד מחפש „איך להוסיף כתוביות”, אחר מחפש „כתוביות אוטומטיות ל-Reels”, ושלישי שומר רק סרטונים שאהב. בטבלה הסופית מתערבבים שאילתות, תאריכים, מדדים וקריטריונים שונים לבחירה. כשמנהל מבקש לחזור על הניתוח או להשוות בין שבועיים, צריך לשחזר לא רק את התוצאות אלא גם את תהליך החיפוש עצמו.
עדיף להגדיר מראש את יחידת התצפית: סרטון שנמצא, עם טקסט התיאור, מזהה, קישור, יוצר ומדדים ציבוריים זמינים. לכל סרטון שומרים את שאילתת החיפוש המקורית ואת מועד האיסוף. כך אפשר לענות בנפרד על שאלות כגון: אילו ניסוחים מופיעים, אילו בעיות מוזכרות, אילו סרטונים זכו ליותר תגובות ציבוריות ומה השתנה בין תמונות מצב שנשמרו.
לצורך הדוגמה ניקח חברה שמפתחת כלי ליצירת כתוביות וסרטונים קצרים. חשוב לה למצוא סרטונים ציבוריים שבהם יוצרים דנים במפורש בתמלול ידני, בשגיאות זיהוי דיבור, בתזמון כתוביות או בהכנת תוכן למספר פלטפורמות. אין לתייג את היוצר כ„ליד” או כ„קונה” על סמך סרטון יחיד: חוקר יכול לדרג את התוכן לפי סימנים נצפים, ואז לבדוק את המסקנות ידנית.
מתווה הפתרון: חיפוש, תיעוד, ניקוי והערכה
צינור העבודה מורכב מארבעה שלבים. תחילה הצוות מגבש מילון קטן של שאילתות חיפוש, שכל אחת מהן תואמת משימה מסוימת של הקהל. לאחר מכן הסקריפט מבקש חיפוש סרטונים ושומר את תשובת ה-JSON המלאה. בשלב השלישי מנרמלים מבני תשובה שונים לשורה אחידה לכל סרטון ומסירים כפילויות לפי מזהה. לבסוף, כללים או מסווג AI נפרד מקצים עדיפות לבדיקה ידנית תוך שמירת הסיבה להערכה.
הפרדת השלבים האלה חשובה לשחזור. התשובה הגולמית עוזרת לחקור שינויים בשדות או שגיאות נרמול. טבלה מנורמלת נוחה לסינון ולהמחשה חזותית. טבלת הערכות נפרדת מאפשרת לשנות את הכללים בלי לשלוח שוב בקשת API, אם הנתונים השמורים מתאימים לעיבוד חוזר כזה ועומדים במדיניות השמירה של הצוות.
כשאילתות בסיסיות אפשר לבחור „שגיאות בכתוביות אוטומטיות”, „איך להוסיף כתוביות במהירות” ו„עריכת סרטונים קצרים לעסקים”. אלה רק דוגמאות למילון: יש להתאים את הניסוחים לשפת הקהל ולמוצר. יש לשמור את השאילתות לצד התוצאות, כי חיפושים לפי מילים שונות יוצרים מדגמים שונים.
מה מספק TikTok Scraper API
בתיעוד שפרסמה jsonscraper עבור חיפוש סרטונים מצוין נתיב GET בשם /searchVideo בכתובת הבסיס https://tiktok.evelode.com. הפרמטר הנדרש הוא keyword; בין הפרמטרים הנוספים המתועדים נמצאים count, cursor, region, date_posted, sort_by ו-cache_timeout. לדוגמה, sort_by מקבל את הערכים המתועדים most-liked, relevance ו-date-posted, ואילו date_posted מקבל ערכים כגון this-week או all-time. הרשימה המדויקת של הפרמטרים ותיאור הנתיב מופיעים במדריך נקודות הקצה של TikTok API.
המפתח מועבר כפרמטר שאילתה בשם license_key. בדוגמה שלהלן הוא נקרא ממשתנה הסביבה JSONSCRAPER_TIKTOK_LICENSE_KEY, כדי לא לשמור סוד בקוד ולא להדפיס אותו ליומן. לצורך אימות ובחירת פרמטרים, פעלו לפי תנאי הגישה העדכניים שלכם; בדף TikTok Scraper API מופיעים תיאור המוצר וקישורים להדגמה ולתיעוד.
יש לנתח את תשובת החיפוש לפי המבנה שלה, ולא להניח שיש בה מערך יחיד בלבד. בדוגמה שנבדקה, ה-API החזיר סטטוס ברמה העליונה ואובייקט tiktok; סרטונים עשויים להימצא ב-tiktok.aweme_list, ובתוצאות חיפוש מופיע גם המבנה tiktok.search_item_list[].aweme_info. בדקו את שתי הצורות. באובייקטים שנמצאו זמינים, אם השדות קיימים, מזהה הסרטון, התיאור, הקישור, מועד הפרסום, פרטי היוצר ונתונים סטטיסטיים כגון צפיות, לייקים, תגובות ושיתופים. יש להתייחס למדדים ולשדות כאל שדות אפשריים ולא מובטחים: הקוד לא אמור להציב אפסים מומצאים במקום ערכים חסרים.
העימוד של החיפוש משתמש ב-cursor. אם הסקריפט ממשיך לקבל תוצאות, עליו להעביר את הערך שהתקבל כאסימון אטום לבקשה הבאה, ולא לחשב אותו בעצמו. לאב-טיפוס ראשוני סביר להגביל את האיסוף לעמוד אחד לכל שאילתה: כך הבדיקה פשוטה יותר והעומס צפוי, ובהמשך אפשר להוסיף עימוד עם הגבלה על מספר העמודים והגנה מפני סמן חוזר.
הכנת סביבת העבודה
הדוגמה משתמשת ב-Python 3.8 ומעלה ובספרייה הסטנדרטית. הגדירו את המפתח במשתני הסביבה, למשל במעטפת macOS או Linux:
export JSONSCRAPER_TIKTOK_LICENSE_KEY="המפתח_שלכם"
python tiktok_demand.py
ב-Windows PowerShell אפשר להגדיר את המשתנה כך:
$env:JSONSCRAPER_TIKTOK_LICENSE_KEY="המפתח_שלכם"
python .\tiktok_demand.py
הסקריפט שולח בקשה נפרדת לכל מילת מפתח. הוא בודק שגיאות HTTP, את תשובת ה-JSON ואת הסטטוס החיצוני, ואז מחלץ אובייקטים משתי הווריאציות המאומתות של המערך. התשובות הגולמיות נכתבות לקובץ JSONL, שורה לכל רשומה: כל רשומה כוללת את השאילתה, מועד התצפית והתשובה המקורית. החלק השני יוצר CSV עם שדות אחידים. קובץ המפתח אינו נמצא בקוד, ותוכן הסוד אינו מודפס.
דוגמה: איסוף ונרמול תוצאות חיפוש
import csv
import json
import os
import time
from datetime import datetime, timezone
from pathlib import Path
from urllib.error import HTTPError, URLError
from urllib.parse import urlencode
from urllib.request import Request, urlopen
BASE_URL = "https://tiktok.evelode.com/searchVideo"
QUERIES = [
"שגיאות בכתוביות אוטומטיות",
"איך להוסיף כתוביות במהירות",
"עריכת סרטונים קצרים לעסקים",
]
def extract_videos(payload):
"""תומך בשני מבני תשובת החיפוש שנצפו."""
tiktok = payload.get("tiktok") or {}
videos = []
aweme_list = tiktok.get("aweme_list") or []
if isinstance(aweme_list, list):
videos.extend(item for item in aweme_list if isinstance(item, dict))
search_items = tiktok.get("search_item_list") or []
if isinstance(search_items, list):
for item in search_items:
if not isinstance(item, dict):
continue
video = item.get("aweme_info")
if isinstance(video, dict):
videos.append(video)
return videos
def fetch(query, license_key):
params = {
"keyword": query,
"count": 20,
"sort_by": "relevance",
"date_posted": "this-month",
"region": "US",
"license_key": license_key,
}
url = BASE_URL + "?" + urlencode(params)
request = Request(url, headers={"Accept": "application/json"})
try:
with urlopen(request, timeout=45) as response:
payload = json.loads(response.read().decode("utf-8"))
except HTTPError as exc:
raise RuntimeError("ה-API החזיר סטטוס HTTP {}".format(exc.code)) from exc
except (URLError, TimeoutError, json.JSONDecodeError) as exc:
raise RuntimeError("לא ניתן להשלים או לנתח את בקשת ה-API") from exc
if payload.get("status") != "ok":
raise RuntimeError("סטטוס תשובת ה-API לא היה ok")
return payload
def metric(statistics, key):
value = statistics.get(key)
return value if isinstance(value, (int, float)) else ""
def main():
license_key = os.environ.get("JSONSCRAPER_TIKTOK_LICENSE_KEY")
if not license_key:
raise SystemExit("הגדירו את JSONSCRAPER_TIKTOK_LICENSE_KEY במשתני הסביבה")
raw_path = Path("tiktok_raw.jsonl")
csv_path = Path("tiktok_videos.csv")
seen_ids = set()
rows = []
with raw_path.open("a", encoding="utf-8") as raw_file:
for query in QUERIES:
observed_at = datetime.now(timezone.utc).isoformat()
payload = fetch(query, license_key)
raw_file.write(json.dumps({
"query": query,
"observed_at": observed_at,
"response": payload,
}, ensure_ascii=False) + "\n")
for video in extract_videos(payload):
video_id = video.get("aweme_id")
if not video_id or video_id in seen_ids:
continue
seen_ids.add(video_id)
author = video.get("author") or {}
stats = video.get("statistics") or {}
rows.append({
"query": query,
"observed_at": observed_at,
"video_id": video_id,
"created_at": video.get("create_time", ""),
"description": video.get("desc", ""),
"share_url": video.get("share_url", ""),
"author_username": author.get("unique_id", ""),
"author_nickname": author.get("nickname", ""),
"views": metric(stats, "play_count"),
"likes": metric(stats, "digg_count"),
"comments": metric(stats, "comment_count"),
"shares": metric(stats, "share_count"),
})
time.sleep(1)
columns = [
"query", "observed_at", "video_id", "created_at", "description",
"share_url", "author_username", "author_nickname", "views",
"likes", "comments", "shares",
]
with csv_path.open("w", newline="", encoding="utf-8") as csv_file:
writer = csv.DictWriter(csv_file, fieldnames=columns)
writer.writeheader()
writer.writerows(rows)
print("נשמרו {} סרטונים ייחודיים שהוחזרו בקובץ {}".format(len(rows), csv_path))
if __name__ == "__main__":
main()
הערך count מוגדר כאן כמספר הרשומות המבוקש לכל שאילתה. הסקריפט אינו מניח שה-API חייב להחזיר בדיוק את המספר הזה: מספר השורות בפועל תלוי בתשובה. ההשהיה בין הבקשות היא אמצעי פשוט לניהול קצב ההרצה, ולא טענה בדבר מגבלה או דרישה של השירות. בהפעלה מתוזמנת בסביבת ייצור, הוסיפו טיפול בניסיונות חוזרים עם הגבלה, ניטור שגיאות וכללים לתדירות בקשות מותרת, בהתאם לתנאי התוכנית שלכם.
כיצד לקרוא את הטבלה שהתקבלה
ב-CSV כל שורה מייצגת סרטון ייחודי שהוחזר ונמצא באמצעות אחת השאילתות. השדה query מציין את מקור הרשומה, observed_at מציין את מועד תמונת המצב, ו-video_id משמש כמפתח להסרת כפילויות. התיאור והקישור עוזרים לאנליסט לבדוק את ההקשר, ומוני התגובות הציבוריים עוזרים להעריך את התגובה בעת האיסוף. להשוואה ארוכת טווח, השתמשו בתצפיות נפרדות: אל תדרסו את היסטוריית המדדים אם חשוב לעקוב אחר השינוי שלהם.
מוני הצפיות, הלייקים, התגובות והשיתופים הם תמונת מצב של הנתונים הסטטיסטיים הציבוריים שה-API החזיר בזמן הבקשה. הם עשויים להיעדר באובייקטים מסוימים, ולכן ערך ריק ב-CSV מציין ששדה מספרי לא הופיע בתשובה. הוא שונה מאפס ויש לטפל בו בנפרד בעת חישוב צבירות. נוסף על כך, התוצאות שנמצאו משקפות את מדגם התוצאות עבור מילים, אזור, מסנן זמן ופרמטרים מסוימים. הן מתארות את הסרטונים שהתקבלו, ולא את מלוא התוכן או הקהל של הפלטפורמה.
להערכה ראשונית של רלוונטיות אפשרית, אפשר לבנות טבלת כללים שקופה: התאמות לניסוחי בעיות, אזכורים של הכלי שבו משתמשים, שאלות על מחיר או השוואה, וקיומו של תרחיש עבודה מוגדר. עדיף לשמור סימנים נפרדים והסבר להערכה, במקום לרשום רק ציון בלתי מוסבר. למשל, אפשר לסמן סרטון ששואל על דיוק התמלול האוטומטי כ„לבדיקה: נדונה איכות”, וסרטון עם עצות כלליות לתוכן כ„רלוונטיות נושאית נמוכה”.
שילוב AI בלי להפוך אותו לשופט
לאחר שנצבר מדגם, מודל יכול לסייע בתיוג תיאורים לפי סכימה שהוגדרה מראש: בעיה, כלי שהוזכר, ניסוח השאלה וקיומו של סימן לבחירת מוצר. העבירו למודל רק את השדות הדרושים — למשל, טקסט התיאור ומזהה הרשומה — ובקשו ממנו להחזיר JSON מובנה וקבוע, עם תוויות והצדקה קצרה. שמרו את גרסת ההנחיה, המודל והתוצאה לצד השורה המקורית, כדי שאפשר יהיה לבצע תיוג חוזר או לבדוק מדגם באופן ידני.
הנחיה טובה למסווג צריכה להגביל את ההסקה לסימנים נצפים. בקשו לקבוע אם הטקסט מכיל בעיה מפורשת בכתוביות, בקשה להמלצה על כלי או דיון בתהליך עבודה. אם אין די מידע, הוסיפו קטגוריה „אין די הקשר”. המודל לא אמור להסיק את זהות היוצר, את כוונת הרכישה שלו או מאפיינים דמוגרפיים מתוך סרטון ציבורי יחיד. התוצאה היא תור נושאים לניתוח, ולא רשימת אנשים ליצירת קשר אוטומטית.
כדי להעריך את איכות התיוג, בחרו מדגם אקראי וסמנו את אותן קטגוריות באופן ידני. השוו את מידת ההתאמה לכל תווית ובדקו את השגיאות: למשל, ייתכן שהמודל יפרש סרקזם כתלונה או עצה לימודית כחוויה אישית. לעיתים קרובות, תיקון מילון השאילתות וההנחיה מועיל יותר מסיבוך המודל באופן מיידי. בדוח, שמרו את הטקסטים המקוריים והקישורים בהתאם למדיניות השמירה והגישה שאומצה.
אוטומציה מתוזמנת ובקרת איכות
לאחר שההרצה הידנית מצליחה, אפשר להריץ את הסקריפט לפי לוח זמנים באמצעות cron, מתזמן משימות של פלטפורמת ענן או מתזמר כגון n8n. רצף הפעולות המעשי נשאר זהה: לקרוא את רשימת השאילתות, לקרוא ל-API, לבדוק את הסטטוס, לשמור את התשובה הגולמית, לנרמל סרטונים, לתעד תמונות מצב חדשות ולהפיק דוח. העבירו את המפתח באמצעות מנגנון הסודות של סביבת ההרצה, ולא בטבלה, בטקסט של workflow או בהודעת שגיאה.
במשימה אוטומטית כדאי לבצע ארבע בדיקות. הראשונה — שהבקשה הושלמה בהצלחה ושהתשובה היא JSON. השנייה — שהסטטוס החיצוני תואם לערך הצפוי. השלישית — שהמטפל מבין את שתי הווריאציות של מבנה החיפוש ומתמודד כראוי עם שדות חסרים. הרביעית — שמספר הסרטונים הייחודיים החדשים ומספר השגיאות נרשמים ביומן. אם לפתע לא מתקבלות תוצאות, הדוח צריך להציג מדגם ריק כמצב של ההרצה, ולא לערבב אותו עם דוח הצלחה רגיל ללא הסבר.
הוסיפו עימוד רק לאחר שבדקתם את העמוד הראשון. בתיעוד של נתיב החיפוש מצוין הפרמטר cursor; שמרו את האסימון שהתקבל והעבירו אותו ללא שינוי בבקשה הבאה. הגבילו את מספר העמודים המרבי לכל מונח חיפוש, והפסיקו את הלולאה כאשר אין פריטים חדשים, כאשר אין סמן המשך או כאשר מופיע שוב סמן שכבר עובד. הגבול הזה מאפשר לשלוט במשך ההרצה ובגודל האיסוף. קיומו של סמן מאפשר לבקש המשך של התוצאות, אך אינו מבטיח שלמות ביחס לכל הפרסומים.
הרצה חוזרת באותו יום עשויה להחזיר סרטונים חופפים. לכן מפתח הסרת הכפילויות צריך להיות מזהה סרטון יציב, ואילו היסטוריית תמונות המצב צריכה להישמר כרשומות נפרדות עם תאריך התצפית. אם דרושה תצוגה מסכמת, בנו אותה על בסיס תמונות המצב: כך אפשר להבחין בין סרטון שנמצא לראשונה לבין סרטון שהופיע בכמה שאילתות או התקבל שוב במועד מאוחר יותר.
מדדים: מה אפשר להשוות באופן תקין
לניטור תפעולי מועילים מספר הסרטונים הייחודיים שנמצאו לכל שאילתה, שיעור הסרטונים שיש להם תיאור, התפלגות התגובות הזמינות ותדירות הופעתם של נושאים מסוימים. בהשוואת שאילתות, הקפידו על פרמטרים ומועדי הרצה זהים. אם בהרצה אחת משתמשים ב-this-week ובאחרת ב-this-month, ההבדל בנפח עשוי לנבוע מחלון הזמן, ולכן אין לפרש אותו כשינוי בעניין בלי ניתוח נוסף.
השוואת מדדים של אותו סרטון לאורך זמן דורשת כמה תמונות מצב וסכימת אחסון אחידה. שמרו לכל תאריך את הערכים המקוריים כפי שהתקבלו, ואז חשבו את ההפרש בין התצפיות. אל תקראו להפרש „עלייה יומית” אם המרווחים בין ההרצות בפועל היו שונים. בדומה לכך, דירוג לפי לייקים עוזר למצוא סרטונים בולטים במדגם שנאסף, אך אינו מודד את היעילות המסחרית של היוצר או המוצר.
הדוח הסופי לצוות השיווק יכול לשלב שלוש שכבות: דוגמאות לניסוחי הקהל עם קישורים ניתנים ללחיצה, קבוצות נושאיות של בעיות ותיאור כמותי של המדגם שהתקבל. כדאי ללוות כל מסקנה במספר התצפיות, בשאילתות ובתקופת האיסוף. כך המנהל מקבל הקשר, והאנליסט יכול לחזור על הסינון באמצעות אותם נתונים מקוריים.
טעויות נפוצות וכיצד להימנע מהן
התייחסות לשדה ריק כאילו ערכו אפס
אם חסרים נתונים סטטיסטיים או פרטי יוצר, הקוד שלמעלה משאיר את התא ריק. כך נשמר ההבדל בין ערך לא ידוע לבין אפס שנמדד. בניתוח הנתונים, הגדירו במפורש כללים לטיפול בערכים חסרים וציינו כמה שורות הוצאו מכל חישוב.
הנחה שהחיפוש תמיד מחזיר מערך אחד
בתשובת החיפוש מופיעים גם aweme_list וגם פריטים מקוננים במבנה search_item_list[].aweme_info. המטפל בודק את שתי הצורות ומתעלם מפריטים מסוג לא מתאים. אם הסכימה תשתנה, התשובות הגולמיות שנשמרו יסייעו לזהות במהירות את מיקום הנתונים החדש, וקובצי JSON לדוגמה יאפשרו לבדוק את התיקון לפני ההרצה הבאה.
ספירה חוזרת של אותו סרטון כסימן נפרד
סרטון אחד עשוי להתאים לכמה מילות חיפוש. בדוגמה הוא נכלל ב-CSV הסופי פעם אחת בלבד, ושדה השאילתה מציין את ההתאמה הראשונה לפי הסדר הנוכחי. אם חשוב לשמור את כל ההתאמות „סרטון — שאילתה”, אחסנו טבלת קשר נפרדת או רשימת שאילתות לכל מזהה, במקום למחוק את מקור הרשומה.
השוואת מדגמים שאינם בני-השוואה
המילה, האזור, מסנן הזמן, המיון ותאריך ההרצה משפיעים על המדגם. שמרו את הפרמטרים לצד התשובה ושנו גורם אחד בכל פעם כאשר המחקר משווה בין חלופות. כך אפשר להבין אם שינוי בתוצאה קשור להתנהגות מנגנון התוצאות או לשינוי בהגדרות הניסוי.
הצגת מתאם ככוונת רכישה
תיאור הסרטון ומוני התגובות הציבוריים מספקים סימנים לגבי התוכן ותגובת הקהל. כשלעצמם, הם אינם מראים מי מוכן לקנות, אם אדם ראה פרסומת או מה שיעור ההמרה. השתמשו בהם לגיבוש השערות, לבדיקת נושאים ולהכנת תוכן. את יעילות המכירות יש להעריך באמצעות נתוני הקמפיינים שלכם, תוך התאמה למחקר בזמן ובקהל.
כיצד להרחיב את צינור העבודה
כשהגרסה הבסיסית פועלת באופן יציב, אפשר להוסיף קובץ תצורה עם רשימת שאילתות ופרמטרי הרצה, כדי לשנות את המילון בלי לערוך את קוד Python. השלב הבא הוא טבלת מיפוי בין שאילתות לאשכולות נושאיים, למשל „איכות הזיהוי”, „מהירות העריכה” ו„ייצוא”. על הצוות להגדיר את הקטגוריות האלה ולבדוק אותן באמצעות דוגמאות; ה-API מחזיר נתוני חיפוש, ואילו החוקר מגדיר את הסכימה הסמנטית.
במקום CSV אפשר להשתמש במסד נתונים יחסי: טבלת הרצות, טבלת סרטונים וטבלת תמונות מצב של מדדים. אינדקס ייחודי על מזהה הסרטון מונע כפילות בקטלוג, ותמונות המצב מאפשרות לעקוב אחר השינויים במונים הזמינים. שמרו את מועד התצפית ב-UTC ואת גרסת המנרמל. אם לוגיקת החילוץ משתנה, אפשר לעבד מחדש את ארכיון JSONL ולהשוות את התוצאה.
ב-n8n אפשר להריץ את האיסוף לפי לוח זמנים, ולבצע את קוד הנרמול בשירות Python נפרד או בצומת, אם הסביבה שנבחרה תומכת בפעולות הנדרשות. בשלב הראשון אין חובה לשלב מודל: תחילה ודאו שהאיסוף יציב, ואז מדדו כמה זמן נמשך הסיווג הידני ואילו קטגוריות חוזרות. AI מוצדק כאשר הוא מצמצם עבודה חוזרת מסוימת ואפשר לבדוק את התוויות שלו.
אם שאלת העבודה עוסקת במעקב קבוע אחר חשבון מסוים ולא בחיפוש לפי ניסוחים, במדריך הרשמי יש נתיב נפרד בשם /getUserFeed עם הפרמטרים query, max_cursor ו-count. עבור האשטאג יש נתיב /getHashtagFeed עם הפרמטר cursor. אלה תרחישי איסוף שונים: בחירת נקודת הקצה צריכה להתחיל בשאלת המחקר, ולא בהחלפת סוג מדגם אחד באחר.
התוצאה: מדגם שניתן לשחזר במקום אוסף סימניות
לאחר ההרצה מקבל הצוות שני תוצרים שימושיים: ארכיון של התשובות המקוריות וטבלה של סרטונים ייחודיים עם מונח החיפוש, מועד התצפית, קישור, תיאור ומדדים זמינים. על בסיסם אפשר לקבץ שאלות של הקהל באופן ידני, להעביר טקסטים לסיווג מבוקר, להפיק סיכום שבועי ולהשוות תמונות מצב חוזרות. הקוד מטפל במפורש בשגיאות בקשה, בודק את הסטטוס החיצוני, מבחין בין שתי וריאציות של מבנה החיפוש ושומר מדדים חסרים כערכים חסרים.
התוצאה המעשית לצוות היא החלטה שקופה יותר לגבי הבעיות שכדאי לבדוק בריאיון, בדף נחיתה או במסר פרסומי. אם המחקר דורש סוג נתונים אחר, שנו את השאילתות או השתמשו בנתיב המתועד המתאים. לפני התאמת צינור העבודה, בדקו את הפרמטרים בתיעוד TikTok API; מידע על המוצר והכניסה להדגמה נמצאים בדף TikTok Scraper API.
הגישה הזאת נותנת מענה למשימה המקורית: להפוך את החיפוש ב-TikTok לתהליך מחקר שניתן לשחזר. הסקריפט אוסף סרטונים מסוימים שהוחזרו, שומר את מקורם ואת תמונות המצב, ואדם או מסווג שניתן לבדוק הופך את התוכן להשערות על ביקוש. הצוות מקבל בסיס להחלטה הבאה, תוך שמירה על ההבחנה בין סימנים ציבוריים בתוכן לבין תוצאות מכירה מאומתות.