Una herramienta de auditoría SEO examina el desempeño de un sitio y sus competidores en los resultados de búsqueda para un conjunto de palabras clave objetivo. Comprueba qué funciones SERP están presentes (fragmentos destacados, resúmenes de IA, cuadros PAA), dónde se clasifican los competidores y qué lagunas de contenido existen. Las herramientas de SEO empresarial cuestan miles de dólares al mes. Este tutorial crea una herramienta de auditoría liviana utilizando la API de Scavio que produce un informe procesable palabra clave por palabra clave de forma gratuita, más allá de los costos de uso de la API.
Requisitos previos
- Python 3.10 o superior
- solicita biblioteca instalada
- Una clave API de Scavio
- Un dominio de destino y una lista de palabras clave para auditar
Guia paso a paso
Paso 1: Definir objetivos de auditoría
Configure su dominio objetivo, los dominios de la competencia y la lista de palabras clave para auditar.
TARGET = "mysite.com"
COMPETITORS = ["competitor-a.com", "competitor-b.com"]
KEYWORDS = ["python api tutorial", "rest api guide", "api authentication best practices"]Paso 2: Obtenga datos SERP completos para cada palabra clave
Recupere la respuesta SERP completa, incluidos los resultados orgánicos, el fragmento destacado, la descripción general de la IA y el PAA.
def audit_keyword(keyword: str) -> dict:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"query": keyword, "country_code": "us"})
r.raise_for_status()
return r.json()Paso 3: Analizar las características y posiciones de SERP
Para cada palabra clave, verifique qué funciones SERP están presentes y dónde se clasifican el dominio objetivo y los competidores.
def analyze(keyword: str, data: dict) -> dict:
organic = data.get("organic_results", [])
target_pos = next((r["position"] for r in organic if TARGET in r.get("link", "")), None)
competitor_pos = {}
for c in COMPETITORS:
pos = next((r["position"] for r in organic if c in r.get("link", "")), None)
competitor_pos[c] = pos
return {
"keyword": keyword,
"target_position": target_pos,
"competitors": competitor_pos,
"has_featured_snippet": bool(data.get("featured_snippet")),
"has_ai_overview": bool(data.get("ai_overview")),
"paa_count": len(data.get("people_also_ask", [])),
}Paso 4: Generar el informe de auditoría
Ejecute la auditoría para todas las palabras clave e imprima un informe resumido formateado.
def run_audit() -> None:
print(f"SEO Audit for {TARGET}\n" + "=" * 40)
for kw in KEYWORDS:
data = audit_keyword(kw)
result = analyze(kw, data)
pos = result["target_position"]
print(f"\n{kw}")
print(f" Your rank: {'#' + str(pos) if pos else 'not ranked'}")
print(f" AI Overview: {result['has_ai_overview']}, PAA: {result['paa_count']}")Ejemplo en Python
import os
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
TARGET = "mysite.com"
KEYWORDS = ["python api tutorial", "rest api guide"]
def fetch(q):
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"query": q, "country_code": "us"})
r.raise_for_status()
return r.json()
def analyze(kw, data):
organic = data.get("organic_results", [])
pos = next((r["position"] for r in organic if TARGET in r.get("link", "")), None)
return {"keyword": kw, "position": pos, "ai_overview": bool(data.get("ai_overview")), "paa": len(data.get("people_also_ask", []))}
if __name__ == "__main__":
for kw in KEYWORDS:
result = analyze(kw, fetch(kw))
print(f"{kw}: {'#' + str(result['position']) if result['position'] else 'not ranked'} | AI: {result['ai_overview']} | PAA: {result['paa']}")Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
const TARGET = "mysite.com";
const KEYWORDS = ["python api tutorial", "rest api guide"];
async function fetch_(q) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query: q, country_code: "us" })
});
return res.json();
}
function analyze(kw, data) {
const organic = data.organic_results || [];
const match = organic.find(r => r.link.includes(TARGET));
return { keyword: kw, position: match?.position || null, aiOverview: !!data.ai_overview, paa: (data.people_also_ask || []).length };
}
async function main() {
for (const kw of KEYWORDS) {
const data = await fetch_(kw);
const r = analyze(kw, data);
console.log(`${r.keyword}: ${r.position ? "#" + r.position : "not ranked"} | AI: ${r.aiOverview} | PAA: ${r.paa}`);
}
}
main().catch(console.error);Salida esperada
SEO Audit for mysite.com
========================================
python api tutorial
Your rank: #6
AI Overview: true, PAA: 4
rest api guide
Your rank: not ranked
AI Overview: false, PAA: 3