El motor de búsqueda personalizado de Google cerró a nuevos registros y finalizará su función de búsqueda web completa el 1 de enero de 2027. Si su aplicación depende de CSE para la búsqueda web, necesita un plan de migración ahora. Scavio proporciona un reemplazo directo que cubre Google, Amazon, YouTube, Walmart, Reddit y TikTok desde un único punto final POST a $0,005 por solicitud. Este tutorial recorre cada paso: auditar su uso actual de CSE, asignar parámetros de CSE a equivalentes de Scavio, actualizar su código y validar los resultados.
Requisitos previos
- Una integración existente de Google CSE que necesita migrar
- Python 3.9+ o Node.js 18+ instalado
- Una clave API de Scavio de scavio.dev
- Acceso a su clave API CSE actual y a su ID de motor de búsqueda
Guia paso a paso
Paso 1: Audite su uso actual de CSE
Antes de migrar, documente cada llamada de CSE en su código base. Registre los parámetros de consulta que utiliza, los campos de respuesta que analiza y el volumen de solicitudes mensuales.
# Typical Google CSE call you need to replace
import requests
CSE_KEY = 'your-google-api-key'
CSE_ID = 'your-search-engine-id'
def old_cse_search(query: str) -> list:
resp = requests.get('https://www.googleapis.com/customsearch/v1', params={
'key': CSE_KEY, 'cx': CSE_ID, 'q': query, 'num': 10
})
items = resp.json().get('items', [])
return [{'title': i['title'], 'link': i['link'],
'snippet': i.get('snippet', '')} for i in items]
# Document what you actually use from the response
results = old_cse_search('best python frameworks 2026')
for r in results:
print(f"{r['title']} -> {r['link']}")Paso 2: Crear la función de reemplazo de Scavio
Reemplace la solicitud GET de CSE con una solicitud POST de Scavio. La estructura de respuesta se asigna claramente: los elementos se convierten en resultados_orgánicos y cada resultado tiene campos de título, enlace y fragmento.
import os, requests
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
def scavio_search(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()
results = resp.json().get('organic_results', [])
return [{'title': r['title'], 'link': r['link'],
'snippet': r.get('snippet', '')} for r in results]
results = scavio_search('best python frameworks 2026')
for r in results:
print(f"{r['title']} -> {r['link']}")Paso 3: Asignar parámetros específicos de CSE
Si utiliza funciones de CSE como restricción de sitio, rango de fechas o filtrado de idioma, asígnelas a los parámetros de consulta o la sintaxis de consulta de Scavio.
# CSE site restriction -> Scavio query syntax
# Old: params={'siteSearch': 'reddit.com', 'q': query}
# New: prepend site: to query
def search_site(query: str, site: str) -> list:
return scavio_search(f'site:{site} {query}')
# CSE country -> Scavio country_code
def search_country(query: str, country: str = 'us') -> 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': country, 'num_results': 10})
return resp.json().get('organic_results', [])
# CSE date restrict -> Scavio query syntax
def search_recent(query: str) -> list:
return scavio_search(f'{query} after:2026-01-01')
print('Site search:', len(search_site('python tutorial', 'docs.python.org')))
print('Country search:', len(search_country('AI news', 'gb')))
print('Recent search:', len(search_recent('AI frameworks')))Paso 4: Cree un contenedor de compatibilidad para un intercambio sin tiempo de inactividad
Cree un contenedor que coincida con el formato de respuesta CSE exacto para que el código posterior no necesite cambios. Esto le permite cambiar el backend sin tocar a los consumidores.
def cse_compatible_search(query: str, **kwargs) -> dict:
"""Drop-in replacement that returns CSE-format response."""
num = kwargs.get('num', 10)
results = scavio_search(query, num=num)
# Return CSE-compatible response shape
return {
'searchInformation': {
'totalResults': str(len(results)),
'searchTime': 0.3
},
'items': [{
'title': r['title'],
'link': r['link'],
'snippet': r['snippet'],
'displayLink': r['link'].split('/')[2] if '/' in r['link'] else ''
} for r in results]
}
# Your existing code works unchanged
response = cse_compatible_search('best python frameworks 2026')
for item in response['items']:
print(f"{item['title']} ({item['displayLink']})")
print(f"Total: {response['searchInformation']['totalResults']}")Paso 5: Validar resultados y comparar calidad
Ejecute ambas API en paralelo durante una semana para verificar la calidad de los resultados antes de cortar por completo. Registre cualquier discrepancia.
import json
from datetime import datetime
def compare_search(query: str) -> dict:
scavio_results = scavio_search(query, num=5)
scavio_urls = set(r['link'] for r in scavio_results)
comparison = {
'query': query,
'timestamp': datetime.now().isoformat(),
'scavio_count': len(scavio_results),
'scavio_top_3': [r['title'] for r in scavio_results[:3]],
}
return comparison
test_queries = [
'best python web framework 2026',
'how to deploy fastapi production',
'typescript vs python performance'
]
for q in test_queries:
result = compare_search(q)
print(f"Query: {q}")
print(f" Scavio: {result['scavio_count']} results")
print(f" Top 3: {result['scavio_top_3']}")
print()Ejemplo en Python
import os, requests
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 resp.json().get('organic_results', [])
def cse_compat(query, **kw):
results = search(query, num=kw.get('num', 10))
return {'items': [{'title': r['title'], 'link': r['link'],
'snippet': r.get('snippet', '')} for r in results]}
resp = cse_compat('python frameworks 2026')
for item in resp['items']:
print(f"{item['title']} -> {item['link']}")
print(f'Total: {len(resp["items"])} results at $0.005')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 })
});
return (await resp.json()).organic_results || [];
}
async function cseCompat(query) {
const results = await search(query);
return { items: results.map(r => ({ title: r.title, link: r.link, snippet: r.snippet || '' })) };
}
cseCompat('python frameworks 2026').then(resp => {
resp.items.forEach(i => console.log(`${i.title} -> ${i.link}`));
console.log(`Total: ${resp.items.length} results at $0.005`);
});Salida esperada
best python frameworks 2026 -> https://example.com/...
Django vs FastAPI in 2026: Which Should You Choose?
-> https://blog.example.com/django-vs-fastapi-2026
Top 10 Python Web Frameworks for Production
-> https://example.com/top-python-frameworks
Total: 10 results at $0.005