Una publicación de r/SideProject lamentó pagar $29 al mes por Ahrefs Starter solo para verificar un puñado de palabras clave. Semrush comienza en $139,95/mes. Si solo marca entre 100 y 200 palabras clave, un enfoque de pago por consulta con Scavio cuesta menos de $1 al mes. Este tutorial crea un verificador de clasificación autohospedado.
Requisitos previos
- Clave API de Scavio
- Python 3.8+
- SQLite para seguimiento del historial
Guia paso a paso
Paso 1: Definir palabras clave y dominios para rastrear
Enumere las palabras clave que desea rastrear y su dominio.
config = {
'domain': 'mysite.com',
'keywords': [
'best crm for startups',
'crm software comparison 2026',
'affordable crm tools',
'crm vs spreadsheet',
],
'country': 'us'
}Paso 2: Verifique la posición SERP para cada palabra clave
Busque cada palabra clave a través de Scavio y encuentre su dominio en los resultados.
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def check_rank(keyword, domain, country='us'):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=H,
json={'platform': 'google', 'query': keyword, 'country_code': country}).json()
for r in data.get('organic_results', []):
if domain in r.get('link', ''):
return r.get('position')
return None # Not in top resultsPaso 3: Almacenar el historial de clasificación en SQLite
Realice un seguimiento de las posiciones a lo largo del tiempo para ver tendencias.
import sqlite3, datetime
conn = sqlite3.connect('ranks.db')
conn.execute('CREATE TABLE IF NOT EXISTS ranks (date TEXT, keyword TEXT, position INT, url TEXT)')
def save_rank(keyword, position, url=None):
conn.execute('INSERT INTO ranks VALUES (?, ?, ?, ?)',
(datetime.date.today().isoformat(), keyword, position, url))
conn.commit()Paso 4: Generar un informe de clasificación
Resumen semanal que muestra los cambios de posición.
def rank_report():
rows = conn.execute('''SELECT keyword,
(SELECT position FROM ranks r2 WHERE r2.keyword=r1.keyword ORDER BY date DESC LIMIT 1) as current,
(SELECT position FROM ranks r3 WHERE r3.keyword=r1.keyword ORDER BY date DESC LIMIT 1 OFFSET 7) as prev
FROM ranks r1 GROUP BY keyword''').fetchall()
for kw, current, prev in rows:
delta = (prev - current) if prev and current else 0
arrow = '+' if delta > 0 else '-' if delta < 0 else '='
print(f'{arrow} {kw}: #{current} (was #{prev})')Ejemplo en Python
import os, requests, sqlite3, datetime
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
conn = sqlite3.connect('ranks.db')
conn.execute('CREATE TABLE IF NOT EXISTS ranks (date TEXT, keyword TEXT, position INT, url TEXT)')
def check_and_save(keyword, domain):
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': keyword}).json()
for r in data.get('organic_results', []):
if domain in r.get('link', ''):
conn.execute('INSERT INTO ranks VALUES (?,?,?,?)',
(datetime.date.today().isoformat(), keyword, r['position'], r['link']))
conn.commit()
return r['position']
return NoneEjemplo en JavaScript
const res = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'},
body: JSON.stringify({platform: 'google', query: keyword})
});
const data = await res.json();
const rank = data.organic_results?.findIndex(r => r.link.includes(domain)) + 1 || null;Salida esperada
Self-hosted SEO rank checker. 4 keywords checked daily = 4 queries = $0.02/day. Monthly cost: $0.60 vs $29+ for Ahrefs Starter or $139.95 for Semrush Pro.