La recherche d'adéquation produit-marché nécessitait autrefois d'embaucher un freelancer pour lire des centaines d'avis. Un agent d'extraction d'avis le fait en quelques minutes. Ce tutoriel en construit un qui récupère les avis Amazon, Walmart et Google pour une catégorie, puis regroupe les plaintes en thèmes de points de douleur.
Prérequis
- Python 3.10+
- Une clé API Scavio
- Des identifiants LLM pour le regroupement
- Une catégorie de produit
Parcours
Étape 1: Récupérer les avis Amazon
Meilleures ventes dans la catégorie.
import requests, os
API_KEY = os.environ['SCAVIO_API_KEY']
def amazon_reviews(category):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'amazon', 'query': category, 'marketplace': 'US'})
asins = [p['asin'] for p in r.json().get('products', [])[:10]]
revs = []
for a in asins:
rv = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'amazon_reviews', 'query': a}).json()
revs += rv.get('reviews', [])
return revsÉtape 2: Récupérer les avis Walmart pour validation croisée
Même catégorie, plateforme différente.
def walmart_reviews(category):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'walmart', 'query': category})
return r.json().get('products', [])[:10]Étape 3: Filtrer les avis négatifs
Les avis 1 à 3 étoiles contiennent les points de douleur.
def negatives(reviews):
return [r for r in reviews if r.get('rating', 5) <= 3]Étape 4: Regrouper les points de douleur avec un LLM
Regrouper les textes d'avis en thèmes.
def cluster(reviews, llm):
prompt = 'Cluster these reviews into 5 pain-point themes:\n' + '\n'.join(r['text'] for r in reviews[:100])
return llm.generate(prompt)Étape 5: Rapport de sortie
Top 5 des thèmes avec citations représentatives.
def report(themes):
for t in themes:
print(f'{t["name"]} ({t["count"]}): {t["quote"]}')Exemple Python
import os, requests
API_KEY = os.environ['SCAVIO_API_KEY']
def mine(category):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'amazon', 'query': category, 'marketplace': 'US'})
reviews = []
for p in r.json().get('products', [])[:5]:
rv = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'amazon_reviews', 'query': p['asin']}).json()
reviews += [x for x in rv.get('reviews', []) if x.get('rating', 5) <= 3]
return reviews
print(len(mine('standing desk')))Exemple JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
export async function mine(category) {
const r = 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: category, marketplace: 'US' })
});
const products = (await r.json()).products?.slice(0, 5) || [];
const reviews = [];
for (const p of products) {
const rv = 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_reviews', query: p.asin })
});
reviews.push(...((await rv.json()).reviews || []).filter(x => x.rating <= 3));
}
return reviews;
}Sortie attendue
Top 5 pain-point themes for a category with representative quotes. Typical output for 'standing desk': wobble, assembly time, motor noise, price vs. feel, short cable.