Le niveau gratuit de Google Custom Search Engine vous limite à 50 domaines spécifiques. Si votre application doit rechercher l'ensemble du web, vous devez soit payer Google $5 pour 1,000 requêtes, soit changer de fournisseur. Ce tutoriel migre une configuration Google CSE de 50 domaines vers Scavio, qui recherche tout le web sans plafond de domaines à $0.005 par requête. La migration préserve votre format de résultat existant, de sorte que le code en aval ne nécessite aucune modification.
Prérequis
- Python 3.9+ ou Node.js 18+
- Votre configuration Google CSE actuelle (CX ID, liste de domaines)
- Une clé API Scavio provenant de scavio.dev
Parcours
Étape 1: Exportez votre liste de domaines Google CSE
Extrayez les domaines de votre configuration Google CSE. Ceux-ci deviennent des filtres de site facultatifs dans Scavio si vous souhaitez limiter la portée.
# 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')Étape 2: Construisez l'adaptateur de migration
Créez une fonction avec la même interface que vos appels Google CSE mais en utilisant Scavio. Restreignez éventuellement à votre liste de domaines à l'aide de requêtes site:.
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]}')Étape 3: Validez la migration avec des tests de comparaison
Exécutez les mêmes requêtes via les deux fournisseurs pour vous assurer que la qualité des résultats est équivalente avant de basculer complètement.
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()Exemple 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"]}')Exemple 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)));Sortie attendue
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