El análisis de brechas de contenido identifica temas que su audiencia busca pero que su sitio no cubre. Los cuadros La gente también pregunta (PAA) de Google revelan las preguntas de seguimiento que tienen los usuarios después de buscar un tema. Al comparar las preguntas PAA de sus palabras clave objetivo con su contenido existente, puede identificar lagunas y generar resúmenes de contenido para los temas faltantes. Este tutorial crea un analizador automatizado de brechas de contenido que obtiene datos PAA para un conjunto de palabras clave, agrupa preguntas por tema y genera una lista priorizada de oportunidades de contenido.
Requisitos previos
- Python 3.10 o superior
- solicita biblioteca instalada
- Una clave API de Scavio
- Una lista de palabras clave objetivo para analizar
Guia paso a paso
Paso 1: Obtener datos PAA para palabras clave objetivo
Consulta cada palabra clave a través de la API de Scavio y recopila las preguntas de la gente que también hace.
def get_paa_questions(keyword: str) -> list[str]:
r = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"query": keyword, "country_code": "us"}
)
r.raise_for_status()
paa = r.json().get("people_also_ask", [])
return [item["question"] for item in paa]Paso 2: Recopile preguntas sobre todas las palabras clave
Cree una lista maestra de todas las preguntas de PAA, rastreando qué palabra clave activó cada pregunta.
import time
def collect_all_paa(keywords: list[str]) -> list[dict]:
all_questions = []
for kw in keywords:
questions = get_paa_questions(kw)
for q in questions:
all_questions.append({"question": q, "seed_keyword": kw})
time.sleep(0.5)
return all_questionsPaso 3: Deduplicar y agrupar preguntas
Elimine preguntas duplicadas y agrupe las similares buscando palabras comunes.
from collections import defaultdict
def cluster_questions(questions: list[dict]) -> dict[str, list[str]]:
seen = set()
unique = []
for q in questions:
normalized = q["question"].lower().strip("?")
if normalized not in seen:
seen.add(normalized)
unique.append(q)
clusters = defaultdict(list)
for q in unique:
words = q["question"].lower().split()
topic = words[0] + " " + words[1] if len(words) > 1 else words[0]
clusters[topic].append(q["question"])
return dict(clusters)Paso 4: Generar resúmenes de contenido
Para cada brecha de contenido, genere un resumen que incluya la pregunta objetivo, las preguntas relacionadas y la palabra clave inicial de la que proviene.
def generate_briefs(questions: list[dict]) -> list[dict]:
briefs = []
for q in questions[:20]:
brief = {
"target_question": q["question"],
"seed_keyword": q["seed_keyword"],
"suggested_title": q["question"].rstrip("?") + " - Complete Guide",
"content_type": "guide" if "how" in q["question"].lower() else "explainer",
}
briefs.append(brief)
return briefsEjemplo en Python
import os
import json
import time
import requests
from collections import defaultdict
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
KEYWORDS = ["vector database", "rag pipeline", "embedding model", "ai agent framework"]
def get_paa(kw: str) -> list[str]:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"query": kw, "country_code": "us"})
r.raise_for_status()
return [item["question"] for item in r.json().get("people_also_ask", [])]
def analyze():
all_questions = []
seen = set()
for kw in KEYWORDS:
for q in get_paa(kw):
if q.lower() not in seen:
seen.add(q.lower())
all_questions.append({"question": q, "seed": kw})
time.sleep(0.5)
print(f"Found {len(all_questions)} unique content gaps:")
for q in all_questions:
print(f" [{q['seed']}] {q['question']}")
return all_questions
if __name__ == "__main__":
gaps = analyze()
with open("content_gaps.json", "w") as f:
json.dump(gaps, f, indent=2)Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
async function getPAA(kw) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query: kw, country_code: "us" })
});
const data = await res.json();
return (data.people_also_ask || []).map(item => item.question);
}
async function main() {
const keywords = ["vector database", "rag pipeline", "embedding model"];
const seen = new Set();
const gaps = [];
for (const kw of keywords) {
const questions = await getPAA(kw);
for (const q of questions) {
if (!seen.has(q.toLowerCase())) {
seen.add(q.toLowerCase());
gaps.push({ question: q, seed: kw });
}
}
}
console.log(`${gaps.length} content gaps found:`);
gaps.forEach(g => console.log(` [${g.seed}] ${g.question}`));
}
main().catch(console.error);Salida esperada
Found 16 unique content gaps:
[vector database] What is the best vector database in 2026?
[vector database] How does a vector database differ from a relational database?
[rag pipeline] What are the components of a RAG pipeline?
[rag pipeline] How do you evaluate RAG performance?
[embedding model] What is the difference between embeddings and fine-tuning?
[ai agent framework] What is the best AI agent framework for production?