Los comentarios de YouTube contienen comentarios sobre productos, opiniones de la audiencia e ideas de contenido que son difíciles de extraer a escala. La API de datos oficial de YouTube tiene límites de cuota estrictos y requiere la configuración de OAuth para la mayoría de las operaciones de comentarios. La API de Scavio proporciona una ruta más sencilla: PUBLICAR con una identificación de video y recibir datos de comentarios estructurados, incluido el autor, el texto, el recuento de me gusta, el recuento de respuestas y la fecha de publicación. Este tutorial crea un script de Python reutilizable que recupera todos los comentarios disponibles para un video y los escribe en un archivo CSV adecuado para su análisis en hojas de cálculo o pandas.
Requisitos previos
- Python 3.8 o superior instalado
- solicita biblioteca instalada
- Una clave API de Scavio de scavio.dev
- Una identificación de video de YouTube para probar
Guia paso a paso
Paso 1: Obtener comentarios para un vídeo
PUBLICAR en el punto final de Scavio con la plataforma de YouTube y la identificación del video. La respuesta incluye una matriz de comentarios con datos estructurados para cada comentario.
import os
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
def fetch_comments(video_id: str) -> list[dict]:
r = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "youtube", "action": "comments", "video_id": video_id}
)
r.raise_for_status()
return r.json().get("comments", [])Paso 2: Normalizar y limpiar datos de comentarios
Extraiga los campos que necesita de cada objeto de comentario. Elimine las nuevas líneas del texto del comentario para evitar romper las filas CSV.
def normalize_comment(comment: dict) -> dict:
return {
"author": comment.get("author", ""),
"text": comment.get("text", "").replace("\n", " ").strip(),
"likes": comment.get("likes", 0),
"replies": comment.get("reply_count", 0),
"date": comment.get("published_at", "")
}Paso 3: Escribir comentarios en CSV
Utilice csv.DictWriter para generar los comentarios normalizados. Incluya una fila de encabezado con nombres de columnas.
import csv
def write_csv(comments: list[dict], output: str) -> None:
fields = ["author", "text", "likes", "replies", "date"]
with open(output, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=fields)
writer.writeheader()
writer.writerows(comments)
print(f"Wrote {len(comments)} comments to {output}")Paso 4: Ejecutar todo el proceso de exportación
Encadena las funciones. Acepte una identificación de video como entrada, obtenga, normalice y exporte.
video_id = "dQw4w9WgXcQ"
raw = fetch_comments(video_id)
normalized = [normalize_comment(c) for c in raw]
write_csv(normalized, f"comments_{video_id}.csv")
print(f"Exported {len(normalized)} comments for video {video_id}")Ejemplo en Python
import os
import csv
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def fetch_comments(video_id: str) -> list[dict]:
r = requests.post(
ENDPOINT,
headers={"x-api-key": API_KEY},
json={"platform": "youtube", "action": "comments", "video_id": video_id}
)
r.raise_for_status()
return r.json().get("comments", [])
def normalize(comment: dict) -> dict:
return {
"author": comment.get("author", ""),
"text": comment.get("text", "").replace("\n", " ").strip(),
"likes": comment.get("likes", 0),
"replies": comment.get("reply_count", 0),
"date": comment.get("published_at", "")
}
def export_to_csv(video_id: str, output: str = "") -> None:
if not output:
output = f"comments_{video_id}.csv"
raw = fetch_comments(video_id)
comments = [normalize(c) for c in raw]
fields = ["author", "text", "likes", "replies", "date"]
with open(output, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=fields)
writer.writeheader()
writer.writerows(comments)
print(f"Exported {len(comments)} comments to {output}")
if __name__ == "__main__":
export_to_csv("dQw4w9WgXcQ")Ejemplo en JavaScript
const fs = require("fs");
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
async function fetchComments(videoId) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ platform: "youtube", action: "comments", video_id: videoId })
});
const data = await res.json();
return data.comments || [];
}
async function exportToCsv(videoId) {
const raw = await fetchComments(videoId);
const header = "author,text,likes,replies,date";
const rows = raw.map(c => {
const text = (c.text || "").replace(/[\n\r]/g, " ").replace(/"/g, '""');
return `"${c.author || ""}","${text}",${c.likes || 0},${c.reply_count || 0},"${c.published_at || ""}"`;
});
fs.writeFileSync(`comments_${videoId}.csv`, [header, ...rows].join("\n"));
console.log(`Exported ${raw.length} comments`);
}
exportToCsv("dQw4w9WgXcQ").catch(console.error);Salida esperada
{
"video_id": "dQw4w9WgXcQ",
"comments": [
{
"author": "MusicFan2026",
"text": "This song will never get old.",
"likes": 42,
"reply_count": 3,
"published_at": "2026-01-15T08:30:00Z"
},
{
"author": "RetroVibes",
"text": "Still the greatest rickroll of all time.",
"likes": 18,
"reply_count": 1,
"published_at": "2026-02-20T14:12:00Z"
}
]
}