Un dropshipping réussi commence par trouver des produits avec une forte demande, de bonnes marges et une concurrence gérable. La recherche manuelle de produits sur Amazon et Walmart est fastidieuse et lente. Ce tutoriel construit un pipeline automatisé de recherche de produits qui interroge les deux plateformes via l'API Scavio, calcule les marges potentielles à partir des différences de prix, filtre par qualité des avis et génère une liste classée d'opportunités de produits.
Prérequis
- Python 3.10 ou supérieur
- bibliothèque requests installée
- Une clé API Scavio
- Une liste de niches de produits à rechercher
Parcours
Étape 1: Définir les niches de produits à rechercher
Commencez par des catégories de produits larges qui performent bien en dropshipping. Le script recherchera les deux plateformes pour chaque niche.
NICHES = [
"portable blender",
"posture corrector",
"led strip lights",
"phone tripod",
]Étape 2: Rechercher les deux plateformes pour chaque niche
Interroger Amazon et Walmart via l'API Scavio et collecter les meilleurs produits de chaque.
from concurrent.futures import ThreadPoolExecutor
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", [])[:10]
def research_niche(niche: str) -> dict:
with ThreadPoolExecutor(max_workers=2) as ex:
amazon_fut = ex.submit(search_platform, "amazon", niche)
walmart_fut = ex.submit(search_platform, "walmart", niche)
return {"amazon": amazon_fut.result(), "walmart": walmart_fut.result()}Étape 3: Noter les produits par opportunité
Calculer un score d'opportunité basé sur le prix, la note et le volume d'avis. Des notes élevées avec une faible concurrence signalent de bonnes opportunités.
def score_product(product: dict) -> float:
price = float(product.get("price", "0").replace("$", "").replace(",", "") or 0)
rating = float(product.get("rating", "0") or 0)
reviews = int(product.get("reviews_count", 0) or 0)
if price < 10 or price > 200:
return 0
review_score = min(reviews / 1000, 5)
return round(rating * review_score * (1 if 20 < price < 80 else 0.5), 2)Étape 4: Afficher les opportunités classées
Trier tous les produits des deux plateformes par score d'opportunité et imprimer les meilleurs candidats.
def find_opportunities(niches: list[str]) -> list[dict]:
all_products = []
for niche in niches:
data = research_niche(niche)
for platform, products in data.items():
for p in products:
p["platform"] = platform
p["niche"] = niche
p["score"] = score_product(p)
all_products.append(p)
return sorted(all_products, key=lambda x: x["score"], reverse=True)[:20]Exemple Python
import os
import requests
from concurrent.futures import ThreadPoolExecutor
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
NICHES = ["portable blender", "posture corrector", "led strip lights"]
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", [])[:10]
def score(p: dict) -> float:
price = float((p.get("price") or "0").replace("$", "").replace(",", "") or 0)
rating = float(p.get("rating") or 0)
if price < 10 or price > 200 or rating < 3.5:
return 0
return round(rating * min(int(p.get("reviews_count") or 0) / 500, 5), 2)
if __name__ == "__main__":
results = []
for niche in NICHES:
for platform in ["amazon", "walmart"]:
for p in search(platform, niche):
p["score"] = score(p)
p["src"] = platform
results.append(p)
for p in sorted(results, key=lambda x: x["score"], reverse=True)[:10]:
print(f"[{p['src']}] {p.get('title', '')[:50]} | {p.get('price')} | score: {p['score']}")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 search(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, 10);
}
async function main() {
const niches = ["portable blender", "posture corrector"];
const results = [];
for (const niche of niches) {
const [amazon, walmart] = await Promise.all([
search("amazon", niche), search("walmart", niche)
]);
amazon.forEach(p => results.push({ ...p, src: "amazon" }));
walmart.forEach(p => results.push({ ...p, src: "walmart" }));
}
results.forEach(p => {
const price = parseFloat((p.price || "0").replace(/[$,]/g, ""));
p.score = price > 10 && price < 100 ? parseFloat(p.rating || 0) * 2 : 0;
});
results.sort((a, b) => b.score - a.score).slice(0, 10)
.forEach(p => console.log(`[${p.src}] ${p.title?.slice(0, 50)} | ${p.price}`));
}
main().catch(console.error);Sortie attendue
[amazon] BlendJet 2 Portable Blender | $29.99 | score: 22.5
[walmart] Portable Blender USB Rechargeable | $19.99 | score: 18.0
[amazon] VOKKA Posture Corrector for Men and Women | $25.99 | score: 17.5
[amazon] Govee LED Strip Lights 50ft | $34.99 | score: 16.8