Los rastreadores de clasificación comercial cobran entre 30 y 300 dólares al mes y comprueban las palabras clave una vez al día. Crear su propio rastreador con una API SERP le brinda control total sobre la frecuencia de verificación, los datos almacenados y la lógica de alertas. Cada verificación de palabras clave cuesta $0,005 a través de Scavio, por lo que el seguimiento diario de 100 palabras clave cuesta $0,50/día o $15/mes, menos que la mayoría de los planes iniciales.
Requisitos previos
- Python 3.8+
- solicita biblioteca
- Una clave API de Scavio de scavio.dev
- SQLite3 (incluido con Python)
Guia paso a paso
Paso 1: Configurar la base de datos de seguimiento de clasificación
Cree una base de datos SQLite para almacenar posiciones de clasificación diarias.
import os, requests, json, sqlite3
from datetime import datetime
API_KEY = os.environ['SCAVIO_API_KEY']
SH = {'x-api-key': API_KEY, 'Content-Type': 'application/json'}
db = sqlite3.connect('rank_tracker.db')
db.execute('''CREATE TABLE IF NOT EXISTS ranks (
keyword TEXT, domain TEXT, position INTEGER,
title TEXT, checked_at TEXT
)''')
db.execute('CREATE INDEX IF NOT EXISTS idx_kw ON ranks(keyword, checked_at)')
db.commit()
MY_DOMAIN = 'scavio.dev'
KEYWORDS = ['serp api', 'search api python', 'google search api',
'web scraping api', 'ai agent search tool']
print(f'Tracking {len(KEYWORDS)} keywords for {MY_DOMAIN}')Paso 2: Verifique las clasificaciones de palabras clave
Obtenga resultados SERP y encuentre la posición de su dominio para cada palabra clave.
def check_rank(keyword, domain):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': keyword, 'country_code': 'us'}).json()
organic = data.get('organic_results', [])
now = datetime.now().isoformat()
for r in organic[:50]:
link = r.get('link', '')
if domain in link:
pos = r.get('position', 0)
title = r.get('title', '')[:100]
db.execute('INSERT INTO ranks VALUES (?,?,?,?,?)',
(keyword, domain, pos, title, now))
db.commit()
return pos
db.execute('INSERT INTO ranks VALUES (?,?,?,?,?)',
(keyword, domain, 0, 'Not found', now))
db.commit()
return 0
for kw in KEYWORDS:
pos = check_rank(kw, MY_DOMAIN)
status = f'#{pos}' if pos else 'Not in top 50'
print(f' {kw:30} | {status}')
print(f'Cost: ${len(KEYWORDS) * 0.005:.3f}')Paso 3: Detectar cambios de rango entre controles
Compare las posiciones actuales con comprobaciones anteriores para encontrar movimientos.
def detect_changes(keyword, domain):
rows = db.execute(
'SELECT position, checked_at FROM ranks WHERE keyword=? AND domain=? ORDER BY checked_at DESC LIMIT 2',
(keyword, domain)).fetchall()
if len(rows) < 2:
return None
current, prev = rows[0][0], rows[1][0]
if current == prev:
return None
change = prev - current # positive = improved
return {'keyword': keyword, 'prev': prev, 'current': current, 'change': change}
def report_changes():
changes = []
for kw in KEYWORDS:
c = detect_changes(kw, MY_DOMAIN)
if c:
changes.append(c)
if changes:
print(f'\n{len(changes)} rank changes:')
for c in changes:
arrow = 'UP' if c['change'] > 0 else 'DOWN'
print(f' {c["keyword"]:30} | #{c["prev"]} -> #{c["current"]} ({arrow} {abs(c["change"])})')
else:
print('No rank changes detected.')
return changes
report_changes()Paso 4: Programe comprobaciones diarias mediante cron
Automatice el rastreador para que se ejecute diariamente y acumule historial.
def daily_check():
print(f'Daily rank check: {datetime.now().isoformat()}')
results = []
for kw in KEYWORDS:
pos = check_rank(kw, MY_DOMAIN)
results.append({'keyword': kw, 'position': pos})
cost = len(KEYWORDS) * 0.005
print(f'Checked {len(KEYWORDS)} keywords. Cost: ${cost:.3f}')
changes = report_changes()
# Summary
ranked = [r for r in results if r['position'] > 0]
avg = sum(r['position'] for r in ranked) / len(ranked) if ranked else 0
print(f'\nSummary: {len(ranked)}/{len(results)} keywords ranking, avg position: {avg:.1f}')
print(f'Monthly cost estimate: ${cost * 30:.2f}')
# Cron: 0 6 * * * cd /path/to/project && python rank_tracker.py
daily_check()Ejemplo en Python
import os, requests
SH = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
def track(keyword, domain):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': keyword, 'country_code': 'us'}).json()
for r in data.get('organic_results', [])[:50]:
if domain in r.get('link', ''):
print(f'{keyword}: {domain} at #{r["position"]}. Cost: $0.005')
return r['position']
print(f'{keyword}: {domain} not in top 50')
return 0
track('serp api', 'scavio.dev')Ejemplo en JavaScript
const SH = { 'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json' };
async function track(keyword, domain) {
const data = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: SH,
body: JSON.stringify({ query: keyword, country_code: 'us' })
}).then(r => r.json());
const match = (data.organic_results || []).find(r => (r.link || '').includes(domain));
console.log(match ? `${keyword}: ${domain} at #${match.position}` : `${keyword}: not found`);
}
track('serp api', 'scavio.dev').catch(console.error);Salida esperada
Tracking 5 keywords for scavio.dev
serp api | #4
search api python | #7
google search api | #11
web scraping api | #6
ai agent search tool | #3
Cost: $0.025
Summary: 5/5 keywords ranking, avg position: 6.2
Monthly cost estimate: $0.75