Cree una base de conocimiento de YouTube en MongoDB buscando videos relevantes para el tema a través de la API de Scavio, extrayendo metadatos y datos de transcripción, almacenándolos como documentos indexados por texto y consultando la base de conocimiento con búsqueda de texto completo. YouTube contiene conocimientos expertos en todos los dominios, pero está encerrado en el formato de vídeo. Una base de conocimiento con capacidad de búsqueda convierte ese contenido de video en texto consultable, haciéndolo accesible para agentes de investigación, chatbots y herramientas internas.
Requisitos previos
- Python 3.8+ instalado
- biblioteca pymongo instalada
- MongoDB ejecutándose localmente o cadena de conexión Atlas
- Una clave API de Scavio de scavio.dev
Guia paso a paso
Paso 1: Buscar temas de YouTube
Consulta YouTube a través de Scavio para encontrar videos relevantes sobre tus temas objetivo.
import os, requests
from pymongo import MongoClient
from datetime import datetime
API_KEY = os.environ['SCAVIO_API_KEY']
MONGO_URI = os.environ.get('MONGO_URI', 'mongodb://localhost:27017')
client = MongoClient(MONGO_URI)
db = client['youtube_kb']
collection = db['videos']
def search_youtube(topic: str) -> list:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'youtube', 'query': topic}, timeout=15)
resp.raise_for_status()
return resp.json().get('organic_results', [])
results = search_youtube('python async programming tutorial')
print(f'Found {len(results)} videos')Paso 2: Extraer metadatos de vídeo
Analice los resultados de la búsqueda para extraer el título, el canal, la descripción, las vistas y la duración de cada video.
def extract_metadata(results: list, topic: str) -> list:
docs = []
for r in results:
doc = {
'title': r.get('title', ''),
'url': r.get('link', ''),
'channel': r.get('channel', r.get('author', '')),
'description': r.get('snippet', r.get('description', '')),
'views': r.get('views', ''),
'duration': r.get('duration', ''),
'topic': topic,
'indexed_at': datetime.utcnow(),
'searchable_text': f"{r.get('title', '')} {r.get('snippet', '')} {r.get('channel', '')}",
}
docs.append(doc)
return docs
docs = extract_metadata(results, 'python async')
print(f'Extracted {len(docs)} video documents')
if docs:
print(f'Sample: {docs[0]["title"][:60]}')Paso 3: Crear índice de texto MongoDB
Almacene los documentos en MongoDB y cree un índice de texto en los campos de búsqueda para consultas de texto completo.
def index_videos(docs: list) -> int:
if not docs:
return 0
# Upsert to avoid duplicates
inserted = 0
for doc in docs:
result = collection.update_one(
{'url': doc['url']},
{'$set': doc},
upsert=True
)
if result.upserted_id:
inserted += 1
return inserted
# Create text index
collection.create_index([
('searchable_text', 'text'),
('title', 'text'),
('description', 'text'),
])
count = index_videos(docs)
print(f'Indexed {count} new videos (total: {collection.count_documents({})})')Paso 4: Buscar en la base de conocimientos
Consulta tu base de conocimientos de MongoDB mediante la búsqueda de texto completo para encontrar vídeos relevantes por contenido.
def search_kb(query: str, limit: int = 5) -> list:
cursor = collection.find(
{'$text': {'$search': query}},
{'score': {'$meta': 'textScore'}}
).sort([('score', {'$meta': 'textScore'})]).limit(limit)
results = []
for doc in cursor:
results.append({
'title': doc['title'],
'url': doc['url'],
'channel': doc.get('channel', ''),
'score': doc.get('score', 0),
})
return results
results = search_kb('async await python')
for r in results:
print(f"{r['score']:.1f} | {r['title'][:50]} | {r['channel']}")Paso 5: Automatizar la indexación diaria
Cree un trabajo diario que busque nuevos temas y agregue videos nuevos a la base de conocimientos.
DAILY_TOPICS = [
'python best practices 2026',
'machine learning tutorial',
'system design interview',
'cloud architecture patterns',
]
def daily_index() -> dict:
total_new = 0
for topic in DAILY_TOPICS:
results = search_youtube(topic)
docs = extract_metadata(results, topic)
new = index_videos(docs)
total_new += new
print(f'{topic}: {new} new videos indexed')
total = collection.count_documents({})
print(f'Daily index complete: {total_new} new, {total} total')
return {'new': total_new, 'total': total}
# Run daily via cron: python -c 'from kb import daily_index; daily_index()'
daily_index()Ejemplo en Python
import requests, os
from pymongo import MongoClient
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
client = MongoClient('mongodb://localhost:27017')
db = client['youtube_kb']
def index_topic(topic):
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'youtube', 'query': topic}).json()
for r in data.get('organic_results', []):
db.videos.update_one({'url': r.get('link')}, {'$set': {
'title': r.get('title', ''), 'url': r.get('link', ''),
'text': f"{r.get('title', '')} {r.get('snippet', '')}"
}}, upsert=True)
index_topic('python async tutorial')
print(f'{db.videos.count_documents({})} videos in KB')Ejemplo en JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function searchYouTube(topic) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H, body: JSON.stringify({platform: 'youtube', query: topic})
});
return (await r.json()).organic_results || [];
}
searchYouTube('python async tutorial').then(r => console.log(r.length + ' videos found'));Salida esperada
A MongoDB-backed knowledge base populated with YouTube video metadata from search results, queryable via full-text search and updated daily.