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

יחידת ההשוואה המרכזית היא הסרטון, המזוהה באמצעות aweme_id. לכל רשומה נשמרים מועד האיסוף, המזהה, התיאור, כתובת ה-URL, שם היוצר והמונה הזמינים. לאחר מכן משווים בין שתי המדידות לפי המזהה. כך הגידול במספר הצפיות של סרטון אחד אינו מתערבב עם מספר הצפיות המצטבר של סרטון אחר.
התוצאה מתארת רק את הסרטונים שהוחזרו עבור שאילתת חיפוש מסוימת בהרצה מסוימת. תוצאות החיפוש עשויות להשתנות, וחלק משדות הנתונים הסטטיסטיים עשויים להיות חסרים. לכן כדאי לשמור את המדידות עצמן ואת זמני האיסוף, ולהתייחס לדוח כתצפית על סרטונים שכבר אותרו — לא כאל קטלוג מלא של פרסומים בנושא.
איך האיסוף דרך ה-API פועל?
בתיעוד של TikTok Scraper API מתואר נתיב GET בשם /searchVideo. לחיפוש נדרשת מחרוזת keyword; בין הפרמטרים הנוספים נמצאים count, region, sort_by ו-date_posted. מפתח ה-API מועבר כ-license_key. במדריך מצוין כתובת הבסיס https://tiktok.evelode.com.
התגובה כוללת סטטוס חיצוני ואובייקט tiktok. בתוצאות החיפוש הסרטונים עשויים להופיע ב-tiktok.aweme_list או בתוך tiktok.search_item_list[].aweme_info. המטפל שלהלן תומך בשתי הצורות. המדדים נלקחים מתוך statistics, לרבות play_count, digg_count, comment_count ו-share_count; ערך חסר נשמר כריק, ולא מוחלף באפס.
במדריך הנתיבים מופיע cursor לגלילה בתוצאות החיפוש, ומצוינים הערכים האפשריים של date_posted ושל sort_by. לניטור פשוט שניתן לחזור עליו, מספיק להתחיל בעמוד תוצאות אחד, לתעד את התגובה ולהוסיף עימוד רק אם יש בכך צורך. אם יש צורך בעימוד, העבירו את הסמן שהתקבל ללא שינוי.
דוגמה מעשית ב-Python
התקינו את ספריית הבקשות באמצעות הפקודה python -m pip install requests והגדירו את המפתח במשתנה הסביבה JSONSCRAPER_TIKTOK_LICENSE_KEY. הסקריפט מקבל ביטוי חיפוש כארגומנט ומוסיף את המדידות שנאספו לקובץ CSV אחד. הקוד תואם ל-Python 3.8 ומעלה.
import csv
import os
import sys
from datetime import datetime, timezone
from pathlib import Path
import requests
BASE_URL = "https://tiktok.evelode.com/searchVideo"
CSV_PATH = Path("tiktok_video_snapshots.csv")
FIELDS = [
"collected_at", "aweme_id", "author", "description", "share_url",
"play_count", "digg_count", "comment_count", "share_count",
]
def extract_items(payload):
"""Support the observed search response layouts."""
data = payload.get("tiktok") or {}
items = data.get("aweme_list") or []
if items:
return items
found = []
for result in data.get("search_item_list") or []:
info = result.get("aweme_info")
if info:
found.append(info)
return found
def main():
key = os.environ.get("JSONSCRAPER_TIKTOK_LICENSE_KEY")
if not key:
raise SystemExit("Set JSONSCRAPER_TIKTOK_LICENSE_KEY first")
if len(sys.argv) < 2:
raise SystemExit('Usage: python collect.py "search phrase"')
params = {
"license_key": key,
"keyword": sys.argv[1],
"count": 20,
"region": "US",
"sort_by": "relevance",
"date_posted": "this-week",
}
response = requests.get(BASE_URL, params=params, timeout=30)
response.raise_for_status()
payload = response.json()
if payload.get("status") != "ok":
raise RuntimeError("API returned a non-ok outer status")
data = payload.get("tiktok") or {}
items = extract_items(payload)
collected_at = datetime.now(timezone.utc).isoformat()
rows = []
for item in items:
stats = item.get("statistics") or {}
author = item.get("author") or {}
rows.append({
"collected_at": collected_at,
"aweme_id": item.get("aweme_id"),
"author": author.get("unique_id") or author.get("nickname"),
"description": item.get("desc"),
"share_url": item.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"),
})
write_header = not CSV_PATH.exists()
with CSV_PATH.open("a", newline="", encoding="utf-8") as file:
writer = csv.DictWriter(file, fieldnames=FIELDS)
if write_header:
writer.writeheader()
writer.writerows(rows)
print("Saved", len(rows), "returned videos")
print("has_more:", data.get("has_more"), "cursor:", data.get("cursor"))
if __name__ == "__main__":
main()
למשל, הריצו python collect.py "שאילתה על מוצר". הספרייה משלבת את שורת המפתח בפרמטרים של כתובת ה-URL; הסקריפט אינו מציג אותו במסוף. אל תשמרו את כתובת בקשת ה-URL המלאה ביומנים ציבוריים, מכיוון שהיא מכילה את המפתח. במערכת ייצור השתמשו באחסון סודות והגבילו את הגישה לקובץ המדידות.
איך לחשב את הגידול בין הרצות?
הסקריפט שומר בכוונה את כל התצפיות, במקום לדרוס ערכים קודמים. מנתח קטן נוסף משווה את זוג המדידות האחרונות של כל סרטון ומציג את ההפרש במונים. אם מדד חסר באחת משתי הרשומות, התוצאה מסומנת כלא זמינה.

import csv
from collections import defaultdict
from pathlib import Path
rows_by_video = defaultdict(list)
with Path("tiktok_video_snapshots.csv").open(encoding="utf-8", newline="") as file:
for row in csv.DictReader(file):
if row["aweme_id"]:
rows_by_video[row["aweme_id"]].append(row)
metrics = ("play_count", "digg_count", "comment_count", "share_count")
for video_id, snapshots in rows_by_video.items():
snapshots.sort(key=lambda row: row["collected_at"])
if len(snapshots) < 2:
continue
previous, latest = snapshots[-2], snapshots[-1]
changes = {}
for metric in metrics:
old, new = previous[metric], latest[metric]
changes[metric] = int(new) - int(old) if old and new else None
print(video_id, changes, latest["share_url"])
ההפרש הוא ההבדל בין שני הערכים שנשמרו, ולא קצב צמיחה שמחושב לפי מחזוריות מובטחת. אם ההרצות מתבצעות במרווחי זמן שונים, הוסיפו חישוב של משך הזמן בין ערכי collected_at והשוו את הגידול לאורך פרק הזמן בפועל. המונים עשויים להשתנות בין התצפיות; חותמות הזמן השמורות מציינות מתי התקבלו הערכים שבהם נעשה שימוש.
איך להפוך את הדוח לאוטומטי ולפרש אותו?
לדוח יומי, הציבו את האיסוף במתזמן משימות בשרת או ב-CI, הגדירו רשימה קבועה של ביטויי חיפוש ושמרו את הנתונים בקובץ CSV או העלו את השורות למסד נתונים. בהרצה חוזרת, הסירו כפילויות בתוך כל מדידה לפי aweme_id אם התוצאות כוללות כפילויות. לצורך שמירת היסטוריה, שמרו את ה-JSON הגולמי לצד העמודות המנורמלות: כך יהיה קל יותר לעבד מחדש את הנתונים אם סכמת הדוח תשתנה.
בטבלה כדאי להציג את מזהה הסרטון ואת כתובת ה-URL שלו, את היוצר, את התיאור, את מועד האיסוף ואת ההפרשים בכל מדד בנפרד. מיון לפי הגידול בצפיות עונה על השאלה אילו סרטונים מתפשטים, ואילו הגידול בתגובות או בשיתופים עוזר לזהות סוג אחר של תגובה. אל תאחדו את המדדים האלה לדירוג יחיד בלי להגדיר כלל מפורש: לכל מונה יש משמעות משלו.
מתזמן המשימות יכול לשלוח את הדוח בדוא״ל, לגיליון אלקטרוני או לערוץ פנימי, אך התשתית שלכם היא שאחראית לשלב הזה — הדוגמה שלמעלה רק אוספת ומנתחת נתונים. לאיסוף מקיף יותר אפשר לעבור בין דפי התוצאות, לשמור את הסמן ולעצור את הלולאה כשה-API מציין שאין דפים נוספים. סמן החיפוש הוא ערך אטום שמתקבל בתגובה; אל תחשבו אותו בעצמכם. גם מעבר על כל הדפים מתאר את התוצאות שהוחזרו, ואינו מבטיח רשימה ממצה של כל הפרסומים המתאימים.
התוצאה המעשית הצפויה היא יומן תצפיות שניתן לשחזר וטבלת שינויים עבור הסרטונים שאותרו. כך אפשר לזהות אילו פרסומים שינו את המונים הציבוריים בין הבדיקות, ולהעביר קישורים ספציפיים למומחה לצורך ניתוח תוכני. פרטים על המוצר וגישה ל-API זמינים בעמוד TikTok Scraper API.
מה כדאי לבדוק לפני שמפעילים את האיסוף לפי לוח זמנים?
- ודאו שסטטוס התגובה החיצוני הוא
okלפני עיבודtiktok. - בדקו את שתי הצורות האפשריות של מבנה פריטי החיפוש; היעדר רשימה אמור להניב איסוף ריק, ולא שגיאה.
- שמרו את הערכים המקוריים ואת חותמות הזמן. מדד ריק נשאר ריק.
- השתמשו באותן שאילתות ובאותם פרמטרים כדי להקל על השוואת המדידות; תעדו לצד הדוח כל שינוי בהגדרות האלה.
- עקבו אחר תדירות ההרצות, שגיאות HTTP וגודל ההיסטוריה, וכן הקפידו לפעול לפי הכללים הרלוונטיים של הפלטפורמה ולפי הדרישות לעיבוד נתונים.
לסיכום, כדי לקבל תוצאה שניתן לצפות בה, מספיק לחזור על אותו חיפוש, לזהות סרטונים לפי aweme_id ולהשוות את המדדים שנשמרו לאורך זמן. הגישה הזאת עונה על שאלה מעשית וממוקדת: אילו מהסרטונים שכבר אותרו שינו את המונים הציבוריים בין שתי בדיקות. במקביל, היא משאירה את הנתונים המקוריים זמינים לביקורת ולעיבוד נוסף.