Resumen
Most clasificar trackers charge per palabra clave per mes. At 4,000 palabras clave, bills exceed $200/mes for datos ese teams solo resena semanal. Este flujo de trabajo ejecuta un batch clasificar verificar cada Sunday noche, almacena resultados in un base de datos, y genera un diff informe comparing este semana to last semana. Total semanal cost: $20.
Desencadenador
Cron programar: cada Sunday at 11 PM UTC.
Programación
Semanal (Sunday 11 PM UTC)
Pasos del flujo de trabajo
Cargar Palabra clave List de Database
Leer todos keyword-location pairs de el palabras clave tabla. Cada fila tiene palabra clave text, objetivo pais, y el tracked dominio.
Batch Consulta All Palabras clave
Loop a traves de todos 4,000 palabras clave con un 200ms delay entre solicitudes. For cada palabra clave, obtener el top 10 resultados organicos y extraer el dominio objetivo position.
Almacenar Resultados con Timestamp
Escribir cada resultado to el posicionamientos tabla con el actual date. Include position, URL, y titulo for el dominio objetivo y top 3 competidores.
Generar Semanal Diff Informe
Comparar este week's positions contra last semana. Marcar palabras clave ese gained o lost 3+ positions. Resumir movers in un informe.
Enviar Informe to Slack o Email
Push el semanal diff informe to Slack o correo electronico. Include top gainers, top losers, y newly entered/dropped palabras clave.
Implementacion en Python
import requests, os, json, time
from datetime import date
API_KEY = os.environ["SCAVIO_API_KEY"]
KEYWORDS = json.load(open("keywords.json")) # [{"kw":"...","cc":"us","domain":"example.com"}, ...]
def check_rank(kw, cc, target_domain):
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY, "Content-Type": "application/json"},
json={"query": kw, "country_code": cc},
timeout=15,
)
data = resp.json()
position = None
for r in data.get("organic_results", []):
if target_domain in r.get("link", ""):
position = r.get("position")
break
return {"keyword": kw, "country": cc, "date": str(date.today()), "position": position}
results = []
for item in KEYWORDS:
results.append(check_rank(item["kw"], item["cc"], item["domain"]))
time.sleep(0.2)
with open(f"ranks_{date.today()}.json", "w") as f:
json.dump(results, f, indent=2)
print(f"Checked {len(results)} keywords, {sum(1 for r in results if r['position'])} found")Implementacion en JavaScript
const fs = require('fs');
const KEYWORDS = JSON.parse(fs.readFileSync('keywords.json','utf8'));
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function checkRank(kw, cc, domain) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query:kw, country_code:cc})});
const d = await r.json();
const match = (d.organic_results||[]).find(r=>(r.link||'').includes(domain));
return {keyword:kw, country:cc, date:new Date().toISOString().slice(0,10), position:match?.position||null};
}
const results = [];
for (const k of KEYWORDS) { results.push(await checkRank(k.kw, k.cc, k.domain)); await new Promise(r=>setTimeout(r,200)); }
fs.writeFileSync('ranks_'+new Date().toISOString().slice(0,10)+'.json', JSON.stringify(results,null,2));
console.log(results.length+' keywords checked');Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA