El nivel gratuito del motor de búsqueda personalizado de Google está limitado a 50 dominios y se cerrará por completo en enero de 2027. Si su aplicación depende de Google CSE para la búsqueda gratuita, necesita un plan de migración ahora. Este tutorial crea una capa alternativa que prueba primero su CSE de Google existente y luego lo dirige a Scavio cuando Google arroja errores o cuando excede los límites. El paso final deja caer a Google por completo. Scavio cuesta $0,005 por consulta y el nivel gratuito cubre 250 créditos por mes.
Requisitos previos
- Python 3.9+ o Node.js 18+
- Una integración existente de Google CSE
- Una clave API de Scavio de scavio.dev
- solicita biblioteca (Python) o recuperación (Node.js)
Guia paso a paso
Paso 1: Audite su uso actual de Google CSE
Antes de migrar, mida cuántas consultas envía y qué parámetros utiliza. Esto determina el costo y ayuda a asignar los campos de Google CSE a los campos de Scavio.
import os
# Your existing Google CSE config
GOOGLE_CSE_KEY = os.environ.get('GOOGLE_CSE_KEY', '')
GOOGLE_CSE_CX = os.environ.get('GOOGLE_CSE_CX', '')
# Typical Google CSE call for reference
# GET https://www.googleapis.com/customsearch/v1
# ?key=KEY&cx=CX&q=QUERY&num=10
#
# Returns: items[].title, items[].link, items[].snippet
# Map Google CSE fields to Scavio fields:
field_map = {
'items[].title': 'organic_results[].title',
'items[].link': 'organic_results[].link',
'items[].snippet': 'organic_results[].snippet',
'items[].pagemap': 'not available (use scrape instead)',
'searchInformation.totalResults': 'not available',
}
for google_field, scavio_field in field_map.items():
print(f' {google_field:40s} -> {scavio_field}')Paso 2: Cree la función de búsqueda de doble proveedor
Cree una función de búsqueda que pruebe Google CSE primero y recurra a Scavio ante cualquier error, límite de tasa o resultado vacío.
import requests, os, time
GOOGLE_KEY = os.environ.get('GOOGLE_CSE_KEY', '')
GOOGLE_CX = os.environ.get('GOOGLE_CSE_CX', '')
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
def search_google_cse(query: str, num: int = 10) -> list:
if not GOOGLE_KEY or not GOOGLE_CX:
return []
resp = requests.get('https://www.googleapis.com/customsearch/v1',
params={'key': GOOGLE_KEY, 'cx': GOOGLE_CX, 'q': query, 'num': num},
timeout=10)
if resp.status_code != 200:
print(f'Google CSE error: {resp.status_code}')
return []
items = resp.json().get('items', [])
return [{'title': r['title'], 'link': r['link'],
'snippet': r.get('snippet', '')} for r in items]
def search_scavio(query: str, num: int = 10) -> list:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
json={'query': query, 'country_code': 'us', 'num_results': num})
resp.raise_for_status()
return [{'title': r['title'], 'link': r['link'],
'snippet': r.get('snippet', '')} for r in resp.json().get('organic_results', [])]
def search(query: str, num: int = 10) -> dict:
start = time.time()
results = search_google_cse(query, num)
if results:
return {'results': results, 'provider': 'google_cse',
'latency_ms': int((time.time() - start) * 1000), 'cost': 0}
results = search_scavio(query, num)
return {'results': results, 'provider': 'scavio',
'latency_ms': int((time.time() - start) * 1000), 'cost': 0.005}Paso 3: Pruebe ambos proveedores uno al lado del otro
Ejecute las mismas consultas a través de ambos proveedores para verificar que Scavio devuelva resultados equivalentes antes de realizar la transición.
test_queries = [
'best CRM software 2026',
'python web scraping tutorial',
'react server components explained',
]
for query in test_queries:
google_results = search_google_cse(query, 5)
scavio_results = search_scavio(query, 5)
print(f'Query: {query}')
print(f' Google CSE: {len(google_results)} results')
print(f' Scavio: {len(scavio_results)} results')
if scavio_results:
print(f' Top Scavio: {scavio_results[0]["title"][:60]}')
print()Paso 4: Reemplazo directo: elimine Google CSE por completo
Una vez validado, reemplace su función de búsqueda solo con Scavio. Este es su estado posterior a la migración: no depende de Google.
import requests, os
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
def search(query: str, num: int = 10) -> list:
"""Drop-in replacement for Google CSE. Same return format."""
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
json={'query': query, 'country_code': 'us', 'num_results': num})
resp.raise_for_status()
return [{'title': r['title'], 'link': r['link'],
'snippet': r.get('snippet', '')} for r in resp.json().get('organic_results', [])]
# Usage is identical to before:
results = search('best CRM software 2026')
for r in results:
print(f'{r["title"]}: {r["link"]}')
print(f'Cost: $0.005 per query, 250 free/month')Ejemplo en Python
import requests, os
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
def search(query, num=10):
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
json={'query': query, 'country_code': 'us', 'num_results': num})
resp.raise_for_status()
return [{'title': r['title'], 'link': r['link'], 'snippet': r.get('snippet', '')}
for r in resp.json().get('organic_results', [])]
results = search('best CRM software 2026')
for r in results:
print(f'{r["title"]}: {r["link"]}')Ejemplo en JavaScript
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
async function search(query, num = 10) {
const resp = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query, country_code: 'us', num_results: num })
});
const data = await resp.json();
return (data.organic_results || []).map(r => ({
title: r.title, link: r.link, snippet: r.snippet || ''
}));
}
search('best CRM software 2026').then(results =>
results.forEach(r => console.log(`${r.title}: ${r.link}`)));Salida esperada
Query: best CRM software 2026
Google CSE: 0 results
Scavio: 10 results
Top Scavio: Best CRM Software of 2026 - Forbes Advisor
Cost: $0.005 per query, 250 free/month