Firecrawl convient pour des explorations de 10 pages, mais les équipes qui effectuent des rafraîchissements hebdomadaires de 10K+ pages rencontrent des limites de taux et des barrières de prix. Ce tutoriel migre une charge de travail d'exploration de grande envergure vers le point de terminaison /crawl de Scavio, avec une simultanéité plus élevée et une tarification par page.
Prérequis
- Une charge de travail Firecrawl existante à migrer
- Une clé API Scavio (niveau payant recommandé pour la simultanéité)
- Python 3.10+
Parcours
Étape 1: Inventoriez votre exploration actuelle
Exportez vos URL de départ Firecrawl et leur fréquence.
# From Firecrawl dashboard, export crawl job config:
SEEDS = ['https://docs.site.com']
DEPTH = 3Étape 2: Mettez en file d'attente l'exploration dans Scavio
Scavio renvoie un job_id pour une interrogation asynchrone.
import requests, os
API_KEY = os.environ['SCAVIO_API_KEY']
def start_crawl(seed, depth):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': seed, 'platform': 'crawl', 'depth': depth, 'format': 'markdown'})
return r.json()['job_id']Étape 3: Interrogez jusqu'à la fin
Scavio diffuse les pages au fur et à mesure de leur achèvement.
def poll(job_id):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': job_id, 'platform': 'crawl_status'})
return r.json()Étape 4: Sauvegardez les pages en markdown
Même format de sortie que Firecrawl, donc l'ingestion en aval reste identique.
import os
def save(pages, outdir):
os.makedirs(outdir, exist_ok=True)
for i, p in enumerate(pages):
with open(f'{outdir}/page_{i}.md', 'w') as f:
f.write(p['markdown'])Étape 5: Planifiez un rafraîchissement hebdomadaire
Cron ou GitHub Actions lance l'exploration hebdomadaire.
# .github/workflows/crawl.yml
on:
schedule: [{cron: '0 4 * * 1'}]
jobs:
crawl:
runs-on: ubuntu-latest
steps: [{run: python crawl.py}]Exemple Python
import os, requests, time
API_KEY = os.environ['SCAVIO_API_KEY']
def crawl(seed, depth=2):
start = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': seed, 'platform': 'crawl', 'depth': depth, 'format': 'markdown'})
job = start.json()['job_id']
while True:
s = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': job, 'platform': 'crawl_status'}).json()
if s['status'] == 'done': return s['pages']
time.sleep(5)
print(len(crawl('https://docs.example.com', depth=2)))Exemple JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
async function crawl(seed, depth = 2) {
const start = await (await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: seed, platform: 'crawl', depth, format: 'markdown' })
})).json();
const job = start.job_id;
while (true) {
const s = await (await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: job, platform: 'crawl_status' })
})).json();
if (s.status === 'done') return s.pages;
await new Promise(r => setTimeout(r, 5000));
}
}Sortie attendue
Weekly 10K-page crawl completes in 20-40 minutes. Markdown output identical to Firecrawl. Per-page cost: 1 credit.