Les commentaires YouTube contiennent des retours sur les produits, le sentiment du public et des idées de contenu que la plupart des outils ignorent. Ce tutoriel utilise l'API Scavio Search pour trouver des pages de vidéos YouTube, extraire les données des commentaires et renvoyer un JSON structuré et propre prêt pour les pipelines d'analyse, le scoring de sentiment ou la consommation par des agents.
Prérequis
- Python 3.11+ ou Node.js 20+
- Une clé API Scavio depuis https://scavio.dev
- Connaissance de base de l'analyse JSON
- Optionnel : pandas pour l'analyse de données
Parcours
Étape 1: Rechercher des pages de vidéos YouTube
Utilisez l'API Scavio Search avec une requête limitée au site pour trouver des URL de vidéos YouTube correspondant à votre sujet. L'API renvoie les métadonnées de la page et des extraits de contenu.
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 ""Étape 2: Récupérer et analyser les données des commentaires à partir des pages de vidéos
Recherchez les discussions et les fils de commentaires liés à chaque vidéo. L'API Scavio capture le contenu de la page qui inclut le texte des commentaires visibles à partir des pages indexées.
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 commentsÉtape 3: Structurer la sortie en JSON propre
Combinez les métadonnées vidéo et les données de commentaires en une seule sortie JSON structurée. Ajoutez des horodatages et une déduplication pour garder les données propres.
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
}Exemple 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())Exemple 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();Sortie attendue
{
"topic": "AI agent frameworks 2026",
"extracted_at": "2026-05-17T10:30:00",
"videos_found": 4,
"comments_extracted": 12,
"data": [...]
}