Resumen
Este pipeline implementa un API-first enfoque to recopilacion de datos: intentar Scavio structured API for cada consulta first, y solo fall back to navegador automatizacion (Selenium, Playwright) for el rare cases donde datos estructurados es insufficient. Most teams encontrar ese 90%+ of their scraping jobs puede be replaced by llamadas un API, dramatically reducing infrastructure costs y maintenance. El fallback path asegura completo cobertura mientras minimizing navegador automatizacion usage.
Desencadenador
On-demand o programado per recopilacion de datos batch
Programación
On-demand per recopilacion de datos batch
Pasos del flujo de trabajo
Cargar recopilacion de datos tareas
Leer el batch of URLs o consultas ese necesita recopilacion de datos de el tarea queue.
Attempt API-first collection
For cada tarea, intentar to fulfill it via Scavio structured API (Google, Amazon, etc.).
Evaluar API resultado completeness
Verificar if el API resultado contiene todos requerido campos. Mark tareas as completo o needing fallback.
Ejecutar navegador fallback for remaining tareas
For tareas el API podria no fully satisfy, fall back to navegador automatizacion as un last resort.
Log API vs navegador proporcion
Record como muchos tareas usado API vs navegador to rastrear migration progreso sobre time.
Implementacion en Python
import requests
import json
from pathlib import Path
from datetime import datetime
API_KEY = "your_scavio_api_key"
TASKS = [
{"id": "t1", "query": "best CRM software 2026", "platform": "google", "required_fields": ["title", "link", "snippet"]},
{"id": "t2", "query": "wireless mouse", "platform": "amazon", "required_fields": ["title", "price", "rating"]},
{"id": "t3", "query": "python tutorial 2026", "platform": "google", "required_fields": ["title", "link"]},
]
def try_api(query: str, platform: str, required: list[str]) -> dict | None:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": platform, "query": query},
timeout=15,
)
res.raise_for_status()
results = res.json().get("organic", [])
if not results:
return None
top = results[0]
# Check all required fields are present
if all(top.get(f) for f in required):
return {"method": "api", "data": {f: top[f] for f in required}}
return None
def browser_fallback(query: str) -> dict:
"""Placeholder for Selenium/Playwright fallback."""
return {"method": "browser", "data": {"note": "browser automation would run here"}}
def run():
date = datetime.utcnow().strftime("%Y-%m-%d")
results = []
api_count = 0
browser_count = 0
for task in TASKS:
api_result = try_api(task["query"], task["platform"], task["required_fields"])
if api_result:
results.append({"task_id": task["id"], **api_result})
api_count += 1
else:
fallback = browser_fallback(task["query"])
results.append({"task_id": task["id"], **fallback})
browser_count += 1
total = api_count + browser_count
api_pct = round(api_count / total * 100) if total else 0
output = {"date": date, "total_tasks": total, "api_fulfilled": api_count, "browser_fallback": browser_count, "api_percentage": api_pct, "results": results}
Path(f"collection_batch_{date}.json").write_text(json.dumps(output, indent=2))
print(f"Batch {date}: {api_count}/{total} via API ({api_pct}%), {browser_count} fallback to browser")
if __name__ == "__main__":
run()Implementacion en JavaScript
const API_KEY = "your_scavio_api_key";
const TASKS = [
{ id: "t1", query: "best CRM software 2026", platform: "google", required: ["title", "link"] },
{ id: "t2", query: "wireless mouse", platform: "amazon", required: ["title", "price"] },
];
async function tryApi(query, platform, required) {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform, query }),
});
if (!res.ok) return null;
const top = ((await res.json()).organic ?? [])[0];
if (!top || !required.every((f) => top[f])) return null;
return { method: "api", data: Object.fromEntries(required.map((f) => [f, top[f]])) };
}
let apiCount = 0;
for (const task of TASKS) {
const result = await tryApi(task.query, task.platform, task.required);
if (result) apiCount++;
}
console.log(`${apiCount}/${TASKS.length} tasks fulfilled via API (${Math.round(apiCount / TASKS.length * 100)}%)`);Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA