La creación de un rastreador de tendencias de comercio electrónico de TikTok con una API le permite monitorear productos virales, hashtags de tendencias y nichos emergentes en tiempo real para que pueda obtener productos ganadores antes de que sus competidores los detecten. Este tutorial lo guiará a través de la búsqueda de contenido de TikTok relacionado con el comercio electrónico, la extracción de señales de productos a partir de hashtags y subtítulos, y la creación de un sistema de puntuación que clasifica las tendencias por velocidad y participación.
Requisitos previos
- Clave API de Scavio con acceso a TikTok (250 créditos gratuitos al mes en scavio.dev)
- Python 3.9+ o Node.js 18+
- Comprensión básica de la investigación de productos de comercio electrónico
Guia paso a paso
Paso 1: Definir consultas de búsqueda de descubrimiento de productos
Cree una lista de consultas de búsqueda de TikTok que muestren productos virales. Utilice consultas estilo hashtag y palabras clave de categorías de productos que los dropshippers y las marcas DTC comúnmente monitorean. Incluya consultas de tendencias amplias y específicas de nichos.
search_queries = [
'tiktok made me buy it',
'viral product 2026',
'amazon finds must have',
'small business check',
'dropshipping winning product',
'kitchen gadget viral',
'skincare routine viral',
'home organization hack',
]Paso 2: Busque en TikTok contenido de tendencia
Consulte el punto final de búsqueda de Scavio TikTok para cada consulta de descubrimiento de producto. Recopile metadatos de video, incluidos recuentos de vistas, me gusta, acciones compartidas, hashtags y fechas de publicación. Estos datos sin procesar se convierten en su señal de tendencia.
import requests
API_KEY = 'your_scavio_api_key'
def search_tiktok(query, count=20):
resp = requests.post(
'https://api.scavio.dev/api/v1/tiktok/search/videos',
headers={'Authorization': f'Bearer {API_KEY}'},
json={'query': query, 'count': count}
)
resp.raise_for_status()
return resp.json().get('videos', [])
all_videos = []
for q in search_queries:
videos = search_tiktok(q, count=20)
for v in videos:
v['search_query'] = q
all_videos.extend(videos)
print(f'Collected {len(all_videos)} videos across {len(search_queries)} queries')Paso 3: Extraer y clasificar hashtags por participación
Analice los hashtags de todos los videos recopilados y agregue métricas de participación por hashtag. Los hashtags que aparecen en varios videos de alta participación indican un producto o nicho de tendencia.
from collections import defaultdict
hashtag_stats = defaultdict(lambda: {'total_views': 0, 'total_likes': 0, 'video_count': 0})
for v in all_videos:
for tag in v.get('hashtags', []):
tag_lower = tag.lower()
hashtag_stats[tag_lower]['total_views'] += v.get('views', 0)
hashtag_stats[tag_lower]['total_likes'] += v.get('likes', 0)
hashtag_stats[tag_lower]['video_count'] += 1
# Rank by a composite score: views * sqrt(video_count)
import math
ranked = sorted(
hashtag_stats.items(),
key=lambda x: x[1]['total_views'] * math.sqrt(x[1]['video_count']),
reverse=True
)
print('Top trending hashtags:')
for tag, stats in ranked[:15]:
print(f' #{tag}: {stats["total_views"]:,} views, {stats["video_count"]} videos')Paso 4: Calificar y clasificar tendencias de productos
Asigne una puntuación de tendencia a cada grupo de hashtags en función de la velocidad de participación (vistas por video), la amplitud (cantidad de videos únicos) y la actualidad. Clasifique las tendencias como emergentes, máximas o saturadas según los umbrales de puntuación.
def score_trend(stats):
views_per_video = stats['total_views'] / max(stats['video_count'], 1)
breadth = stats['video_count']
score = (views_per_video / 1000) * math.sqrt(breadth)
if score > 100 and breadth < 10:
phase = 'emerging'
elif score > 50:
phase = 'peaking'
else:
phase = 'saturated'
return {'score': round(score, 1), 'phase': phase, 'views_per_video': int(views_per_video)}
trends = []
for tag, stats in ranked[:30]:
trend = score_trend(stats)
trend['hashtag'] = tag
trend['total_views'] = stats['total_views']
trend['video_count'] = stats['video_count']
trends.append(trend)
for t in trends[:10]:
print(f'#{t["hashtag"]} | score: {t["score"]} | phase: {t["phase"]} | {t["views_per_video"]:,} views/vid')Paso 5: Informe de tendencias de exportación
Guarde las tendencias puntuadas en un archivo JSON que pueda incorporar a su flujo de trabajo de investigación de productos, alertas de Slack o panel de control. Incluya los datos sin procesar para que pueda volver a calificar con diferentes umbrales más adelante.
import json
report = {
'scan_date': '2026-05-12',
'total_videos_analyzed': len(all_videos),
'unique_hashtags': len(hashtag_stats),
'top_trends': trends,
}
with open('tiktok_ecommerce_trends.json', 'w') as f:
json.dump(report, f, indent=2)
print(f'Exported {len(trends)} trends to tiktok_ecommerce_trends.json')Ejemplo en Python
import requests
import math
import json
from collections import defaultdict
API_KEY = 'your_scavio_api_key'
search_queries = [
'tiktok made me buy it',
'viral product 2026',
'amazon finds must have',
'dropshipping winning product',
]
def search_tiktok(query, count=20):
resp = requests.post(
'https://api.scavio.dev/api/v1/tiktok/search/videos',
headers={'Authorization': f'Bearer {API_KEY}'},
json={'query': query, 'count': count}
)
resp.raise_for_status()
return resp.json().get('videos', [])
all_videos = []
for q in search_queries:
videos = search_tiktok(q, count=20)
for v in videos:
v['search_query'] = q
all_videos.extend(videos)
hashtag_stats = defaultdict(lambda: {'total_views': 0, 'total_likes': 0, 'video_count': 0})
for v in all_videos:
for tag in v.get('hashtags', []):
tag_lower = tag.lower()
hashtag_stats[tag_lower]['total_views'] += v.get('views', 0)
hashtag_stats[tag_lower]['total_likes'] += v.get('likes', 0)
hashtag_stats[tag_lower]['video_count'] += 1
ranked = sorted(
hashtag_stats.items(),
key=lambda x: x[1]['total_views'] * math.sqrt(x[1]['video_count']),
reverse=True
)
trends = []
for tag, stats in ranked[:30]:
vpv = stats['total_views'] / max(stats['video_count'], 1)
score = (vpv / 1000) * math.sqrt(stats['video_count'])
phase = 'emerging' if score > 100 and stats['video_count'] < 10 else ('peaking' if score > 50 else 'saturated')
trends.append({
'hashtag': tag,
'score': round(score, 1),
'phase': phase,
'total_views': stats['total_views'],
'video_count': stats['video_count'],
})
report = {
'scan_date': '2026-05-12',
'total_videos': len(all_videos),
'top_trends': trends,
}
with open('tiktok_ecommerce_trends.json', 'w') as f:
json.dump(report, f, indent=2)
print(f'Analyzed {len(all_videos)} videos, found {len(trends)} trends')
for t in trends[:5]:
print(f' #{t["hashtag"]} | score: {t["score"]} | {t["phase"]}')Ejemplo en JavaScript
const fs = require('fs');
const API_KEY = 'your_scavio_api_key';
const searchQueries = [
'tiktok made me buy it',
'viral product 2026',
'amazon finds must have',
'dropshipping winning product',
];
async function searchTiktok(query, count = 20) {
const resp = await fetch('https://api.scavio.dev/api/v1/tiktok/search/videos', {
method: 'POST',
headers: { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ query, count }),
});
const data = await resp.json();
return data.videos || [];
}
async function main() {
const allVideos = [];
for (const q of searchQueries) {
const videos = await searchTiktok(q, 20);
videos.forEach(v => { v.search_query = q; });
allVideos.push(...videos);
}
const hashtagStats = {};
for (const v of allVideos) {
for (const tag of v.hashtags || []) {
const t = tag.toLowerCase();
if (!hashtagStats[t]) hashtagStats[t] = { totalViews: 0, totalLikes: 0, videoCount: 0 };
hashtagStats[t].totalViews += v.views || 0;
hashtagStats[t].totalLikes += v.likes || 0;
hashtagStats[t].videoCount += 1;
}
}
const ranked = Object.entries(hashtagStats)
.sort((a, b) => b[1].totalViews * Math.sqrt(b[1].videoCount) - a[1].totalViews * Math.sqrt(a[1].videoCount))
.slice(0, 30);
const trends = ranked.map(([tag, stats]) => {
const vpv = stats.totalViews / Math.max(stats.videoCount, 1);
const score = (vpv / 1000) * Math.sqrt(stats.videoCount);
const phase = score > 100 && stats.videoCount < 10 ? 'emerging' : score > 50 ? 'peaking' : 'saturated';
return { hashtag: tag, score: Math.round(score * 10) / 10, phase, totalViews: stats.totalViews, videoCount: stats.videoCount };
});
const report = { scan_date: '2026-05-12', total_videos: allVideos.length, top_trends: trends };
fs.writeFileSync('tiktok_ecommerce_trends.json', JSON.stringify(report, null, 2));
console.log(`Analyzed ${allVideos.length} videos, found ${trends.length} trends`);
trends.slice(0, 5).forEach(t => console.log(` #${t.hashtag} | score: ${t.score} | ${t.phase}`));
}
main();Salida esperada
Analyzed 80 videos, found 30 trends
#tiktokmademebuyit | score: 245.3 | peaking
#viralproduct | score: 189.7 | peaking
#amazonfind | score: 134.2 | emerging
#kitchengadget | score: 98.4 | peaking
#dropshipping2026 | score: 76.1 | emerging