jsonscraper

كيفية مقارنة إبداعات المنافسين على TikTok باستخدام المقاييس العامة: خط معالجة بلغة Python

اجمع النتائج من عدة عمليات بحث، وأزل التكرارات، وقارن المقاطع بحسب المشاهدات والإعجابات والتعليقات

السياسة التحريرية الإبلاغ عن خطأ

تنشر فرقان مقاطع عن منتج متشابه، لكنهما تقيّمانها يدويًا بمعايير مختلفة: يتذكر فريق عدد المشاهدات، ويركز آخر على التعليقات، بينما يحفظ فريق ثالث الروابط في محادثة. وبعد أسبوع، يصعب معرفة التنسيقات التي تتكرر لدى المنافسين، والمنشورات التي تحصد تفاعلات ملحوظة، وما الذي تغير منذ آخر مراجعة.

الحل هو جمع عينة محدودة قابلة للتكرار من مقاطع الفيديو العامة باستخدام كلمات مفتاحية محددة مسبقًا، وحفظ ملف JSON الأصلي، وإنشاء جدول بحقوق موحدة. يتيح ذلك مقارنة المقاطع ضمن سير عمل واحد، بدلًا من خلط الملاحظات العشوائية بالاستنتاجات عن السوق. فيما يلي مخطط لمراقبة تنافسية صغيرة باستخدام Python وTikTok Scraper API من jsonscraper.

حدد سؤال التحليل أولًا

يكون جمع البيانات مفيدًا عندما تعرف مسبقًا القرار الذي ستتخذه بناءً على النتائج. مثلًا، يريد فريق تسويق تابع لشركة تصنع زجاجات رياضية معرفة كيفية عرض المنافسين للمنتج في المقاطع القصيرة: من خلال عرض طريقة الاستخدام، أو فتح العبوة، أو المقارنة، أو رد فعل المستخدمين. لا يتطلب ذلك نسخ محتوى TikTok بأكمله؛ بل يحتاج إلى عدة استعلامات بحث مستهدفة ورصد متكرر لمقاطع الفيديو التي تعيدها واجهة API لهذه الاستعلامات.

صغ السؤال بطريقة قابلة للتحقق، مثل: «ما تنسيقات الوصف والعرض الشائعة بين المقاطع المنشورة التي تظهر ضمن عباراتنا المفتاحية الخمس، وأي المقاطع التي عثرنا عليها تسجل حاليًا أعلى عدد من المشاهدات والتفاعلات؟» تفصل هذه الصياغة بين مستويين من التحليل. يساعد النص والوصف في تصنيف الأساليب الإبداعية، بينما تقدم عدادات المشاهدات والإعجابات والتعليقات وإعادة النشر لقطة عن التفاعل العام وقت الجمع.

تفيد هذه اللقطة في ترتيب أولويات المراجعة اليدوية وتتبع التغييرات. وهي تصف مقاطع الفيديو التي أُعيدت لاستعلامات ومعلمات ووقت تشغيل محددة. لذا، يكون الاستنتاج المنضبط مثل «تتكرر مقاطع فتح العبوات في عينتنا» أو «وسيط المشاهدات لهذه المجموعة من المقاطع أعلى حاليًا». ويساعد هذا النطاق المحدد للتحليل الفريق على اختيار فرضيات لمحتواه الخاص.

صمّم خط معالجة بيانات صغيرًا

قسّم العمل إلى أربع مراحل: الجمع، وحفظ الاستجابة الخام، والتوحيد، والتحليل. يتصل الجمع بواجهة API لكل كلمة مفتاحية معتمدة. وتُحفظ الاستجابة الخام كاملة لإتاحة التحقق منها لاحقًا. أما التوحيد فيحوّل بنية JSON المتداخلة إلى صفوف جدول، بينما يحسب التحليل المقاييس ويصنف المقاطع بحسب الكلمات المفتاحية أو التنسيقات التي تُحدد يدويًا.

  • الجمع. اطلب العدد المحدد من النتائج لكل كلمة مفتاحية، مع استخدام المنطقة وخيار الفرز نفسيهما.
  • الأرشفة. احفظ ملف JSON الأصلي ووقت استلامه للتحقق من القيم المستخرجة.
  • التوحيد. احتفظ بمعرّف الفيديو والرابط والوصف والمؤلف ووقت النشر والعدادات المتاحة.
  • ضبط الجودة. أزل التكرارات بحسب المعرّف، وسجّل القيم المفقودة، واحتفظ بالكلمة المفتاحية التي أدت إلى العثور على المقطع.
  • المقارنة. احسب مؤشراتك الخاصة باستخدام الحقول الأصلية المتاحة فقط، وقارن المجموعات ضمن اللقطة نفسها.

هذا النهج أفضل من قائمة روابط، لأنه يحفظ مصدر كل صف ويتيح التمييز بين ظهور المقطع نفسه مرة أخرى والعثور على مادة جديدة. واحفظ أيضًا تاريخ الجمع؛ فقد تتغير العدادات العامة، لذا لا ينبغي التعامل مع قيمة واردة في استجابة اليوم على أنها خاصية ثابتة للفيديو.

ما الذي تدعمه TikTok Scraper API

لبحث مقاطع الفيديو باستخدام استعلام نصي، توضح وثائق jsonscraper مسار GET /searchVideo على العنوان الأساسي https://tiktok.evelode.com. المعلمة الإلزامية هي keyword، وتتوفر أيضًا المعلمات count وcursor وregion وdate_posted وsort_by وcache_timeout. وتذكر الوثائق خيارات الفرز most-liked وrelevance وdate-posted، ومن فترات النشر yesterday وthis-week وthis-month وlast-3-months وlast-6-months وall-time. راجع أسماء المعلمات ووظائفها في مرجع مسارات TikTok.

يُمرّر المفتاح في معلمة الاستعلام license_key. في نص برمجي يُستخدم فعليًا، خزّنه في متغير البيئة JSONSCRAPER_TIKTOK_LICENSE_KEY، لا في الملف المصدر أو الجدول أو سجل التشغيل. تحقق من قيمة status في المستوى الأعلى من الاستجابة، ثم حلّل الكائن tiktok. قد تحتوي بنية نتائج البحث على قائمة aweme_list، وكذلك search_item_list التي توجد فيها تفاصيل المقطع داخل aweme_info. يدعم المثال البرمجي أدناه الشكلين.

تتضمن استجابات البحث التي جرى التحقق منها معرّف المقطع ووصفه ووقت نشره ورابطه ومعلومات المؤلف ومقاييس مثل المشاهدات والإعجابات والتعليقات ومرات الحفظ وإعادة النشر. وقد تغيب بعض الحقول عن سجل بعينه. اترك هذه القيم فارغة في الجدول بدلًا من استبدالها بصفر: فالصفر يعني قيمة مقاسة، أما الحقل الفارغ فيعني أن القيمة غير موجودة في الكائن المستلَم.

مثال بسيط باستخدام Python

ينفذ النص البرمجي أدناه طلبًا واحدًا لكل كلمة مفتاحية، ويحفظ الاستجابة الكاملة في ملف JSON، وينشئ ملف CSV لجدول بيانات أو لمزيد من المعالجة. وهو مخصص لـ Python 3.8+ ولا يستخدم سوى المكتبة القياسية. اضبط متغير البيئة الذي يحتوي على مفتاح الترخيص قبل التشغيل، وعدّل قائمة الكلمات المفتاحية وعدد النتائج وفقًا لحالتك.

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 = ["термобутылка", "спортивная бутылка", "распаковка бутылки"]
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")

يحفظ النص البرمجي الكلمة المفتاحية مع المقطع؛ وهذا مهم إذا عُثر على مقطع واحد عبر عدة استعلامات. تُجرى هنا إزالة التكرار داخل كل كلمة مفتاحية، لذا قد يظهر المعرّف نفسه في صف منفصل لكل استعلام. لإنشاء جدول موحد بلا تكرار، استبدل المفتاح (keyword, video_id) بـ video_id، واجمع الكلمات المفتاحية في قائمة أو جدول ارتباط منفصل.

يتعمد الكود تنفيذ طلب واحد لكل كلمة، ولا يتنقل تلقائيًا بين الصفحات. إذا احتجت إلى الصفحة التالية، تحدد الوثائق أن cursor قيمة تُستخدم لمتابعة النتائج ويجري الحصول عليها من الاستجابة السابقة. مرّرها كما هي دون محاولة احتسابها بنفسك. اختبر مخطط ترقيم الصفحات على استجابة تجريبية لسير العمل المعني، وتوقف عند غياب نتائج جديدة أو مؤشر متابعة تالٍ.

كيفية إعداد جدول قابل للمقارنة

يمكن فتح ملف CSV في جدول بيانات، أو تحميله إلى قاعدة بيانات، أو استخدامه في Python لحساب القيم المجمعة. في التقرير الأولي، صنّف الصفوف بحسب تاريخ الجمع والكلمة المفتاحية وتنسيق المقطع. من الأفضل تحديد التنسيق بعد مراجعة الوصف والمقطع نفسه، باستخدام فئات مثل «عرض توضيحي» و«فتح العبوة» و«مراجعة» و«مقارنة». يمكن تصنيف عينة صغيرة يدويًا، أو الاستعانة بنموذج لإعداد تصنيف أولي يراجعه شخص.

إذا استخدمت تصنيفًا آليًا للنصوص، فأرسل إلى النموذج الحقول اللازمة فقط، مثل الوصف والمعرّف، واطلب منه إرجاع تصنيف واحد من قائمة معتمدة مسبقًا. احتفظ بالوصف الأصلي منفصلًا عن نتيجة التصنيف. بهذه الطريقة يستطيع المحلل التحقق من التصنيف الملتبس وإعادة احتساب التقرير بعد تغيير نظام التصنيف، دون إرسال طلب جديد إلى واجهة API.

للمقاييس المقارنة، استخدم القيم الملتقطة في وقت جمع واحد. مثلًا، يمكن حساب نسبة الإعجابات إلى المشاهدات على النحو likes / views عندما تكون القيمتان متاحتين ويكون عدد المشاهدات أكبر من صفر. ويمكن بالطريقة نفسها حساب نسبة التعليقات أو إعادة النشر. تصف هذه النسب العدادات العامة الحالية للمقطع، لكنها لا تقيس وصوله إلى جمهور بعينه أو مرات المشاهدة الكاملة أو التحويلات. لاتخاذ قرارات تجارية، قارنها بحملتك الخاصة واستخدمها مؤشرًا لاختيار الأفكار، لا وعدًا بنتيجة مضمونة عند تقليد تنسيق منافس.

غالبًا ما يكون الوسيط أنسب من المتوسط إذا تضمنت العينة مقاطع قليلة ضخمة الانتشار. قارن وسيط المشاهدات والتفاعلات بين المجموعات فقط عند اتباع قاعدة جمع موحدة: مجموعة الاستعلامات نفسها، والمنطقة نفسها، ومرشح الفترة الزمنية نفسه، ووقت لقطة متقارب. سجّل معلمات التشغيل وتاريخه. فإذا غيّر تعديل البحث أو العينة تركيب الصفوف، فقد يعكس الاختلاف بين تقريرين تغير المنهج أيضًا.

إعادة التشغيل ومراقبة التغييرات

لتحويل التحليل لمرة واحدة إلى عملية مراقبة، شغّل النص البرمجي وفق جدول زمني، يوميًا أو أسبوعيًا مثلًا، وأضف تاريخ الجمع إلى كل سجل. احتفظ لكل مقطع بأزواج «وقت اللقطة — قيمة العداد». عندها يمكنك معرفة كيفية تغير المؤشرات العامة بين عمليات الرصد، مع حفظ كل نقطة قياس على حدة. لا تستبدل العدادات القديمة بالقيم الحالية، وإلا فستفقد بيانات التغير بمرور الوقت.

في بيئة الإنتاج، انقل ملفات JSON الخام من المجلد المحلي إلى مخزن كائنات أو نظام أرشفة آخر، واحفظ الصفوف الموحّدة في قاعدة بيانات ذات مفتاح فريد، مثل الجمع بين معرّف الفيديو ووقت اللقطة. أضف سجلًا للأخطاء لا يتضمن مفتاحًا سريًا، وحدًا لعدد المحاولات، وتنبيهًا عند فشل الطلب. يمكن إعادة الطلب بعد خطأ مؤقت مع تأخير؛ أما الخطأ البنيوي، فمن الأفضل حفظ الاستجابة ووضع علامة تفيد بأن التشغيل بحاجة إلى مراجعة، حتى لا يتحول العطل إلى تقرير فارغ دون تنبيه.

لا تستخدم قيمة cursor بوصفها معرّفًا دائمًا للدراسة؛ فهي مؤشر لمتابعة نتائج البحث. احفظها مع معلمات الطلب المقابل، واستخدمها لمتابعة تلك النتائج وحدها، ولا تخلط الصفحات العائدة لكلمات مفتاحية مختلفة. وسجّل أيضًا العدد الفعلي للنتائج التي عولجت: فقيمة count المطلوبة تحدد الحجم المرغوب للاستجابة، ولا تضمن تغطية كل المنشورات المطابقة.

كيفية توسيع سير العمل

إذا كانت عينة البحث مشوشة أكثر من اللازم، يمكنك تتبع ملفات شخصية عامة محددة أو وسوم هاشتاغ على نحو مستقل. تتضمن الوثائق المسارين /getUserFeed و/getHashtagFeed مع معلمات الطلب وترقيم الصفحات. وهاتان عينتان مختلفتان لهما قواعد متابعة خاصة: تستخدم خلاصة الملف الشخصي max_cursor، بينما تستخدم خلاصة الهاشتاغ cursor. أضفهما كمصدرين منفصلين، واحفظ نوع المصدر ومعلماته حتى لا تخلط نتائج البحث بالكلمات المفتاحية بمنشورات ملف شخصي أو هاشتاغ.

يمكن لفريق لا يمتلك بنية تحتية خاصة به تمرير ملفات CSV إلى Google Sheets عبر API؛ إذ توضح وثائق Google Sheets API كيفية قراءة قيم الخلايا وكتابتها. أضف أوراقًا منفصلة للتشغيلات الخام والمقاطع الموحّدة والملخص. يفيد ذلك في التصنيف التعاوني؛ وعندما يصبح حجم السجل أكبر مما يلائم جدول البيانات، انقل الصفوف إلى مخزن SQL مع الاحتفاظ بالحقول نفسها ومصدر البيانات.

من المعقول أن يقتصر دور وكيل الذكاء الاصطناعي على تلخيص السجلات التي جُمعت ووُحّدت بالفعل: تجميع الأوصاف، واقتراح التنسيقات، وإبراز القيم غير المعتادة. لا ينبغي تكليف الوكيل بصياغة حقائق عن المنصة بأكملها استنادًا إلى مجموعة نتائج صغيرة. زوّده بالفترة الزمنية وقائمة الاستعلامات وعدد الصفوف، واطلب منه الإشارة إلى معرّفات المقاطع وإرجاع الحقول غير المؤكدة أو المفقودة فارغة. بعد ذلك، يتحقق المحلل من الأمثلة عبر الروابط المحفوظة.

النتيجة المتوقعة

بعد إعداد النظام، يحصل الفريق على سجل قابل للتكرار لمقاطع الفيديو التي عُثر عليها، يتضمن المعرّفات والروابط والأوصاف والمؤلفين وأوقات النشر والعدادات العامة المتاحة. تتيح الاستجابة الخام المحفوظة التحقق من التحويلات، بينما يسهّل ملف CSV فرز المقاطع وتصفيتها بالكلمات المفتاحية ومقارنة اللقطات حسب التاريخ. ويمكن إعداد ملخص أسبوعي يوضح التنسيقات المتكررة والمنشورات الجديرة بالمراجعة والفرضيات الإبداعية التي تستحق الاختبار في المحتوى الخاص بالفريق.

النتيجة العملية ليست تصنيفًا شاملًا للمنافسين، بل عينة منضبطة ذات مصدر واضح. وتعتمد جودتها على الاستعلامات والمرشحات وفترة الرصد المختارة. لذا احفظ معلمات الجمع، وراجع مقاطع بعينها يدويًا، وافصل بين المقاييس المتاحة وتفسيرها. يساعد هذا الإجراء على استبدال الروابط المحفوظة المتناثرة ببيانات قابلة للمقارنة ومناقشة الإبداعات استنادًا إلى أمثلة محددة.

يمكنك مراجعة مسار البحث ومعلماته في الوثائق الرسمية لـ jsonscraper، كما تتوفر معلومات الخدمة وإمكانية الوصول إليها في صفحة TikTok Scraper API. ابدأ بعدة عبارات بحث، واحفظ استجابة اختبارية واحدة، وتحقق من بنيتها قبل إعداد جدول التشغيل.

People

No people listed for this article yet.

Keep readingكيفية رصد الإشارات المبكرة لاتجاهات TikTok: مراقبة نتائج البحث آليًا
Read the next article

حوّل ما تقرأه إلى تكامل عملي

استكشف واجهات API للبيانات الاجتماعية من jsonscraper واختبر الطلبات وأنشئ سير عملك التالي.

استكشف واجهات API