Les applications de recherche de bonnes affaires surveillent les prix des produits chez différents détaillants et informent les utilisateurs lorsque les prix baissent significativement. Les indicateurs clés sont le prix actuel par rapport au prix d'origine ou historique, exprimé en pourcentage de réduction. Les réponses de produits Amazon et Walmart de l'API Scavio incluent à la fois les prix actuels et d'origine lorsqu'ils sont disponibles, ce qui permet de calculer facilement les réductions à la volée. Ce tutoriel construit un chercheur de bonnes affaires qui analyse les résultats de recherche de produits, calcule les réductions et affiche les offres au-dessus d'un seuil configurable.
Prérequis
- Python 3.8 ou supérieur
- bibliothèque requests installée
- Une clé API Scavio
- Opérations mathématiques de base en Python et analyse de chaînes
Parcours
Étape 1: Rechercher des produits et extraire les prix
Interroger Amazon pour une catégorie de produits et extraire le prix actuel et le prix d'origine pour chaque résultat.
def extract_prices(product: dict) -> tuple[float | None, float | None]:
def parse(s):
return float(s.replace("$", "").replace(",", "")) if s else None
return parse(product.get("price")), parse(product.get("original_price"))Étape 2: Calculer le pourcentage de réduction
Calculer le pourcentage de réduction à partir du prix actuel et du prix d'origine. Retourner 0 si le prix d'origine n'est pas disponible.
def discount_pct(current: float | None, original: float | None) -> float:
if not current or not original or original <= current:
return 0.0
return round((original - current) / original * 100, 1)Étape 3: Filtrer les offres au-dessus d'un seuil
Analyser tous les produits et retourner ceux dont le pourcentage de réduction est égal ou supérieur au seuil configuré.
def find_deals(products: list[dict], min_discount: float = 20.0) -> list[dict]:
deals = []
for p in products:
current, original = extract_prices(p)
pct = discount_pct(current, original)
if pct >= min_discount:
deals.append({**p, "discount_pct": pct})
return sorted(deals, key=lambda x: x["discount_pct"], reverse=True)Étape 4: Afficher les alertes de bonnes affaires
Afficher une alerte de bonne affaire formatée pour chaque produit qualifié.
def print_deals(deals: list[dict]) -> None:
if not deals:
print("No deals found above threshold")
return
for d in deals:
print(f"[{d['discount_pct']}% OFF] {d['title'][:50]}")
print(f" Now: {d.get('price')} | Was: {d.get('original_price')}")Exemple Python
import os
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def search_amazon(query: str) -> list[dict]:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"platform": "amazon", "query": query, "marketplace": "US"})
r.raise_for_status()
return r.json().get("products", [])
def parse_price(s): return float(s.replace("$", "").replace(",", "")) if s else None
def find_deals(products, min_pct=20):
deals = []
for p in products:
curr = parse_price(p.get("price"))
orig = parse_price(p.get("original_price"))
if curr and orig and orig > curr:
pct = round((orig - curr) / orig * 100, 1)
if pct >= min_pct:
deals.append({**p, "pct": pct})
return sorted(deals, key=lambda x: x["pct"], reverse=True)
if __name__ == "__main__":
products = search_amazon("bluetooth headphones")
for deal in find_deals(products):
print(f"[{deal['pct']}% off] {deal.get('title', '')[:50]} — {deal.get('price')}")Exemple JavaScript
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
async function searchAmazon(query) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ platform: "amazon", query, marketplace: "US" })
});
const data = await res.json();
return data.products || [];
}
function parsePrice(s) { return s ? parseFloat(s.replace(/[$,]/g, "")) : null; }
function findDeals(products, minPct = 20) {
return products
.map(p => ({ ...p, pct: (() => {
const curr = parsePrice(p.price), orig = parsePrice(p.original_price);
return curr && orig && orig > curr ? Math.round((orig - curr) / orig * 1000) / 10 : 0;
})() }))
.filter(p => p.pct >= minPct)
.sort((a, b) => b.pct - a.pct);
}
searchAmazon("bluetooth headphones").then(products => {
findDeals(products).forEach(d => console.log(`[${d.pct}% off] ${d.title?.slice(0, 50)} — ${d.price}`));
}).catch(console.error);Sortie attendue
[45% off] Beats Studio3 Wireless Headphones
Now: $109.99 | Was: $199.99
[30% off] Sony WH-CH520 Wireless Headphones
Now: $34.99 | Was: $49.99
[25% off] JBL Tune 510BT Wireless On-Ear
Now: $29.99 | Was: $39.99