Resumen
Este flujo de trabajo refreshes Amazon producto datos diario for un monitored producto lista sin cualquier scraping infrastructure. It consultas cada producto on Amazon via Scavio, extrae actual prices, ratings, y resena counts, compara contra el anterior day's datos, y flags significativo cambios. Replaces fragile Amazon scrapers ese break cada 2-4 semanas con un maintenance-free API pipeline.
Desencadenador
Cron programar (diario at 6 AM UTC)
Programación
Ejecuta diario at 6:00 AM UTC
Pasos del flujo de trabajo
Cargar producto watchlist
Leer el lista of monitored productos con their consultas de busqueda y anterior datos.
Consulta Amazon via Scavio
For cada producto, call Scavio Amazon endpoint to obtener actual listing datos.
Extraer producto metricas
Analizar price, rating, resena conteo, y disponibilidad de structured resultados.
Comparar contra anterior datos
Marcar productos con cambios de precio sobre 5%, rating cambios, o disponibilidad cambios.
Almacenar actualizado datos
Escribir actual producto datos to storage for tomorrow's comparacion.
Implementacion en Python
import requests
import json
from datetime import datetime
from pathlib import Path
API_KEY = "your_scavio_api_key"
THRESHOLD = 0.05
def refresh_products(products: list[dict]) -> dict:
baseline_path = Path("amazon_baseline.json")
baseline = json.loads(baseline_path.read_text()) if baseline_path.exists() else {}
updated = []
alerts = []
for product in products:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "amazon", "query": product["query"]},
timeout=15,
)
if not res.ok:
continue
top = res.json().get("organic", [{}])[0] if res.json().get("organic") else {}
current_price = top.get("price")
slug = product["slug"]
if current_price and baseline.get(slug, {}).get("price"):
prev_price = baseline[slug]["price"]
change = abs(current_price - prev_price) / prev_price
if change >= THRESHOLD:
alerts.append({"slug": slug, "prev": prev_price, "current": current_price, "change_pct": round(change * 100, 1)})
baseline[slug] = {"price": current_price, "rating": top.get("rating"), "title": top.get("title", ""), "updated": datetime.utcnow().isoformat()}
updated.append(slug)
baseline_path.write_text(json.dumps(baseline, indent=2))
print(f"Refreshed {len(updated)} products, {len(alerts)} price alerts")
for a in alerts:
print(f" {a['slug']}: ${a['prev']} -> ${a['current']} ({a['change_pct']}%)")
return {"updated": len(updated), "alerts": alerts}
products = [
{"slug": "airpods-pro", "query": "Apple AirPods Pro"},
{"slug": "sony-wh1000xm5", "query": "Sony WH-1000XM5"},
]
refresh_products(products)Implementacion en JavaScript
const API_KEY = "your_scavio_api_key";
async function refreshProducts(products) {
const results = [];
for (const p of products) {
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: "amazon", query: p.query }),
});
if (!res.ok) continue;
const top = ((await res.json()).organic ?? [])[0] ?? {};
results.push({ slug: p.slug, price: top.price, rating: top.rating, title: top.title ?? "" });
}
console.log(`Refreshed ${results.length} products`);
return results;
}
await refreshProducts([{ slug: "airpods", query: "Apple AirPods Pro" }]);Plataformas utilizadas
Amazon
Búsqueda de productos con precios, calificaciones y reseñas