jsonscraper

Cómo comparar creatividades de TikTok de la competencia con métricas públicas: un flujo de trabajo en Python

Recopila resultados de varias búsquedas, elimina duplicados y compara vídeos por visualizaciones, Me gusta y comentarios

Política editorial Informar de un error

Dos equipos publican vídeos sobre un producto parecido, pero los evalúan manualmente con criterios distintos: uno recuerda las visualizaciones, otro se fija en los comentarios y un tercero guarda enlaces en un chat. Una semana después, cuesta saber qué formatos se repiten entre la competencia, qué publicaciones generan reacciones notables y qué ha cambiado desde la última revisión.

La solución consiste en recopilar una muestra acotada y reproducible de vídeos públicos mediante palabras clave definidas de antemano, guardar el JSON original y crear una tabla con campos uniformes. Así es posible comparar vídeos dentro de un mismo flujo de trabajo, en lugar de mezclar observaciones casuales con conclusiones sobre el mercado. A continuación se presenta un esquema para realizar un seguimiento competitivo a pequeña escala con Python y TikTok Scraper API de jsonscraper.

Define primero la pregunta del análisis

Recopilar datos resulta útil cuando se sabe de antemano qué decisión se tomará a partir de los resultados. Por ejemplo, un equipo de marketing de una empresa que fabrica botellas deportivas quiere entender cómo muestran el producto sus competidores en vídeos cortos: mediante una demostración de uso, un unboxing, una comparación o la reacción de un usuario. No hace falta copiar todo TikTok. Basta con unas cuantas búsquedas específicas y observar de forma repetible los vídeos que la API devuelve para esas búsquedas.

Formula la pregunta de modo que pueda comprobarse: «¿Qué formatos de descripción y demostración aparecen en los vídeos publicados que corresponden a nuestras cinco frases clave, y cuáles de los vídeos encontrados registran actualmente más visualizaciones y reacciones?». Esta formulación separa dos niveles de análisis. El texto y la descripción ayudan a agrupar los enfoques creativos; los contadores de visualizaciones, Me gusta, comentarios y compartidos ofrecen una instantánea de la reacción pública en el momento de la recopilación.

Esta instantánea sirve para priorizar la revisión manual y hacer un seguimiento de los cambios. Describe los vídeos devueltos para unas consultas, unos parámetros y un momento de ejecución concretos. Por eso, una conclusión válida sería «los unboxings aparecen con frecuencia en nuestra muestra» o «este grupo de vídeos tiene ahora una mediana de visualizaciones más alta». Este alcance de análisis ayuda al equipo a elegir hipótesis para su propio contenido.

Diseña un pequeño flujo de datos

Divide el trabajo en cuatro etapas: recopilación, almacenamiento de la respuesta sin procesar, normalización y análisis. La recopilación consulta la API para cada palabra clave aprobada. La respuesta sin procesar se guarda íntegra para poder revisarla de nuevo. La normalización transforma la estructura anidada del JSON en filas de una tabla, y el análisis calcula métricas y agrupa los vídeos por palabra clave o por formatos asignados manualmente.

  • Recopilación. Solicita un número definido de resultados para cada palabra clave, usando la misma región y el mismo criterio de ordenación.
  • Archivo. Guarda el JSON original y la hora de obtención para poder verificar los valores extraídos.
  • Normalización. Conserva el identificador del vídeo, el enlace, la descripción, el autor, la fecha de publicación y los contadores disponibles.
  • Control de calidad. Elimina duplicados por ID, señala los valores ausentes y conserva la palabra clave que permitió encontrar el vídeo.
  • Comparación. Calcula indicadores propios únicamente a partir de los campos originales disponibles y compara los grupos dentro de una misma instantánea.

Este enfoque es mejor que una lista de enlaces, porque conserva la procedencia de cada fila y permite distinguir si un vídeo vuelve a aparecer o si se trata de material nuevo. Guarda también la fecha de recopilación: los contadores públicos pueden cambiar, así que el valor de la respuesta de hoy no debe interpretarse como una característica permanente del vídeo.

Qué permite TikTok Scraper API

Para buscar vídeos por texto, la documentación de jsonscraper describe la ruta GET \/searchVideo en la dirección base https:\/\/tiktok.evelode.com. El parámetro obligatorio es keyword; también están disponibles count, cursor, region, date_posted, sort_by y cache_timeout. La documentación incluye las opciones de ordenación most-liked, relevance y date-posted, así como los periodos de publicación yesterday, this-week, this-month, last-3-months, last-6-months y all-time. Comprueba los nombres y las funciones de los parámetros en la referencia de rutas de TikTok.

La clave se transmite en el parámetro de consulta license_key. Para un script de producción, guárdala en la variable de entorno JSONSCRAPER_TIKTOK_LICENSE_KEY, no en el archivo de código, una hoja de cálculo o un registro de ejecución. En la respuesta, comprueba el status de nivel superior y luego procesa el objeto tiktok. En una búsqueda, la estructura puede contener una lista aweme_list y también search_item_list, con los datos del vídeo dentro de aweme_info. El código siguiente admite ambas estructuras.

Entre los datos observados en respuestas de búsqueda se encuentran el ID del vídeo, la descripción, la fecha de publicación, el enlace, la información del autor y métricas como visualizaciones, Me gusta, comentarios, guardados y compartidos. Algunos campos pueden faltar en un registro concreto. En la tabla, esos valores deben dejarse vacíos en vez de sustituirse por cero: el cero representa un valor medido; un campo vacío indica que el objeto recibido no contenía ese valor.

Ejemplo básico en Python

El script siguiente realiza una consulta por cada palabra clave, guarda la respuesta completa en un archivo JSON y genera un CSV para una hoja de cálculo o su posterior procesamiento. Está pensado para Python 3.8 o posterior y solo utiliza la biblioteca estándar. Antes de ejecutarlo, configura la variable de entorno con la clave de licencia. Adapta la lista de palabras clave y el número de resultados a tu caso.

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 = ["botella térmica", "botella deportiva", "unboxing de botella"]
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 devolvió un estado distinto de ok")

    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("Se guardaron", len(records), "filas de vídeos en tiktok_creatives.csv")

El script guarda la palabra clave junto al vídeo, algo importante si se encuentra el mismo vídeo con varias consultas. Aquí la deduplicación se realiza dentro de cada palabra clave, por lo que un mismo ID puede ocupar una fila independiente para distintas consultas. Para tener una sola tabla sin repeticiones, sustituye la clave (keyword, video_id) por video_id y acumula las palabras clave en una lista o en una tabla de relaciones aparte.

El código realiza intencionadamente una consulta por palabra y no recorre páginas de forma automática. Si necesitas la página siguiente, la documentación define cursor como el valor que permite avanzar por los resultados y que se obtiene de la respuesta anterior. Debe transmitirse como un valor opaco, sin calcularlo por cuenta propia. Para cada flujo de trabajo, comprueba el esquema de paginación con una respuesta de prueba y detente cuando no haya nuevos resultados o un cursor siguiente.

Cómo obtener una tabla comparable

Puedes abrir el CSV en una hoja de cálculo, cargarlo en una base de datos o utilizar Python para calcular agregados. Para el informe inicial, agrupa las filas por fecha de recopilación, palabra clave y formato del vídeo. Lo mejor es asignar el formato después de revisar la descripción y el vídeo: por ejemplo, «demostración», «unboxing», «reseña» o «comparación». En una muestra pequeña, puedes clasificar manualmente o pedir a un modelo que proponga una clasificación preliminar que luego revisará una persona.

Si automatizas la clasificación de textos, envía al modelo solo los campos necesarios —por ejemplo, la descripción y el identificador— y pídele que devuelva una etiqueta de una lista aprobada de antemano. Conserva la descripción original por separado del resultado de la clasificación. Así, un analista podrá comprobar las etiquetas dudosas y volver a calcular el informe si cambia la taxonomía, sin hacer otra consulta a la API.

Para comparar métricas, utiliza valores recogidos en el mismo momento. Por ejemplo, la proporción de Me gusta respecto a las visualizaciones puede calcularse como likes / views cuando ambos campos están presentes y las visualizaciones son superiores a cero. También se puede calcular la proporción de comentarios o compartidos. Estas proporciones describen el contador público actual de ese vídeo; no miden el alcance de una audiencia concreta, las visualizaciones completas ni las conversiones. Para tomar decisiones de negocio, compáralas con tu propia campaña y úsalas como referencia para elegir ideas, no como garantía de que repetir el formato de otra cuenta dará el mismo resultado.

La mediana suele ser más útil que la media cuando hay varios vídeos con cifras excepcionalmente altas en la muestra. Compara las medianas de visualizaciones y reacciones por grupo solo si aplicas el mismo método de recopilación: idéntico conjunto de consultas, región y filtro temporal, y una hora de captura similar. Registra los parámetros de cada ejecución junto con la fecha. Si cambian la búsqueda o la muestra, las diferencias entre dos informes también podrían reflejar un cambio de método.

Repetición de ejecuciones y seguimiento de cambios

Para convertir un análisis puntual en un seguimiento, ejecuta el script según un calendario —por ejemplo, a diario o una vez por semana— y añade la fecha de recopilación a cada registro. Guarda para cada vídeo pares de «hora de la instantánea — valor del contador». Así podrás ver cómo han cambiado las métricas públicas entre observaciones y conservar cada medición por separado. No sobrescribas los contadores antiguos con los actuales: de lo contrario, perderás la evolución.

En producción, traslada el JSON original de la carpeta local a un almacenamiento de objetos u otro sistema de archivo, y guarda las filas normalizadas en una base de datos con una clave única, como la combinación del ID del vídeo y la hora de recopilación. Añade un registro de errores que no incluya la clave secreta, limita el número de reintentos y configura avisos si falla una consulta. Si se produce un error temporal, puedes repetir la consulta tras una espera; ante un error estructural, es preferible guardar la respuesta y marcar la ejecución para su revisión, de modo que el fallo no genere silenciosamente un informe vacío.

No utilices cursor como identificador permanente del análisis: es un marcador para continuar los resultados. Guárdalo junto con los parámetros de la consulta correspondiente, úsalo solo para continuar esa consulta y no mezcles páginas de palabras clave distintas. Registra también el número real de resultados procesados: el valor solicitado en count indica el tamaño de respuesta deseado, pero no garantiza que se incluyan todas las publicaciones pertinentes.

Cómo ampliar el flujo de trabajo

Si la muestra de búsqueda contiene demasiado ruido, puedes hacer un seguimiento independiente de perfiles públicos concretos o de hashtags. La documentación incluye las rutas \/getUserFeed y \/getHashtagFeed, con parámetros de consulta y paginación. Son muestras distintas, cada una con sus propias reglas para avanzar: la fuente de un perfil utiliza max_cursor y la de un hashtag, cursor. Incorpóralas como fuentes independientes y conserva el tipo de fuente y sus parámetros para no mezclar resultados de búsquedas por palabra clave con publicaciones de un perfil o hashtag.

Si el equipo no tiene infraestructura propia, puede enviar el CSV a Google Sheets mediante la API: la documentación de Google Sheets API explica cómo leer y escribir valores de celdas. Crea hojas separadas para las ejecuciones sin procesar, los vídeos normalizados y el resumen. Esta opción facilita la clasificación colaborativa; cuando el historial crezca demasiado para una hoja de cálculo, migra las filas a un almacén SQL conservando los mismos campos y la procedencia de los datos.

Una función razonable para un agente de IA es preparar un resumen breve de los registros ya recopilados y normalizados: agrupar descripciones, proponer formatos y destacar valores inusuales. No conviene pedirle que extraiga conclusiones sobre toda la plataforma a partir de un pequeño conjunto de resultados. Indícale el periodo, la lista de consultas y el número de filas; pídele que haga referencia a los ID de vídeo y que deje vacíos los campos inciertos o ausentes. Después, un analista puede verificar los ejemplos mediante los enlaces guardados.

Qué obtendrás

Una vez configurado el flujo, el equipo tendrá un registro reproducible de los vídeos encontrados, con identificadores, enlaces, descripciones, autores, fechas de publicación y contadores públicos disponibles. La respuesta original guardada permite verificar la transformación, y el CSV facilita ordenar los vídeos, filtrar por palabras clave y comparar instantáneas de distintas fechas. A partir de esos datos se puede preparar un resumen semanal: qué formatos se repiten, qué publicaciones merecen una revisión y qué hipótesis creativas vale la pena probar en el contenido propio.

El resultado práctico no es una clasificación universal de la competencia, sino una muestra organizada cuya procedencia está clara. Su calidad depende de las búsquedas, los filtros y el periodo de observación elegidos. Por eso, conserva los parámetros de recopilación, revisa manualmente algunos vídeos y distingue las métricas disponibles de su interpretación. Este proceso permite sustituir los marcadores dispersos por datos comparables y hablar de creatividad a partir de ejemplos concretos.

Puedes comprobar la ruta de búsqueda y los parámetros en la documentación oficial de jsonscraper. La descripción del servicio y el acceso están en la página de TikTok Scraper API. Empieza con unas pocas frases de búsqueda, guarda una respuesta de prueba y comprueba su estructura antes de programar ejecuciones periódicas.

People

No people listed for this article yet.

Keep readingCómo detectar señales tempranas de tendencias en TikTok: monitorización automática de los resultados de búsqueda
Read the next article

Convierte lo que lees en una integración funcional

Explora las API de datos sociales de jsonscraper, prueba solicitudes y crea tu próximo flujo de trabajo.

Explorar APIs