Los comentarios de YouTube contienen comentarios sobre productos, opiniones de la audiencia e ideas de contenido que la mayoría de las herramientas ignoran. Este tutorial utiliza la API de búsqueda de Scavio para buscar páginas de videos de YouTube, extraer datos de comentarios y devolver JSON limpio y estructurado, listo para canalizaciones de análisis, puntuación de sentimientos o consumo de agentes.
Requisitos previos
- Python 3.11+ o Node.js 20+
- Una clave API de Scavio de https://scavio.dev
- Familiaridad básica con el análisis JSON
- Opcional: pandas para análisis de datos
Guia paso a paso
Paso 1: Buscar páginas de vídeos de YouTube
Utilice la API de búsqueda de Scavio con una consulta de ámbito de sitio para encontrar URL de vídeos de YouTube que coincidan con su tema. La API devuelve metadatos de página y fragmentos de contenido.
import httpx
SCAVIO_API_KEY = "your-api-key"
async def search_youtube_videos(topic: str, max_results: int = 5) -> list[dict]:
async with httpx.AsyncClient(timeout=15) as client:
resp = await client.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": SCAVIO_API_KEY},
json={
"query": f"site:youtube.com {topic}",
"num_results": max_results
}
)
resp.raise_for_status()
results = resp.json().get("results", [])
videos = []
for r in results:
url = r.get("url", "")
if "youtube.com/watch" in url or "youtu.be/" in url:
videos.append({
"url": url,
"title": r.get("title", ""),
"snippet": r.get("description", ""),
"video_id": extract_video_id(url)
})
return videos
def extract_video_id(url: str) -> str:
if "v=" in url:
return url.split("v=")[1].split("&")[0]
if "youtu.be/" in url:
return url.split("youtu.be/")[1].split("?")[0]
return ""Paso 2: Obtener y analizar datos de comentarios de páginas de videos
Busque discusiones e hilos de comentarios relacionados con cada video. La API de Scavio captura el contenido de la página que incluye texto de comentarios visible de las páginas indexadas.
async def fetch_video_comments(
client: httpx.AsyncClient,
video_id: str,
video_title: str
) -> list[dict]:
resp = await client.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": SCAVIO_API_KEY},
json={
"query": f"youtube comments "{video_title}"",
"num_results": 10
}
)
resp.raise_for_status()
results = resp.json().get("results", [])
comments = []
for r in results:
content = r.get("description", "")
if len(content) > 20:
comments.append({
"video_id": video_id,
"source_url": r.get("url", ""),
"text": content,
"source_title": r.get("title", "")
})
return commentsPaso 3: Estructurar la salida como JSON limpio
Combine metadatos de vídeo y datos de comentarios en una única salida JSON estructurada. Agregue marcas de tiempo y deduplicación para mantener los datos limpios.
from datetime import datetime
async def extract_youtube_comments(topic: str) -> dict:
videos = await search_youtube_videos(topic)
all_data = []
seen_texts = set()
async with httpx.AsyncClient(timeout=15) as client:
for video in videos:
comments = await fetch_video_comments(
client, video["video_id"], video["title"]
)
unique_comments = []
for c in comments:
text_key = c["text"][:100].lower()
if text_key not in seen_texts:
seen_texts.add(text_key)
unique_comments.append(c)
all_data.append({
"video": video,
"comments": unique_comments,
"comment_count": len(unique_comments)
})
return {
"topic": topic,
"extracted_at": datetime.now().isoformat(),
"total_videos": len(videos),
"total_comments": sum(v["comment_count"] for v in all_data),
"videos": all_data
}Ejemplo en Python
import asyncio
import json
import httpx
from datetime import datetime
SCAVIO_API_KEY = "your-api-key"
def extract_video_id(url: str) -> str:
if "v=" in url:
return url.split("v=")[1].split("&")[0]
if "youtu.be/" in url:
return url.split("youtu.be/")[1].split("?")[0]
return ""
async def main():
topic = "AI agent frameworks 2026"
async with httpx.AsyncClient(timeout=15) as client:
# Find videos
resp = await client.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": SCAVIO_API_KEY},
json={"query": f"site:youtube.com {topic}", "num_results": 5}
)
videos = [
{"url": r["url"], "title": r.get("title", ""), "video_id": extract_video_id(r["url"])}
for r in resp.json().get("results", [])
if "youtube.com/watch" in r.get("url", "")
]
# Fetch comment discussions
all_comments = []
for v in videos:
resp = await client.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": SCAVIO_API_KEY},
json={"query": f"youtube comments \"{v['title']}\"", "num_results": 5}
)
for r in resp.json().get("results", []):
if len(r.get("description", "")) > 20:
all_comments.append({"video": v["title"], "text": r["description"][:200]})
output = {
"topic": topic,
"extracted_at": datetime.now().isoformat(),
"videos_found": len(videos),
"comments_extracted": len(all_comments),
"data": all_comments
}
print(json.dumps(output, indent=2))
asyncio.run(main())Ejemplo en JavaScript
const SCAVIO_API_KEY = "your-api-key";
function extractVideoId(url) {
if (url.includes("v=")) return url.split("v=")[1].split("&")[0];
if (url.includes("youtu.be/")) return url.split("youtu.be/")[1].split("?")[0];
return "";
}
async function searchScavio(query, numResults = 5) {
const resp = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": SCAVIO_API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query, num_results: numResults })
});
return resp.json();
}
async function main() {
const topic = "AI agent frameworks 2026";
const videoData = await searchScavio("site:youtube.com " + topic);
const videos = (videoData.results || [])
.filter(r => (r.url || "").includes("youtube.com/watch"))
.map(r => ({ url: r.url, title: r.title, videoId: extractVideoId(r.url) }));
const allComments = [];
for (const v of videos) {
const commData = await searchScavio('youtube comments "' + v.title + '"', 5);
for (const r of (commData.results || [])) {
if ((r.description || "").length > 20) {
allComments.push({ video: v.title, text: r.description.slice(0, 200) });
}
}
}
console.log(JSON.stringify({
topic,
extractedAt: new Date().toISOString(),
videosFound: videos.length,
commentsExtracted: allComments.length,
data: allComments
}, null, 2));
}
main();Salida esperada
{
"topic": "AI agent frameworks 2026",
"extracted_at": "2026-05-17T10:30:00",
"videos_found": 4,
"comments_extracted": 12,
"data": [...]
}