Une seule source d'avis peut être biaisée ou avoir une couverture limitée. L'agrégation des avis d'Amazon (acheteurs vérifiés) et de Google (avis éditoriaux et utilisateurs du web) donne une image plus représentative de la réception d'un produit. Ce tutoriel construit un pipeline d'agrégation d'avis utilisant l'API Scavio qui collecte les avis de multiples sources, normalise les notes sur une échelle de 5 points et calcule un score agrégé pondéré.
Prérequis
- Python 3.8 ou supérieur
- bibliothèque requests installée
- Une clé API Scavio
- Compréhension des statistiques de base
Parcours
Étape 1: Récupérer les avis Amazon
Interroger le point de terminaison Amazon de Scavio pour un produit et extraire son tableau d'avis et sa note moyenne.
def amazon_reviews(asin: str) -> dict:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"platform": "amazon", "query": asin, "marketplace": "US"})
r.raise_for_status()
data = r.json()
return {"rating": data.get("product", {}).get("rating"), "reviews": data.get("reviews", [])}Étape 2: Récupérer les signaux d'avis Google
Rechercher sur Google des avis sur le produit et extraire les extraits contenant des mentions de notes.
def google_review_signals(product_name: str) -> list[str]:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"query": f"{product_name} review rating", "country_code": "us"})
r.raise_for_status()
results = r.json().get("organic_results", [])
return [r.get("snippet", "") for r in results if r.get("snippet")]Étape 3: Calculer la note agrégée
Faire la moyenne des notes des avis Amazon pour produire un score pondéré.
def aggregate_rating(reviews: list[dict]) -> float | None:
ratings = [r["rating"] for r in reviews if r.get("rating")]
if not ratings:
return None
return round(sum(ratings) / len(ratings), 2)Étape 4: Construire le rapport agrégé
Combiner la note et le nombre d'avis Amazon avec les signaux d'avis Google en un rapport produit unifié.
def aggregate_report(product: str, asin: str) -> dict:
amazon = amazon_reviews(asin)
signals = google_review_signals(product)
agg = aggregate_rating(amazon["reviews"])
return {
"product": product,
"amazon_avg_rating": amazon.get("rating"),
"review_count": len(amazon["reviews"]),
"aggregate_score": agg,
"google_signals": signals[:3],
}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 call(body):
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY}, json=body)
r.raise_for_status()
return r.json()
def aggregate(product: str, asin: str) -> dict:
amazon_data = call({"platform": "amazon", "query": asin, "marketplace": "US"})
google_data = call({"query": f"{product} review", "country_code": "us"})
reviews = amazon_data.get("reviews", [])
ratings = [r["rating"] for r in reviews if r.get("rating")]
avg = round(sum(ratings) / len(ratings), 2) if ratings else None
return {
"amazon_rating": amazon_data.get("product", {}).get("rating"),
"computed_avg": avg,
"review_count": len(reviews),
"google_snippets": [r.get("snippet") for r in google_data.get("organic_results", [])[:3] if r.get("snippet")]
}
if __name__ == "__main__":
import json
print(json.dumps(aggregate("Sony WH-1000XM5", "B09XS7JWHH"), indent=2))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 call(body) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify(body)
});
return res.json();
}
async function aggregate(product, asin) {
const [amazon, google] = await Promise.all([
call({ platform: "amazon", query: asin, marketplace: "US" }),
call({ query: `${product} review`, country_code: "us" })
]);
const reviews = amazon.reviews || [];
const ratings = reviews.map(r => r.rating).filter(Boolean);
const avg = ratings.length ? Math.round(ratings.reduce((a, b) => a + b) / ratings.length * 100) / 100 : null;
return { amazonRating: amazon.product?.rating, computedAvg: avg, reviewCount: reviews.length };
}
aggregate("Sony WH-1000XM5", "B09XS7JWHH").then(console.log).catch(console.error);Sortie attendue
{
"product": "Sony WH-1000XM5",
"amazon_avg_rating": "4.8",
"review_count": 47,
"aggregate_score": 4.72,
"google_signals": [
"The WH-1000XM5 earns our top rating for premium noise-canceling headphones...",
"5/5 stars. Sony has once again set the bar for consumer audio..."
]
}