Aperçu
Ce workflow actualise quotidiennement les données des produits Amazon pour une liste de produits surveillés sans aucune infrastructure de scraping. Il interroge chaque produit sur Amazon via Scavio, extrait les prix, notes et nombres d'avis actuels, compare avec les données du jour précédent et signale les changements significatifs. Remplace les scrapers Amazon fragiles qui cassent toutes les 2 à 4 semaines par un pipeline API sans maintenance.
Déclencheur
Planification Cron (tous les jours à 6h00 UTC)
Planification
S'exécute quotidiennement à 6h00 UTC
Étapes du workflow
Charger la liste de surveillance des produits
Lire la liste des produits surveillés avec leurs requêtes de recherche et leurs données précédentes.
Interroger Amazon via Scavio
Pour chaque produit, appeler le endpoint Amazon de Scavio pour obtenir les données actuelles de l'annonce.
Extraire les métriques du produit
Analyser le prix, la note, le nombre d'avis et la disponibilité à partir des résultats structurés.
Comparer avec les données précédentes
Marquer les produits avec des variations de prix supérieures à 5%, des changements de note ou de disponibilité.
Stocker les données mises à jour
Écrire les données actuelles des produits dans le stockage pour la comparaison de demain.
Implémentation 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)Implémentation 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" }]);Plateformes utilisées
Amazon
Recherche de produits avec prix, notes et avis