El nivel gratuito del motor de búsqueda personalizado de Google le limita a 50 dominios específicos. Si su aplicación necesita realizar búsquedas en toda la web, debe pagarle a Google $5 por cada 1000 consultas o cambiar de proveedor. Este tutorial migra una configuración de Google CSE de 50 dominios a Scavio, que busca en toda la web sin límite de dominio a $0,005 por consulta. La migración conserva el formato de resultados existente, por lo que el código posterior no necesita cambios.
Requisitos previos
- Python 3.9+ o Node.js 18+
- Su configuración actual de Google CSE (ID de CX, lista de dominios)
- Una clave API de Scavio de scavio.dev
Guia paso a paso
Paso 1: Exporta tu lista de dominios CSE de Google
Extraiga los dominios de su configuración de Google CSE. Estos se convierten en filtros de sitio opcionales en Scavio si desea limitar el alcance.
# Your 50 Google CSE domains (example)
google_cse_domains = [
'docs.python.org', 'stackoverflow.com', 'github.com',
'developer.mozilla.org', 'reactjs.org', 'nextjs.org',
'vuejs.org', 'angular.io', 'nodejs.org', 'npmjs.com',
# ... up to 50 domains
]
print(f'Migrating {len(google_cse_domains)} domains from Google CSE')
print(f'Google CSE: limited to these {len(google_cse_domains)} domains')
print(f'Scavio: searches entire web (no domain cap)')
print(f'Cost comparison:')
print(f' Google CSE paid: $5.00 per 1,000 queries')
print(f' Scavio: $5.00 per 1,000 queries ($0.005 each)')
print(f' Scavio free: 250 queries/month included')Paso 2: Construya el adaptador de migración
Cree una función con la misma interfaz que sus llamadas de Google CSE pero usando Scavio. Opcionalmente, restrinja a su lista de dominios usando sitio: consultas.
import requests, os
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
def search(query: str, num: int = 10, restrict_domains: list = None) -> list:
"""Drop-in replacement for Google CSE. Same return shape."""
search_query = query
if restrict_domains:
# Use site: operator to limit to specific domains
sites = ' OR '.join(f'site:{d}' for d in restrict_domains[:5])
search_query = f'{query} ({sites})'
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
json={'query': search_query, 'country_code': 'us', 'num_results': num})
resp.raise_for_status()
# Return in Google CSE items[] format
return [{'title': r['title'], 'link': r['link'],
'snippet': r.get('snippet', ''),
'displayLink': r['link'].split('/')[2] if '/' in r['link'] else ''}
for r in resp.json().get('organic_results', [])]
# Full web search (no domain limit)
results = search('python asyncio tutorial', num=5)
print(f'Full web: {len(results)} results')
for r in results:
print(f' {r["displayLink"]}: {r["title"][:50]}')Paso 3: Validar la migración con pruebas de comparación
Ejecute las mismas consultas a través de ambos proveedores para garantizar que la calidad de los resultados sea equivalente antes de realizar la interrupción total.
queries = ['python asyncio', 'react hooks tutorial', 'docker compose networking']
for q in queries:
# With domain restriction (mimics old Google CSE behavior)
restricted = search(q, num=3, restrict_domains=['docs.python.org', 'stackoverflow.com', 'github.com'])
# Full web (new capability)
full = search(q, num=3)
print(f'Query: {q}')
print(f' Restricted ({len(restricted)} results): {restricted[0]["displayLink"] if restricted else "none"}')
print(f' Full web ({len(full)} results): {full[0]["displayLink"] if full else "none"}')
print()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})
return [{'title': r['title'], 'link': r['link'], 'snippet': r.get('snippet', '')}
for r in resp.json().get('organic_results', [])]
results = search('python asyncio tutorial')
for r in results[:5]:
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('python asyncio tutorial').then(r => r.slice(0, 5).forEach(x => console.log(x.title)));Salida esperada
Full web: 10 results
docs.python.org: Python asyncio -- Asynchronous I/O
realpython.com: Async IO in Python: A Complete Walkt
stackoverflow.com: How to use asyncio in Python 3
Query: python asyncio
Restricted (3 results): docs.python.org
Full web (3 results): docs.python.org
Cost: $0.005/query, no domain cap