Firecrawl está bien para rastreos de 10 páginas, pero los equipos que ejecutan actualizaciones semanales de más de 10.000 páginas alcanzan límites de frecuencia y muros de precios. Este tutorial migra una carga de trabajo de rastreo grande al punto final /crawl de Scavio con mayor simultaneidad y precio por página.
Requisitos previos
- Una carga de trabajo de Firecrawl existente para migrar
- Una clave API de Scavio (nivel pago recomendado para concurrencia)
- Python 3.10+
Guia paso a paso
Paso 1: Haga un inventario de su rastreo actual
Exporte las URL iniciales y la frecuencia de Firecrawl.
# From Firecrawl dashboard, export crawl job config:
SEEDS = ['https://docs.site.com']
DEPTH = 3Paso 2: Poner en cola el rastreo en Scavio
Scavio devuelve un job_id para el sondeo asíncrono.
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']Paso 3: Encuesta para completar
Scavio transmite las páginas a medida que se completan.
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()Paso 4: Guardar páginas como rebajas
El mismo formato de salida que Firecrawl, por lo que la ingesta posterior sigue siendo la misma.
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'])Paso 5: Programar actualización semanal
Cron o GitHub Actions inician el rastreo semanal.
# .github/workflows/crawl.yml
on:
schedule: [{cron: '0 4 * * 1'}]
jobs:
crawl:
runs-on: ubuntu-latest
steps: [{run: python crawl.py}]Ejemplo en 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)))Ejemplo en 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));
}
}Salida esperada
Weekly 10K-page crawl completes in 20-40 minutes. Markdown output identical to Firecrawl. Per-page cost: 1 credit.