Le niveau gratuit de Google Custom Search Engine est limité à 50 domaines et sera complètement arrêté en janvier 2027. Si votre application dépend de Google CSE pour la recherche gratuite, vous avez besoin d'un plan de migration dès maintenant. Ce tutoriel construit une couche de secours qui essaie d'abord votre Google CSE existant, puis redirige vers Scavio lorsque Google renvoie des erreurs ou lorsque vous dépassez les limites. La dernière étape supprime complètement Google. Scavio coûte 0,005 $ par requête, avec le niveau gratuit couvrant 250 crédits par mois.
Prérequis
- Python 3.9+ ou Node.js 18+
- Une intégration Google CSE existante
- Une clé API Scavio depuis scavio.dev
- bibliothèque requests (Python) ou fetch (Node.js)
Parcours
Étape 1: Auditez votre utilisation actuelle de Google CSE
Avant la migration, mesurez le nombre de requêtes que vous envoyez et les paramètres que vous utilisez. Cela détermine le coût et aide à faire correspondre les champs Google CSE avec les champs 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}')Étape 2: Construisez la fonction de recherche avec deux fournisseurs
Créez une fonction de recherche qui essaie d'abord Google CSE et bascule vers Scavio en cas d'erreur, de limite de débit ou de résultat vide.
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}Étape 3: Testez les deux fournisseurs côte à côte
Exécutez les mêmes requêtes via les deux fournisseurs pour vérifier que Scavio renvoie des résultats équivalents avant de basculer.
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()Étape 4: Remplacement direct : supprimez complètement Google CSE
Une fois validé, remplacez votre fonction de recherche par Scavio uniquement. C'est votre état post-migration -- aucune dépendance à 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')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})
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"]}')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('best CRM software 2026').then(results =>
results.forEach(r => console.log(`${r.title}: ${r.link}`)));Sortie attendue
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