jsonscraper

איך לזהות סימנים מוקדמים למגמות בטיקטוק: ניטור אוטומטי של תוצאות החיפוש

אספו תמונות מצב חוזרות של תוצאות לפי מילות מפתח, השוו מדדי סרטונים והפכו שינויים לאות שניתן לאמת עבור צוות התוכן.

מדיניות עריכה דיווח על שגיאה

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

כתבה: איך לזהות סימנים מוקדמים למגמות בטיקטוק: ניטור אוטומטי של תוצאות החיפוש
תקציר: חיפוש ידני בטיקטוק אינו מתאים לניתוח סדיר: התוצאות משתנות במהירות, וקל לטעות ולחשוב שסרטון בודד הוא מגמה. כך בונים ניטור יומי של שאילתות חיפוש באמצעות TikTok Scraper API של jsonscraper, שומרים את התשובות המקוריות, מנרמלים את הנתונים ומאתרים נושאים לבדיקה נוספת.
תפקיד התמונה: שער — הרעיון המרכזי
מקטע: 
נושא חזותי: A phy
© jsonscraper · איור שנוצר באמצעות בינה מלאכותית

להלן מתווה לניטור כזה ב-Python באמצעות TikTok Scraper API של jsonscraper. הוא מתאים, למשל, לסוכנות שעוקבת אחר כמה שאילתות נושאיות לצורך לוח הפרסומים, או למותג שרוצה לראות אילו סרטונים ציבוריים בנושא זוכים למספר צפיות ולתגובות בולט. ה-API מחזיר תוצאות חיפוש בטיקטוק, ובהן תיאור הסרטון, היוצר, תאריך הפרסום, הקישור ומונים זמינים. הסקריפט שומר כל תשובה בארכיון ויוצר תמונת מצב בפורמט CSV לניתוח.

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

למה חיפוש ידני אינו ניטור יעיל

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

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

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

מתווה הפתרון: חיפוש, ארכיון והשוואה

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

  1. הגדירו אוסף שאילתות. השתמשו בביטויים ספציפיים הקשורים למוצר, לענף או לצורכי הקהל. לדוגמה, מותג של מכשירי מטבח יכול לעקוב אחר ״meal prep״, ״air fryer recipes״ ושם של קטגוריית מוצר מסוימת. שמרו את רשימת השאילתות בקובץ הגדרות, במקום לקבע אותה בלוגיקת העיבוד.
  2. קבעו כללי איסוף. בחרו לוח זמנים ונפח קטן של תוצאות לניסוי. תעדו את התאריך, האזור ופרמטרי החיפוש. לצורך השוואה לאורך זמן, חשוב יותר לחזור על אותן הגדרות מאשר לנסות לאסוף את התשובה הרחבה ביותר בכל הרצה.
  3. שמרו את התשובה המקורית. שמרו את ה-JSON יחד עם זמן ההרצה ומילת החיפוש. הארכיון מאפשר לשחזר את הרשומה המקורית ולתקן את הנרמול בלי לשלוח שוב בקשה ל-API.
  4. נרמלו שדות מאומתים. חלצו רק שדות שנמצאים בתשובה: מזהה, כיתוב, זמן פרסום, יוצר, קישור וערכי סטטיסטיקה זמינים. השאירו ערך חסר ריק ואל תחליפו אותו באפס.
  5. השוו תמונות מצב. התאימו סרטונים לפי מזהה ושמרו כל תצפית בנפרד. לאחר מכן אפשר לאתר פרסומים חדשים בארכיון ולחשב את ההפרש בין ערכי המדדים שנצפו.

לבדיקה ראשונית, בחרו שתיים או שלוש שאילתות ומספר קטן של תוצאות. בדקו עד כמה התיאורים והיוצרים רלוונטיים למשימה שלכם, אילו שדות מתקבלים בפועל ועד כמה המדגם חוזר על עצמו בתנאים זהים. רק לאחר מכן כדאי להרחיב את רשימת המונחים ולהעביר את ההרצה ללוח זמנים קבוע.

מה אפשר לבקש באמצעות TikTok Scraper API

בתיעוד הרשמי של jsonscraper, הנתיב GET /searchVideo מיועד לחיפוש סרטונים לפי מילת מפתח. הפרמטר הנדרש הוא keyword. הפרמטרים האופציונליים המתועדים כוללים את count, cursor, date_posted, sort_by, region ו-cache_timeout. התיעוד מציין עבור date_posted ערכים כמו this-week ו-this-month, ועבור sort_by את relevance, most-liked ו-date-posted. השמות המדויקים ותפקידם מופיעים במדריך הנתיבים של TikTok API.

כתובת הבסיס של השירות היא https://tiktok.evelode.com; את המפתח מעבירים כפרמטר שאילתה בשם license_key. בדוגמה שלהלן המפתח נשמר במשתנה הסביבה JSONSCRAPER_TIKTOK_LICENSE_KEY. כך אין צורך להכניס את הסוד ישירות לקוד המקור או להדפיס אותו ביומן ההרצה.

יש לנתח את התשובה תוך התחשבות במבנה המקונן. תחילה בדקו את status החיצוני, ואז עברו לאובייקט tiktok. בחיפוש קיימות שתי צורות אפשריות לרשימה: הסרטונים עשויים להופיע ישירות ב-tiktok.aweme_list, וגם בתוך איברי tiktok.search_item_list שבכל אחד מהם aweme_info. עם זאת, aweme_list בתשובת חיפוש עשוי להיות ריק, אף שיש סרטונים ב-search_item_list. הסקריפט שלהלן תומך בשתי הצורות.

באובייקט הסרטון, התיעוד ודוגמת תשובה שנבדקה מציגים שדות כמו aweme_id, desc, create_time, share_url, פרטי היוצר ואובייקט statistics. הסטטיסטיקה עשויה לכלול מוני צפיות, לייקים, תגובות ושיתופים. יש לבדוק את קבוצת השדות ואת משמעותם בכל תשובה; הקוד משאיר שדות חסרים ריקים. דוגמת הנתיב והפרמטרים המתועדים שלו זמינים בתיאור TikTok Scraper API.

דוגמה מעשית ב-Python

הדוגמה מיועדת ל-Python 3.8 ומעלה ומשתמשת בחבילה requests. התקינו אותה באמצעות הפקודה python -m pip install requests. שמרו את הקוד בקובץ collect_tiktok.py, הגדירו את המפתח בסביבה והריצו את הסקריפט עם מילת חיפוש. הסקריפט יוצר את התיקייה data, שומר את ה-JSON המקורי ומוסיף תצפיות מנורמלות ל-CSV.

import csv
import json
import os
import sys
from datetime import datetime, timezone
from pathlib import Path
from urllib.parse import urlparse

import requests

BASE_URL = "https://tiktok.evelode.com"
ARCHIVE = Path("data/raw")
OUT_CSV = Path("data/observations.csv")


def get_videos(tiktok):
    """אוספים סרטונים מהווריאציות המאומתות של תשובת searchVideo."""
    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
            aweme_info = item.get("aweme_info")
            if isinstance(aweme_info, dict):
                videos.append(aweme_info)

    # מסירים כפילויות ושומרים על הסדר, כולל רשומות ללא מזהה.
    result = []
    seen = set()
    for video in videos:
        video_id = video.get("aweme_id")
        if video_id and video_id in seen:
            continue
        if video_id:
            seen.add(video_id)
        result.append(video)
    return result


def fetch(keyword, count=20, region="US"):
    license_key = os.environ.get("JSONSCRAPER_TIKTOK_LICENSE_KEY")
    if not license_key:
        raise RuntimeError("Set JSONSCRAPER_TIKTOK_LICENSE_KEY in the environment")

    params = {
        "license_key": license_key,
        "keyword": keyword,
        "count": count,
        "region": region,
        "sort_by": "relevance",
    }
    response = requests.get(
        f"{BASE_URL}/searchVideo", params=params, timeout=60
    )
    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")
    if not isinstance(tiktok, dict):
        raise RuntimeError("Response does not contain a TikTok result object")
    return payload, tiktok


def write_rows(keyword, videos, collected_at):
    OUT_CSV.parent.mkdir(parents=True, exist_ok=True)
    fields = [
        "collected_at", "keyword", "aweme_id", "create_time",
        "author_id", "author_name", "author_username", "description",
        "share_url", "play_count", "digg_count", "comment_count",
        "share_count", "collect_count",
    ]
    write_header = not OUT_CSV.exists()

    with OUT_CSV.open("a", newline="", encoding="utf-8") as file:
        writer = csv.DictWriter(file, fieldnames=fields)
        if write_header:
            writer.writeheader()

        for video in videos:
            author = video.get("author") or {}
            stats = video.get("statistics") or {}
            writer.writerow({
                "collected_at": collected_at,
                "keyword": keyword,
                "aweme_id": video.get("aweme_id"),
                "create_time": video.get("create_time"),
                "author_id": author.get("uid"),
                "author_name": author.get("nickname"),
                "author_username": author.get("unique_id"),
                "description": video.get("desc"),
                "share_url": video.get("share_url"),
                "play_count": stats.get("play_count"),
                "digg_count": stats.get("digg_count"),
                "comment_count": stats.get("comment_count"),
                "share_count": stats.get("share_count"),
                "collect_count": stats.get("collect_count"),
            })


def main():
    if len(sys.argv) 

העבירו את המפתח באמצעות משתנה סביבה. ב-shell של Bash הפקודה למושב הנוכחי נראית כך:

export JSONSCRAPER_TIKTOK_LICENSE_KEY="המפתח_שלכם"
python collect_tiktok.py "meal prep"

ב-Windows PowerShell אפשר להגדיר את המשתנה לתהליך הנוכחי באמצעות $env:JSONSCRAPER_TIKTOK_LICENSE_KEY="המפתח_שלכם", ואז להריץ את אותו קובץ Python. אל תוסיפו את המפתח למאגר הקוד, ל-CSV, לארכיון התשובות או להודעות שגיאה. מאחר שה-API מקבל את המפתח בפרמטר שאילתה, שימו לב שכתובת הבקשה המלאה עשויה להופיע ביומני לקוח HTTP ותשתיות; הגדירו רישום כך שסודות יוחרגו.

איך לקרוא את הקוד ולאמת את התוצאה

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

הפונקציה get_videos מאחדת איברים מהרשימה הישירה aweme_list ורשומות המקוננות ב-search_item_list[].aweme_info. לאחר מכן היא מסירה כפילויות לפי aweme_id, משום שסרטון עשוי להופיע בשתי האוספים. אם המזהה חסר, הרשומה נשמרת; כך אפשר לבדוק את התוצאה המקורית בלי להמציא ערך.

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

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

כדי לבדוק את ההרצה הראשונה, פתחו את ה-JSON וודאו ש-status שווה ל-ok, שיש בתוכו אובייקט tiktok ושאחת האוספים הנתמכים או שתיהן מכילות איברים. לאחר מכן השוו כמה ערכים ב-CSV לאובייקט המקורי. בפרט, בדקו שהמונים אינם הופכים למחרוזות שגויות, שתאריכי הפרסום נשמרים כערכים המקוריים ושהקישורים שייכים לאותם סרטונים שמזוהה להם אותו ID.

אם תשובה תקינה אינה מכילה סרטונים, שמרו את ההרצה כתוצאה ריקה ולא ככשל בקוד. אם הסטטוס החיצוני או תשובת ה-HTTP מצביעים על שגיאה, אל תוסיפו את הרשומה לתצפיות האנליטיות: קודם פתרו את הבעיה והריצו שוב. בתהליך ייצור כדאי גם לתעד קוד HTTP, מונח חיפוש, שעה והודעת שגיאה קצרה, תוך החרגת המפתח וכתובת מלאה שמכילה את הסוד.

דפדוף ותהליך איסוף עקבי

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

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

הפרמטר date_posted מאפשר להגביל את החיפוש לאחת התקופות המפורטות בתיעוד; sort_by מאפשר לבחור מיון לפי רלוונטיות, תאריך פרסום או לייקים. בניתוח דינמיקה תעדו את ההגדרות האלה לצד ההרצה. השוואת שאילתות עם תקופות או שיטות מיון שונות עלולה לשקף שינוי בתנאי החיפוש, לא שינוי בנושא עצמו.

הפרמטר cache_timeout שולט במטמון התשובה. לפי התיעוד, חלון המטמון המוגדר כברירת מחדל הוא 3600 שניות, והערך 0 משבית את המטמון. בחרו את ההגדרות במכוון ושמרו אותן בתצורה עבור ניטור מתוזמן. אם סדרת בקשות מופעלת בתדירות גבוהה משעה ונדרשת הבחנה בין תשובות בתוך אותו חלון, בדקו בנפרד את התנהגות המטמון לפני שאתם מפרשים תוצאות שחוזרות על עצמן כהיעדר שינוי.

השוואת תצפיות יומיות

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

אל תכנו את ההפרש הזה ״קצב צפיות״ בלי לציין מרווח זמן מוגדר. אם הרצה אחת התבצעה בבוקר והבאה אחריה כעבור כמה ימים, הערך מבטא שינוי מצטבר לאורך התקופה. אפשר לחלק את ההפרש במשך הזמן בפועל בין התצפיות כדי לחשב קצב השוואתי, אבל גם אז מדובר בקצב ממוצע בין שתי תמונות מצב, לא בטלמטריה רציפה.

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

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

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

איך לא לבלבל בין פופולריות של סרטון לבין ערך של נושא

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

בהשוואה בין כמה סרטונים אפשר לחשב יחס של אינטראקציות לצפיות, אם שני המונים קיימים. לדוגמה, חלוקת סכום הלייקים, התגובות והשיתופים במספר הצפיות נותנת מדד פשוט לשיעור התגובות שנצפה. תעדו את הנוסחה ואל תערבבו סרטונים עם ערכים חסרים, אחרת התוצאה לא תהיה בת-השוואה. היחס מתאר רק את המונים הציבוריים שנבחרו ואת הסרטונים שנבחרו.

אל תחברו מדדים מתמונות מצב שונות כאילו מדובר באירועים בלתי תלויים. אם אותו סרטון הופיע בחמש תשובות יומיות, מספר הצפיות בכל שורה הוא מצב עוקב של אותו מונה, לא חמש קבוצות קהל נפרדות. כדי לסכם פרסומים ייחודיים, השתמשו בנקודת תצפית עקבית אחת לכל סרטון — למשל, תמונת המצב האחרונה בתקופת הדיווח — ושמרו את כלל הבחירה.

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

אוטומציה לפי לוח זמנים

לאחר שבדקתם הרצה ידנית, העבירו את האיסוף למתזמן: cron בשרת משלכם, GitHub Actions או תהליך עבודה ב-n8n/Make. האינטגרציה צריכה להריץ את אותו סקריפט שנבדק, להעביר את המפתח ממאגר סודות, לארכב את ה-JSON ולשלוח התראה רק לאחר סיום מוצלח. המימוש המסוים של המתזמן תלוי בתשתית; קריאת ה-API ופורמט העיבוד נשארים זהים.

דוגמת cron להרצה יומית בשעה 08:15 לפי שעון המכונה:

15 8 * * * cd /srv/tiktok-monitor && /usr/bin/python3 collect_tiktok.py "meal prep" >> logs/collector.log 2>&1

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

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

אם צריך להעביר תוצאות ל-Google Sheets, לבסיס נתונים או ללוח פנימי, הוסיפו זאת אחרי שהארכוב נעשה אמין. תחילה שמרו את התשובה המקורית ורק אחר כך העלו את השורות המנורמלות; אם ההעלאה נכשלה, אפשר לנסות אותה שוב מהארכיון בלי בהכרח לאסוף נתונים מחדש. מזהה הסרטון וזמן האיסוף מסייעים להכניס רשומות באופן שניתן לחזור עליו ולהבחין בין תמונת מצב חדשה לישנה.

הוספת בינה מלאכותית: תפקידה למיין, לא להחליף את המקור

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

שמרו את תוצאות המודל בעמודות נפרדות, למשל ai_topic, summary ו-review_status. אל תדרסו את התיאור המקורי או את ערכי ה-API. אם ההנחיה או המודל משתנים, צריך להיות אפשר לעבד מחדש את הרשומות השמורות; לשם כך כדאי לשמור את גרסת ההנחיה ואת תאריך הסיווג.

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

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

איכות המדגם ומגבלות המסקנות

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

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

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

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

רשימת בדיקה מעשית לפני ההרצה

  • נסחו את השאלה העסקית: אילו נושאים, פורמטים או פרסומים אתם רוצים לאתר.
  • התחילו בכמה ביטויי חיפוש יציבים ותעדו את איותם.
  • בדקו את הנתיב /searchVideo, את keyword הנדרש ואת יתר הפרמטרים בתיעוד.
  • שמרו את המפתח במשתנה סביבה והוציאו אותו מהפלט, מהיומנים וממאגר הקוד.
  • בדקו את סטטוס התשובה החיצוני ואת קיומו של האובייקט tiktok.
  • טפלו גם ב-aweme_list וגם ב-search_item_list[].aweme_info.
  • שמרו את ה-JSON הגולמי לפני הנרמול.
  • השאירו שדות חסרים ריקים ואל תחליפו אותם באפסים.
  • התאימו פרסומים לפי aweme_id והעבירו את הסמן ללא שינוי.
  • תעדו את תאריך האיסוף ואת פרמטרי החיפוש של כל תמונת מצב.
  • בדקו כמה סרטונים ידנית לפני הסקת מסקנות ולפני העברת התוצאות למודל.

מה תקבלו בסוף

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

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

אפשר להתחיל בשאילתה אחת, בהרצה מקומית יומית ובקובץ CSV. אחרי שבדקתם שהמדגם מתאים למשימה, הוסיפו תזמון, בסיס נתונים או סיווג תיאורים. אפשר לאמת את הפרמטרים המתועדים ואת תפקידי הנתיבים בתיעוד TikTok API, ואת פרטי הגישה והמוצר בעמוד TikTok Scraper API של jsonscraper.

People

No people listed for this article yet.

Keep readingניטור האשטגים של TikTok בפייתון: בקשת API עובדת
Read the next article

הפכו את מה שקראתם לאינטגרציה עובדת

גלו את ממשקי ה-API לנתונים חברתיים של jsonscraper, בדקו בקשות ובנו את תהליך העבודה הבא.

גלה API