Les outils de comparaison de prix aident les acheteurs et les revendeurs à trouver la meilleure offre chez plusieurs détaillants. En construire un nécessite d'interroger plusieurs plateformes, de normaliser les formats de prix et de classer les résultats par valeur. L'API Scavio couvre à la fois Amazon et Walmart avec un point d'accès unifié, ce qui permet d'interroger facilement les deux plateformes et de comparer les résultats côte à côte. Ce tutoriel construit une fonction de comparaison qui accepte un nom de produit, interroge les deux plateformes en parallèle et renvoie une liste triée d'offres.
Prérequis
- Python 3.10 ou supérieur
- requests et concurrent.futures (stdlib) disponibles
- Une clé API Scavio
- Compréhension de base de la programmation asynchrone ou concurrente
Parcours
Étape 1: Interroger les deux plateformes simultanément
Utilisez concurrent.futures.ThreadPoolExecutor pour interroger Amazon et Walmart en même temps, réduisant ainsi la latence totale.
from concurrent.futures import ThreadPoolExecutor, as_completed
def search_platform(platform: str, query: str) -> list[dict]:
r = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": platform, "query": query, "marketplace": "US"}
)
r.raise_for_status()
return r.json().get("products", [])
def fetch_both(query: str) -> dict:
with ThreadPoolExecutor(max_workers=2) as ex:
futures = {ex.submit(search_platform, p, query): p for p in ["amazon", "walmart"]}
return {futures[f]: f.result() for f in as_completed(futures)}Étape 2: Normaliser les prix entre les plateformes
Les deux plateformes renvoient le prix sous forme de chaîne comme "$29.99". Analysez-les en flottants pour la comparaison.
def normalize(product: dict, source: str) -> dict:
price_str = product.get("price", "")
price = float(price_str.replace("$", "").replace(",", "")) if price_str else None
return {"source": source, "title": product.get("title"), "price": price, "raw": price_str}Étape 3: Fusionner et trier les résultats
Combinez les résultats des deux plateformes en une seule liste et triez par prix croissant.
def compare(query: str) -> list[dict]:
results = fetch_both(query)
items = []
for source, products in results.items():
items.extend(normalize(p, source) for p in products[:5])
return sorted(items, key=lambda x: x["price"] or float("inf"))Étape 4: Afficher le tableau de comparaison
Affichez un tableau formaté montrant le meilleur prix pour le produit sur les deux plateformes.
offers = compare("Sony WH-1000XM5")
print(f"{'Source':<10} {'Price':<10} {'Title'}")
for o in offers[:6]:
print(f"{o['source']:<10} {o['raw']:<10} {o['title'][:50]}")Exemple Python
import os
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def search(platform: str, query: str) -> list[dict]:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"platform": platform, "query": query, "marketplace": "US"})
r.raise_for_status()
return r.json().get("products", [])
def compare(query: str) -> list[dict]:
with ThreadPoolExecutor(max_workers=2) as ex:
futs = {ex.submit(search, p, query): p for p in ["amazon", "walmart"]}
all_items = []
for f in as_completed(futs):
src = futs[f]
for p in f.result()[:5]:
price_str = p.get("price", "")
price = float(price_str.replace("$", "").replace(",", "")) if price_str else None
all_items.append({"source": src, "price": price, "raw": price_str, "title": p.get("title", "")})
return sorted(all_items, key=lambda x: x["price"] or float("inf"))
if __name__ == "__main__":
for o in compare("Sony WH-1000XM5")[:6]:
print(f"{o['source']:<10} {o['raw']:<10} {o['title'][:50]}")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 searchPlatform(platform, query) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ platform, query, marketplace: "US" })
});
const data = await res.json();
return (data.products || []).slice(0, 5).map(p => ({ source: platform, ...p }));
}
async function compare(query) {
const [amazon, walmart] = await Promise.all([
searchPlatform("amazon", query),
searchPlatform("walmart", query)
]);
const all = [...amazon, ...walmart];
return all.sort((a, b) => {
const pa = parseFloat((a.price || "").replace(/[$,]/g, "")) || Infinity;
const pb = parseFloat((b.price || "").replace(/[$,]/g, "")) || Infinity;
return pa - pb;
});
}
compare("Sony WH-1000XM5").then(results => {
results.slice(0, 6).forEach(r => console.log(`${r.source}: ${r.price} — ${r.title?.slice(0, 50)}`));
}).catch(console.error);Sortie attendue
amazon $279.00 Sony WH-1000XM5 Wireless Noise Canceling Headphones
amazon $289.99 Sony WH-1000XM5 Wireless Headphones (Midnight Black)
walmart $279.00 Sony WH1000XM5 Bluetooth Headphones
walmart $299.00 Sony WH-1000XM5 Premium Wireless Headphones