jsonscraper

Cómo analizar los temas de creadores de TikTok: un flujo práctico con Python

Cómo obtener feeds públicos mediante TikTok Scraper API, guardar las respuestas originales y preparar un análisis reproducible de las publicaciones.

Política editorial Informar de un error

Cuando un equipo busca un tema para su próxima campaña, revisar manualmente decenas de perfiles pronto se convierte en un conjunto de notas sin un método común. Un analista anota las visualizaciones, otro las descripciones de los vídeos y publicaciones con formulaciones parecidas acaban en tablas distintas. Una semana después, cuesta saber qué se repite más: el tema, el formato de presentación o, simplemente, un vídeo que tuvo éxito.

Artículo: Cómo analizar los temas de creadores de TikTok: un flujo práctico con Python
Resumen: Te explicamos cómo configurar con Python la monitorización de cuentas públicas de TikTok: comprobar la ruta y los parámetros en Postman, guardar las respuestas de la API, normalizar los campos verificados y comparar publicaciones a lo largo del tiempo.
Función de la imagen: portada: la idea central
Sección: 
Tema visual: Fotografía editorial de mosaicos de vídeos cortos anonimizados junto a tarjetas con marcas de tiempo y etiquetas temáticas sobre una mesa de investigación, que muestra un
© jsonscraper · Ilustración generada por IA

Un enfoque práctico consiste en mantener una lista pequeña de cuentas públicas, obtener periódicamente información sobre sus vídeos en un formato estructurado y guardar cada recopilación como una captura independiente. Después, se pueden comparar las publicaciones y las métricas disponibles a lo largo del tiempo, y usar un modelo de lenguaje para agrupar las descripciones de forma preliminar. A continuación presentamos el esquema de este flujo de investigación en Python con TikTok Scraper API de jsonscraper.

Formule la pregunta antes de recopilar datos

Imaginemos un equipo de marketing de una pequeña marca de nutrición deportiva. Necesita averiguar qué temas aparecen con regularidad en las cuentas públicas de los creadores de TikTok seleccionados y qué vídeos conviene revisar manualmente. El objetivo es comparar las publicaciones de cuentas elegidas de antemano durante un periodo de observación, no crear una clasificación universal de popularidad en TikTok.

Esto delimita el análisis. Recopilar el feed de los perfiles seleccionados permite estudiar el contenido y la frecuencia de publicación de esas cuentas. Los contadores públicos disponibles se pueden registrar en el momento de la consulta. Para evaluar los resultados de la publicidad propia harán falta datos independientes, como los gastos y las conversiones del sistema publicitario o de la analítica web.

Antes de conectar la API, registre el protocolo de investigación: la lista de cuentas, la fecha de inicio, la frecuencia de recopilación, los campos que se analizarán y los criterios para incluir publicaciones. Anote la hora de cada consulta. Así podrá distinguir el cambio de una métrica en un vídeo de las diferencias entre dos conjuntos de observaciones.

Qué recopilar y qué medir

Un proyecto pequeño necesita tres capas de datos. La primera es el identificador de la cuenta y la hora de inicio de la recopilación. La segunda es la respuesta original de la API, guardada para poder revisarla más adelante. La tercera son los campos normalizados para consultas e informes: ID del vídeo, descripción, hora de publicación y contadores de interacción disponibles.

Los nombres de los campos y la estructura anidada deben determinarse a partir de una respuesta de ejemplo de la ruta concreta. No dé por sentado que la lista siempre se llama videos o que el contador de visualizaciones se llama views. Primero haga la solicitud documentada y examine el JSON real; después configure la transformación a su propio esquema.

Entre las métricas útiles figuran el número de publicaciones nuevas por intervalo, la distribución de publicaciones por tema y el cambio de los contadores públicos entre capturas del mismo vídeo. Para esto último, compare registros cuyo ID de vídeo coincida. Así, la evolución de un vídeo ya publicado queda separada de las métricas de las publicaciones nuevas.

Conexión a TikTok Scraper API

La descripción de TikTok Scraper API indica la dirección base https:\/\/tiktok.evelode.com, y la referencia de rutas confirma GET \/getUserFeed y los parámetros query, max_cursor, count, region, with_pinned_posts, sort_type y cache_timeout. Para la primera solicitud basta con indicar el perfil en query y, por ejemplo, el número de elementos mediante count. La clave license_key se pasa en la cadena de consulta; la configuración también se describe en la referencia de la API. En la colección de Postman puede comprobar el endpoint y revisar la respuesta antes de integrar la API.

Guarde la clave en una variable de entorno. No la incluya en el código fuente, el repositorio, una hoja de cálculo ni una aplicación cliente. Ejecute la solicitud, guarde un ejemplo satisfactorio de JSON con la fecha y el nombre de la ruta, y úselo como base para el adaptador de normalización y las pruebas.

Una solicitud mínima funcional en Python

La referencia indica que la respuesta del feed de usuario contiene un estado externo y un objeto tiktok, donde la lista de publicaciones está en aweme_list. Los registros pueden incluir ID, descripción, hora de publicación, autor y estadísticas. Compruebe los campos y valores concretos en la respuesta obtenida: algunos datos pueden no estar disponibles.

import json
import os
from datetime import datetime, timezone
from pathlib import Path

import requests

API_KEY = os.environ["JSONSCRAPER_TIKTOK_LICENSE_KEY"]
ENDPOINT_URL = "https:\/\/tiktok.evelode.com\/getUserFeed"


def fetch_user_feed(handle: str, count: int = 20) -> dict:
    response = requests.get(
        ENDPOINT_URL,
        params={
            "license_key": API_KEY,
            "query": handle,
            "count": count,
            "region": "US",
        },
        timeout=45,
    )
    response.raise_for_status()
    payload = response.json()
    if not isinstance(payload, dict):
        raise ValueError("Se esperaba un objeto JSON")
    if payload.get("status") != "ok":
        raise RuntimeError(f"La API devolvió el estado: {payload.get('status')!r}")
    tiktok = payload.get("tiktok")
    if not isinstance(tiktok, dict):
        raise ValueError("Falta el objeto tiktok en la respuesta")
    return payload


def save_raw(payload: dict, account: str, output_dir: str = "data\/raw") -> Path:
    collected_at = datetime.now(timezone.utc).isoformat()
    safe_account = "".join(c for c in account if c.isalnum() or c in "-_@")
    path = Path(output_dir) \/ f"{safe_account}_{collected_at.replace(':', '-')}.json"
    path.parent.mkdir(parents=True, exist_ok=True)
    path.write_text(
        json.dumps(
            {"collected_at": collected_at, "account": account, "payload": payload},
            ensure_ascii=False,
            indent=2,
        ),
        encoding="utf-8",
    )
    return path


def normalize_items(payload: dict, account: str, collected_at: str) -> list:
    items = payload["tiktok"].get("aweme_list", [])
    if not isinstance(items, list):
        raise ValueError("El campo tiktok.aweme_list no es una lista")

    observations = []
    for item in items:
        if not isinstance(item, dict):
            continue
        stats = item.get("statistics")
        stats = stats if isinstance(stats, dict) else {}
        author = item.get("author")
        author = author if isinstance(author, dict) else {}
        observations.append({
            "account_handle": account,
            "collected_at": collected_at,
            "video_id": item.get("aweme_id"),
            "caption": item.get("desc"),
            "published_at_epoch": item.get("create_time"),
            "author_handle": author.get("unique_id"),
            "views": stats.get("play_count"),
            "likes": stats.get("digg_count"),
            "comments": stats.get("comment_count"),
            "shares": stats.get("share_count"),
        })
    return observations


if __name__ == "__main__":
    account = "creator_handle"
    payload = fetch_user_feed(account, count=20)
    collected_at = datetime.now(timezone.utc).isoformat()
    raw_path = save_raw(payload, account)
    observations = normalize_items(payload, account, collected_at)
    print(f"Guardado: {raw_path}; registros: {len(observations)}")

Antes de ejecutarlo, defina JSONSCRAPER_TIKTOK_LICENSE_KEY en el entorno e instale la biblioteca requests. El código comprueba la respuesta HTTP, el estado externo y la presencia del objeto tiktok, y después lee aweme_list. Guarda el JSON sin procesar y extrae los campos confirmados en la referencia, dejando vacíos los valores que falten. El feed obtenido es el conjunto de resultados que devuelve la API, por lo que el informe debe asociarse a la hora de la consulta y al perfil seleccionado.

Guarde capturas y compare publicaciones

Para un proyecto pequeño bastará con SQLite o PostgreSQL. Guarde la respuesta sin procesar por separado de los registros normalizados. Puede usar el siguiente esquema para la tabla de observaciones:

CREATE TABLE IF NOT EXISTS video_observations (
    account_handle TEXT NOT NULL,
    video_id TEXT NOT NULL,
    collected_at TEXT NOT NULL,
    published_at_epoch INTEGER,
    caption TEXT,
    views INTEGER,
    likes INTEGER,
    comments INTEGER,
    shares INTEGER,
    raw_file TEXT,
    PRIMARY KEY (account_handle, video_id, collected_at)
);

Cada ejecución añade una nueva captura, en lugar de sobrescribir la anterior. Al comparar contadores, calcule la diferencia solo cuando haya valores para el mismo vídeo en ambas observaciones. Incluya en el informe el intervalo entre consultas y la hora de observación: explican el periodo en que se acumuló el cambio.

Para agrupar por temas, empiece con un pequeño diccionario de categorías y añada después, si hace falta, un clasificador o un modelo de lenguaje. Pase al modelo descripciones depuradas, ID de publicaciones y categorías definidas de antemano. Un resultado estructurado con una categoría y una breve justificación es más fácil de comparar entre ejecuciones que una reseña libre.

Añada un modelo de lenguaje con etiquetado verificable

El modelo puede asignar de forma preliminar las descripciones a temas como «recetas», «entrenamientos», «reseñas de productos» e «historias personales». Para empezar, etiquete manualmente varias decenas de publicaciones. Compare las etiquetas automáticas con estos ejemplos, precise las definiciones de las categorías y vuelva a evaluar después de cambiar el prompt o el modelo.

El número de publicaciones nuevas, la mediana de los contadores y la diferencia entre capturas se calculan con más fiabilidad mediante código convencional. Use el modelo para clasificar texto y preparar breves explicaciones. Mantenga disponibles las descripciones originales y las observaciones numéricas para poder verificarlas.

Guarde junto con la etiqueta el ID de la publicación, la versión del prompt, la fecha de procesamiento y el modelo utilizado. Si la clasificación es incorrecta, el analista podrá localizar la descripción y corregir la regla. Conviene guardar por separado la etiqueta inicial y la corrección manual.

Automatice la ejecución

Una vez comprobada la ejecución manual, traslade el script a cron, GitHub Actions, n8n o Make. El programador ejecuta la recopilación según un calendario, pasa la lista de cuentas, registra el resultado y envía el informe al almacenamiento elegido. Guarde la clave en los secretos del entorno de ejecución. Pruebe primero el proceso con una cuenta y amplíe la lista después.

Divida la automatización en etapas: cola de cuentas, llamada a la API, guardado de la respuesta original, normalización, registro de la captura y preparación del informe. Un error en una cuenta no debe borrar los resultados de las demás. Puede hacer que las ejecuciones repetidas sean idempotentes mediante un ID de ejecución y restricciones de unicidad en la base de datos.

Registre la hora, la cuenta, la ruta, el estado HTTP, la duración, el número de elementos procesados y una descripción del error. No registre la clave de la API. El parámetro cache_timeout figura para \/getUserFeed; puede añadirlo a la solicitud si necesita establecer un plazo de caché. La referencia de la API indica que el valor predeterminado es de 3600 segundos.

Compruebe la calidad antes de publicar el informe

Compare varios registros normalizados con el JSON original. Compruebe que una recopilación repetida identifica el mismo vídeo por su ID, que las fechas se interpretan como se espera, que los campos numéricos tienen el tipo adecuado y que se conoce la proporción de valores ausentes. Después, ejecute de nuevo el proceso y asegúrese de que la base de datos conserva las observaciones anteriores y añade las nuevas.

No mezcle cuentas ni periodos de recopilación. Para comparar temas, utilice periodos de la misma duración o indique claramente su duración en el informe. Para seguir la evolución de los contadores, registre el intervalo entre capturas, de modo que el lector entienda la escala de los periodos comparados.

Conserve el texto original de la descripción y cree por separado una versión depurada. Los emojis, los hashtags, los enlaces y las particularidades lingüísticas pueden influir en la clasificación; disponer de campos separados permite comprobar el efecto de la depuración y recalcular las categorías sin volver a consultar la API.

Qué resultados dará el flujo de trabajo

Tras varios ciclos, el equipo dispondrá de una tabla de publicaciones y capturas, una agrupación preliminar de las descripciones por temas y un informe de los vídeos nuevos durante el periodo seleccionado. Esto ayuda a elegir vídeos para una revisión experta, detectar temas recurrentes en las cuentas seleccionadas y comprobar los cambios en los contadores públicos entre las fechas de observación.

A partir de estos datos, se pueden formular hipótesis para el calendario editorial: comparar maneras de presentar una misma cuestión o seleccionar temas que probar en el contenido propio. Para evaluar el efecto comercial, contraste las observaciones con los datos internos de las campañas.

Para empezar, elija una lista pequeña de cuentas públicas y compruebe GET \/getUserFeed en la colección de solicitudes de Postman. Traslade al código únicamente los parámetros y las rutas de campos confirmados por la documentación del endpoint y su respuesta real.

Recopilación responsable de datos públicos

Limite la lista de cuentas al objetivo de la investigación, recopile solo los campos necesarios y establezca un plazo de conservación para las respuestas originales. Antes de usar los datos con fines comerciales, compruebe las condiciones aplicables de la plataforma y los requisitos sobre datos personales de su jurisdicción. El control de acceso y la eliminación de capturas obsoletas ayudan a mantener el proceso dentro de los límites de la tarea.

Antes de enviar datos a un servicio de IA, elimine los campos que el modelo no necesite. En el informe, indique el ID de la publicación y la fecha de observación para que el personal pueda localizar el registro y comprobar en qué se basa la conclusión.

Lista breve para empezar

  1. Defina el sector, la lista de cuentas, el periodo y las preguntas de análisis.
  2. Compruebe los parámetros de GET \/getUserFeed en la referencia y la respuesta real en Postman.
  3. Guarde un ejemplo de JSON y configure el normalizador con los campos confirmados.
  4. Registre la respuesta original y capturas independientes con la hora de recopilación.
  5. Calcule las métricas numéricas con código; use la IA para agrupar texto de forma preliminar.
  6. Añada la programación, el registro de eventos, la gestión de reintentos y un plazo de conservación.

Así, la monitorización se convierte en una investigación reproducible: cada conclusión queda vinculada a una publicación y a una hora de observación, y el código se basa en el esquema real de la ruta seleccionada.

People

No people listed for this article yet.

Keep readingCómo archivar resultados de búsqueda de TikTok con Python
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