Les scrapers web qui analysent le HTML de Google, Reddit ou Amazon sont la partie la plus fragile de toute pipeline de données. Lorsque le site cible modifie sa mise en page, votre scraper casse. Lorsqu'il détecte votre trafic, vous êtes bloqué. Lorsque vous montez en échelle, les coûts de proxy grimpent. Une API de recherche structurée renvoie les mêmes données en JSON propre, sans analyse, sans proxy, et sans maintenance. Ce tutoriel montre comment remplacer un scraper typique par l'API Scavio, étape par étape.
Prérequis
- Python 3.8+ installé
- Un scraper existant que vous souhaitez migrer (BeautifulSoup, Playwright ou Selenium)
- Une clé API Scavio depuis scavio.dev
Parcours
Étape 1: Auditez les données de sortie de votre scraper
Identifiez les champs que votre scraper extrait actuellement. La plupart des scrapers Google extraient : titre, URL, extrait, position.
# Typical scraper output:
# [
# {'title': '...', 'url': '...', 'snippet': '...', 'position': 1},
# {'title': '...', 'url': '...', 'snippet': '...', 'position': 2},
# ]
#
# Scavio's 'organic' array returns the same fields:
# [
# {'title': '...', 'link': '...', 'snippet': '...', 'position': 1},
# ]
# Only difference: 'url' -> 'link'Étape 2: Remplacez la fonction de scraping
Remplacez votre code de scraping par un seul appel API.
import requests, os
# BEFORE: 150 lines of scraping code
# from bs4 import BeautifulSoup
# import random
# PROXIES = [...]
# def scrape_google(query):
# proxy = random.choice(PROXIES)
# resp = requests.get(f'https://www.google.com/search?q={query}',
# proxies={'https': proxy}, headers={'User-Agent': ...})
# soup = BeautifulSoup(resp.text, 'html.parser')
# results = []
# for div in soup.select('div.g'):
# ... # 100 lines of parsing
# AFTER: 10 lines
def search_google(query: str) -> list:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': os.environ['SCAVIO_API_KEY']},
json={'platform': 'google', 'query': query}, timeout=10)
return [{'title': r['title'], 'url': r['link'], 'snippet': r['snippet'], 'position': r.get('position', i+1)}
for i, r in enumerate(resp.json().get('organic', []))]Étape 3: Mettez à jour les références de champs en aval
Si votre code fait référence à des noms de champs spécifiques au scraper, mettez-les à jour.
# Find all references to the old scraper output format:
# grep -r 'scrape_google\|from scraper\|import scraper' .
# Common field mapping:
# Old scraper -> Scavio API
# result.url -> result.link
# result.desc -> result.snippet
# result.rank -> result.positionÉtape 4: Supprimez les dépendances proxy et analyseur
Nettoyez votre fichier requirements et supprimez l'infrastructure de scraping.
# Remove from requirements.txt:
# beautifulsoup4
# lxml
# playwright
# selenium
# webdriver-manager
# fake-useragent
# rotating-proxies
# Remove proxy configuration files
# Cancel proxy subscription (saves $50-200/month)
# Your requirements.txt now just needs:
# requestsExemple Python
# Migration summary:
# Before: 150 lines + proxy subscription + maintenance
# After: 10 lines + $0.003/query + zero maintenance
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def search(query, platform='google'):
return requests.post('https://api.scavio.dev/api/v1/search',
headers=H, json={'platform': platform, 'query': query},
timeout=10).json().get('organic', [])Exemple JavaScript
// Before: Playwright + proxy rotation + HTML parsing
// After:
async function search(query, platform = 'google') {
const resp = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'},
body: JSON.stringify({platform, query})
});
return (await resp.json()).organic || [];
}Sortie attendue
A clean search function replacing hundreds of lines of scraping code. No proxies, no parsing, no maintenance.