jsonscraper

Comparer les créations TikTok des concurrents à partir de métriques publiques : un pipeline Python

Collectez les résultats de plusieurs requêtes, éliminez les doublons et comparez les vidéos selon leurs vues, leurs mentions J’aime et leurs commentaires

Politique éditoriale Signaler une erreur

Deux équipes publient des vidéos sur des produits similaires, mais les évaluent manuellement selon des critères différents : l’une retient le nombre de vues, l’autre les commentaires, tandis qu’une troisième conserve les liens dans une conversation. Une semaine plus tard, difficile de savoir quels formats reviennent chez les concurrents, quelles publications suscitent des réactions notables et ce qui a changé depuis le dernier relevé.

La solution consiste à recueillir un échantillon limité et reproductible de vidéos publiques à partir de mots-clés définis à l’avance, à enregistrer le JSON brut et à créer un tableau doté de champs uniformes. On peut ainsi comparer les vidéos dans un même processus de travail, sans confondre observations fortuites et conclusions sur le marché. Voici une méthode de veille concurrentielle à petite échelle en Python avec l’API TikTok Scraper de jsonscraper.

Définissez d’abord la question de l’analyse

La collecte de données est utile si l’on sait à l’avance quelle décision sera prise à partir des résultats. Par exemple, l’équipe marketing d’un fabricant de bouteilles de sport veut comprendre comment ses concurrents présentent leurs produits dans de courtes vidéos : démonstration d’utilisation, déballage, comparaison ou réaction d’un utilisateur. Il n’est pas nécessaire de copier l’intégralité de TikTok. Quelques requêtes ciblées et une observation reproductible des vidéos renvoyées par l’API suffisent.

Formulez une question vérifiable : « Quels formats de descriptions et de démonstrations apparaissent parmi les vidéos publiées correspondant à nos cinq expressions clés, et lesquelles des vidéos trouvées affichent actuellement le plus de vues et de réactions ? » Cette formulation distingue deux niveaux d’analyse. Le texte et la description aident à regrouper les approches créatives ; les compteurs de vues, de mentions J’aime, de commentaires et de partages donnent un instantané des réactions publiques au moment de la collecte.

Cet instantané est utile pour prioriser les vidéos à examiner manuellement et suivre les changements. Il décrit les vidéos renvoyées pour des requêtes, des paramètres et une heure de lancement précis. Une conclusion juste sera donc : « les vidéos de déballage sont fréquentes dans notre échantillon » ou « la médiane actuelle des vues est plus élevée pour ce groupe de vidéos ». Cette échelle d’analyse aide l’équipe à choisir des hypothèses pour son propre contenu.

Concevez un petit pipeline de données

Divisez le travail en quatre étapes : collecte, conservation de la réponse brute, normalisation et analyse. La collecte interroge l’API pour chaque mot-clé approuvé. La réponse brute est conservée dans son intégralité pour permettre une vérification ultérieure. La normalisation convertit la structure JSON imbriquée en lignes de tableau, puis l’analyse calcule des métriques et regroupe les vidéos par mot-clé ou par format attribué manuellement.

  • Collecte. Demandez un nombre défini de résultats pour chaque mot-clé, avec la même région et le même tri.
  • Archivage. Enregistrez le JSON brut et l’heure de collecte pour pouvoir vérifier les valeurs extraites.
  • Normalisation. Conservez l’identifiant de la vidéo, son lien, sa description, son auteur, sa date de publication et les compteurs disponibles.
  • Contrôle qualité. Éliminez les doublons par ID, signalez les valeurs manquantes et conservez le mot-clé qui a permis de trouver la vidéo.
  • Comparaison. Calculez vos propres indicateurs uniquement à partir des champs disponibles et comparez les groupes au sein d’un même instantané.

Cette méthode est préférable à une liste de liens, car elle conserve la provenance de chaque ligne et permet de distinguer la réapparition d’une même vidéo d’un nouveau contenu. Enregistrez aussi la date de collecte : les compteurs publics peuvent changer, et une valeur renvoyée aujourd’hui ne doit donc pas être interprétée comme une caractéristique permanente de la vidéo.

Fonctionnalités de l’API TikTok Scraper

Pour rechercher des vidéos à partir d’une requête textuelle, la documentation de jsonscraper décrit la route GET \/searchVideo à l’adresse de base https:\/\/tiktok.evelode.com. Le paramètre obligatoire est keyword ; les paramètres count, cursor, region, date_posted, sort_by et cache_timeout sont également disponibles. La documentation indique les options de tri most-liked, relevance et date-posted, ainsi que les périodes de publication yesterday, this-week, this-month, last-3-months, last-6-months et all-time. Vérifiez les noms et fonctions des paramètres dans le guide des routes TikTok.

La clé est transmise dans le paramètre de requête license_key. Pour un script opérationnel, placez-la dans la variable d’environnement JSONSCRAPER_TIKTOK_LICENSE_KEY, et non dans le code source, un tableur ou un journal d’exécution. Dans la réponse, vérifiez le champ de premier niveau status, puis analysez l’objet tiktok. Pour une recherche, la structure peut contenir une liste aweme_list, ainsi que search_item_list, où les informations de la vidéo se trouvent dans aweme_info. Le code ci-dessous prend en charge ces deux formats.

Les réponses de recherche examinées contiennent l’ID de la vidéo, sa description, sa date de publication, son lien, des informations sur l’auteur et des métriques comme les vues, les mentions J’aime, les commentaires, les enregistrements et les partages. Certains champs peuvent être absents d’une entrée. Dans le tableau, laissez ces valeurs vides au lieu de les remplacer par zéro : zéro indique une valeur mesurée, tandis qu’une cellule vide signifie que la valeur ne figure pas dans l’objet reçu.

Exemple minimal en Python

Le script ci-dessous effectue une requête par mot-clé, enregistre la réponse complète dans un fichier JSON et produit un CSV à ouvrir dans un tableur ou à traiter ultérieurement. Il nécessite Python 3.8 ou une version ultérieure et n’utilise que la bibliothèque standard. Définissez la variable d’environnement contenant la clé de licence avant de le lancer. Adaptez la liste de mots-clés et le nombre de résultats à votre cas d’usage.

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")

Le script associe chaque vidéo au mot-clé qui l’a trouvée, ce qui est important si une même vidéo apparaît pour plusieurs requêtes. Ici, la déduplication se fait au sein de chaque mot-clé ; un même ID peut donc occuper une ligne distincte pour différentes requêtes. Pour créer un tableau unique sans répétitions, remplacez la clé (keyword, video_id) par video_id et accumulez les mots-clés dans une liste ou dans une table de correspondance distincte.

Le code effectue volontairement une seule requête par mot-clé et ne parcourt pas automatiquement les pages. Pour récupérer la page suivante, la documentation définit cursor comme la valeur de continuation des résultats, à reprendre depuis la réponse précédente. Transmettez-le comme une valeur opaque, sans la calculer vous-même. Pour votre processus, vérifiez le schéma de pagination sur une réponse de test et arrêtez-vous lorsqu’il n’y a plus de nouveaux résultats ou de curseur suivant.

Obtenir un tableau comparable

Le CSV peut être ouvert dans un tableur, chargé dans une base de données ou utilisé en Python pour calculer des agrégats. Pour un premier rapport, regroupez les lignes par date de collecte, mot-clé et format vidéo. Il est préférable d’attribuer le format après avoir regardé la description et la vidéo : par exemple, « démonstration », « déballage », « avis » ou « comparaison ». Vous pouvez classer manuellement un petit échantillon ou demander à un modèle de proposer une première étiquette, à vérifier ensuite par une personne.

Si vous automatisez la classification des textes, ne transmettez au modèle que les champs nécessaires, par exemple la description et l’identifiant, et demandez-lui de renvoyer une seule étiquette tirée d’une liste prédéfinie. Conservez la description d’origine séparément du résultat de classification. L’analyste pourra ainsi vérifier une étiquette contestable et recalculer le rapport après une modification de la taxonomie, sans relancer l’API.

Pour comparer les métriques, utilisez les valeurs recueillies au même moment. Par exemple, le ratio des mentions J’aime aux vues se calcule avec likes \/ views, si les deux champs sont renseignés et que le nombre de vues est supérieur à zéro. On peut calculer de la même manière la part des commentaires ou des partages. Ces ratios décrivent les compteurs publics actuels de la vidéo ; ils ne mesurent ni la portée auprès d’un public donné, ni le taux de visionnage complet, ni les conversions. Pour prendre une décision commerciale, comparez-les à votre propre campagne et utilisez-les comme repères pour choisir des idées, et non comme une promesse de résultat si vous reproduisez le format d’un concurrent.

La médiane est souvent plus utile que la moyenne lorsque l’échantillon contient quelques vidéos très populaires. Comparez la médiane des vues et celle des réactions par groupe uniquement si la collecte suit les mêmes règles : mêmes requêtes, région, filtre temporel et instantanés pris à des moments proches. Consignez les paramètres de chaque exécution avec sa date. Si les changements de recherche ou d’échantillon modifient les lignes retenues, la différence entre deux rapports peut aussi refléter un changement de méthode.

Relancer la collecte et suivre les changements

Pour transformer une analyse ponctuelle en suivi régulier, exécutez le script selon un calendrier, par exemple chaque jour ou chaque semaine, et ajoutez la date de collecte à chaque enregistrement. Pour chaque vidéo, stockez des paires « heure de l’instantané — valeur du compteur ». Vous pourrez alors observer l’évolution des indicateurs publics entre les relevés, en conservant chaque mesure séparément. Ne remplacez pas les anciens compteurs par les valeurs actuelles : vous perdriez l’historique.

En production, transférez le JSON brut depuis le dossier local vers un stockage objet ou un autre système d’archivage, et stockez les lignes normalisées dans une base de données avec une clé unique, par exemple la combinaison de l’ID vidéo et de l’heure de collecte. Ajoutez un journal des erreurs qui n’inclut pas la clé secrète, limitez le nombre de tentatives et prévoyez une alerte en cas d’échec de requête. En cas d’erreur temporaire, vous pouvez réessayer après un délai ; en cas d’erreur structurelle, mieux vaut conserver la réponse et signaler l’exécution comme devant être vérifiée afin qu’une panne ne produise pas silencieusement un rapport vide.

N’utilisez pas la valeur cursor comme identifiant permanent de l’étude : c’est un marqueur de continuation des résultats. Conservez-la avec les paramètres de la requête concernée, utilisez-la uniquement pour poursuivre ces résultats et ne mélangez pas les pages de mots-clés différents. Notez également le nombre réel de résultats traités : la valeur demandée dans count indique la taille souhaitée de la réponse, sans garantir que toutes les publications correspondantes seront couvertes.

Faire évoluer le processus de travail

Si les résultats de recherche sont trop bruités, vous pouvez suivre séparément des profils publics précis ou des hashtags. La documentation comprend les routes \/getUserFeed et \/getHashtagFeed, avec leurs paramètres de requête et de pagination. Elles produisent d’autres échantillons, avec leurs propres règles de continuation : le flux d’un profil utilise max_cursor, tandis que celui d’un hashtag utilise cursor. Traitez-les comme des sources distinctes et enregistrez le type de source et ses paramètres pour ne pas mélanger les résultats de recherche par mot-clé aux publications d’un profil ou d’un hashtag.

Pour une équipe sans infrastructure propre, il est possible d’envoyer le CSV vers Google Sheets avec son API : la documentation de l’API Google Sheets décrit la lecture et l’écriture des valeurs des cellules. Créez des feuilles distinctes pour les exécutions brutes, les vidéos normalisées et le récapitulatif. Cette solution facilite l’annotation collaborative ; lorsque l’historique devient trop volumineux pour un tableur, migrez les lignes vers un stockage SQL en conservant les mêmes champs et leur provenance.

Un agent d’IA peut raisonnablement résumer les enregistrements déjà collectés et normalisés : regrouper les descriptions, suggérer des formats et signaler les valeurs inhabituelles. Il ne faut pas lui demander de formuler des faits sur l’ensemble de la plateforme à partir d’un petit ensemble de résultats. Indiquez-lui la période, la liste des requêtes et le nombre de lignes, demandez-lui de citer les ID des vidéos et de laisser vides les champs incertains ou absents. L’analyste vérifie ensuite les exemples à partir des liens conservés.

Résultat attendu

Une fois le processus configuré, l’équipe dispose d’un registre reproductible des vidéos trouvées, avec leurs identifiants, leurs liens, leurs descriptions, leurs auteurs, leurs dates de publication et les compteurs publics disponibles. La réponse brute conservée permet de vérifier la transformation, tandis que le CSV sert à trier rapidement les vidéos, à filtrer par mot-clé et à comparer les instantanés par date. Vous pouvez en tirer un bilan hebdomadaire : formats récurrents, publications à examiner et hypothèses créatives à tester dans votre propre contenu.

Le résultat concret n’est pas un classement universel des concurrents, mais un échantillon rigoureux dont la provenance est claire. Sa qualité dépend des requêtes, des filtres et de la période d’observation retenus. Conservez donc les paramètres de collecte, vérifiez manuellement certaines vidéos et distinguez les métriques disponibles de leur interprétation. Ce processus remplace les favoris éparpillés par des données comparables et permet de discuter des créations à partir d’exemples concrets.

Vous pouvez vérifier la route de recherche et ses paramètres dans la documentation officielle de jsonscraper ; la description du service et son accès sont disponibles sur la page de l’API TikTok Scraper. Commencez par quelques expressions de recherche, enregistrez une réponse de test et vérifiez sa structure avant de programmer des exécutions régulières.

People

No people listed for this article yet.

Keep readingComment détecter les premiers signaux de tendances TikTok : automatiser le suivi des résultats de recherche
Read the next article

Transformez vos lectures en intégration fonctionnelle

Explorez les API de données sociales de jsonscraper, testez des requêtes et créez votre prochain workflow.

Explorer les API