El análisis de la competencia es una tarea recurrente para los gerentes de producto, especialistas en marketing y fundadores. Verificar manualmente dónde se clasifican los competidores en términos clave, qué noticias generan y cómo evolucionan sus listados de productos requiere mucho tiempo. Este tutorial crea un canal automatizado de inteligencia de la competencia utilizando la API de Scavio. Dada una lista de dominios de la competencia, rastrea sus posiciones SERP orgánicas para un conjunto de palabras clave, busca menciones de noticias recientes y escribe un informe resumido semanal.
Requisitos previos
- Python 3.10 o superior
- solicita biblioteca instalada
- Una clave API de Scavio
- Una lista de dominios de la competencia y palabras clave objetivo
Guia paso a paso
Paso 1: Definir competidores y palabras clave
Configure un diccionario que asigne los nombres de los competidores a sus dominios y una lista de palabras clave para realizar un seguimiento.
COMPETITORS = {
"Acme Corp": "acmecorp.com",
"Beta Tools": "betatools.io",
}
KEYWORDS = ["project management software", "task tracking tool", "team collaboration app"]Paso 2: Seguimiento de las posiciones SERP de cada competidor
Para cada palabra clave, obtenga resultados SERP y escanee organic_results para el dominio de cada competidor.
def track_positions(keyword: str) -> dict:
data = search_google(keyword)
positions = {}
for name, domain in COMPETITORS.items():
for r in data.get("organic_results", []):
if domain in r.get("link", ""):
positions[name] = r["position"]
break
return positionsPaso 3: Obtener menciones de noticias
Busque en Google News el nombre de cada competidor para encontrar artículos recientes, anuncios de productos y cobertura de prensa.
def get_news(competitor_name: str) -> list[dict]:
data = search_google(f"{competitor_name} news 2026")
return data.get("news_results", data.get("organic_results", []))[:5]Paso 4: Generar el informe semanal
Combine clasificaciones SERP y menciones de noticias en un informe estructurado y guárdelo como un archivo de rebajas.
from datetime import date
def generate_report() -> str:
lines = [f"# Competitor Intelligence Report — {date.today()}\n"]
for kw in KEYWORDS:
lines.append(f"## {kw}")
positions = track_positions(kw)
for name, pos in positions.items():
lines.append(f" - {name}: #{pos}")
return "\n".join(lines)Ejemplo en Python
import os
import requests
from datetime import date
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
COMPETITORS = {"Acme": "acmecorp.com", "Beta": "betatools.io"}
KEYWORDS = ["project management software", "task tracking tool"]
def search_google(q: str) -> dict:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"query": q, "country_code": "us"})
r.raise_for_status()
return r.json()
def track(kw: str) -> dict:
data = search_google(kw)
out = {}
for name, domain in COMPETITORS.items():
for r in data.get("organic_results", []):
if domain in r.get("link", ""):
out[name] = r["position"]
break
return out
if __name__ == "__main__":
for kw in KEYWORDS:
pos = track(kw)
print(f"\n{kw}:")
for name, p in pos.items():
print(f" {name}: #{p}")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 COMPETITORS = { "Acme": "acmecorp.com", "Beta": "betatools.io" };
const KEYWORDS = ["project management software", "task tracking tool"];
async function searchGoogle(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();
}
async function trackPositions(kw) {
const data = await searchGoogle(kw);
const out = {};
for (const [name, domain] of Object.entries(COMPETITORS)) {
const match = (data.organic_results || []).find(r => r.link.includes(domain));
if (match) out[name] = match.position;
}
return out;
}
async function main() {
for (const kw of KEYWORDS) {
const pos = await trackPositions(kw);
console.log(`\n${kw}:`);
Object.entries(pos).forEach(([n, p]) => console.log(` ${n}: #${p}`));
}
}
main().catch(console.error);Salida esperada
project management software:
Acme: #3
Beta: #7
task tracking tool:
Acme: #5
Beta: not ranked