Extrayez les données produits d'Amazon et Walmart via une seule API en interrogeant les deux plateformes avec la même recherche de produit, en normalisant les différents schémas de réponse en un format unifié, en comparant les prix entre les marketplaces, et en configurant des alertes lorsque les écarts de prix dépassent un seuil. Exécuter des scrappers séparés pour chaque marketplace implique de maintenir deux codebases, deux pools de proxies et deux pipelines d'analyse. Une API de recherche multi-plateforme réduit cela à une seule codebase avec un paramètre de plateforme.
Prérequis
- Python 3.8+ installé
- bibliothèque requests installée
- Une clé API Scavio depuis scavio.dev
- Une liste de produits à suivre sur plusieurs marketplaces
Parcours
Étape 1: Définir les produits à suivre
Configurez la liste de produits et les marketplaces à interroger pour chaque produit.
import os, requests, json, re
API_KEY = os.environ['SCAVIO_API_KEY']
PRODUCTS = [
'Sony WH-1000XM5 headphones',
'Apple AirPods Pro 2',
'Samsung Galaxy S24 Ultra case',
]
PLATFORMS = ['amazon', 'walmart']Étape 2: Interroger les deux plateformes
Recherchez chaque produit sur Amazon et Walmart via l'API multi-plateforme de Scavio.
def search_product(product: str, platform: str) -> list:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': platform, 'query': product}, timeout=15)
resp.raise_for_status()
return resp.json().get('organic_results', [])
def search_all_platforms(product: str) -> dict:
results = {}
for platform in PLATFORMS:
results[platform] = search_product(product, platform)
print(f'{platform}: {len(results[platform])} results for "{product[:30]}"')
return results
all_results = search_all_platforms(PRODUCTS[0])Étape 3: Normaliser le schéma
Mappez les champs de réponse d'Amazon et Walmart vers un schéma commun afin que le code en aval n'ait pas besoin de logique spécifique à la plateforme.
def parse_price(price_str: str) -> float:
if not price_str:
return 0.0
cleaned = re.sub(r'[^\d.]', '', str(price_str))
try:
return float(cleaned)
except ValueError:
return 0.0
def normalize(result: dict, platform: str) -> dict:
return {
'platform': platform,
'title': result.get('title', ''),
'price': parse_price(result.get('price', '')),
'price_raw': result.get('price', ''),
'rating': result.get('rating', ''),
'url': result.get('link', ''),
'image': result.get('thumbnail', result.get('image', '')),
}
def normalize_all(results: dict) -> list:
normalized = []
for platform, items in results.items():
for item in items[:3]:
normalized.append(normalize(item, platform))
return normalized
normalized = normalize_all(all_results)
for n in normalized:
print(f"{n['platform']:<10} ${n['price']:<8} {n['title'][:50]}")Étape 4: Comparer les prix entre les marketplaces
Trouvez le meilleur prix pour chaque produit sur Amazon et Walmart.
def compare_prices(product: str) -> dict:
results = search_all_platforms(product)
normalized = normalize_all(results)
if not normalized:
return {'product': product, 'best': None}
priced = [n for n in normalized if n['price'] > 0]
if not priced:
return {'product': product, 'best': None, 'note': 'no prices found'}
best = min(priced, key=lambda x: x['price'])
worst = max(priced, key=lambda x: x['price'])
savings = worst['price'] - best['price']
return {
'product': product,
'best': {'platform': best['platform'], 'price': best['price'], 'title': best['title'][:50]},
'worst': {'platform': worst['platform'], 'price': worst['price']},
'savings': round(savings, 2),
}
comp = compare_prices(PRODUCTS[0])
print(f"Best: {comp['best']['platform']} ${comp['best']['price']} (save ${comp['savings']})")Étape 5: Alerter sur les écarts de prix
Configurez des alertes lorsque l'écart de prix entre les marketplaces dépasse un seuil.
PRICE_DIFF_THRESHOLD = 10.0 # dollars
def check_alerts(products: list) -> list:
alerts = []
for product in products:
comp = compare_prices(product)
if comp.get('savings', 0) >= PRICE_DIFF_THRESHOLD:
alert = {
'product': product,
'best_platform': comp['best']['platform'],
'best_price': comp['best']['price'],
'savings': comp['savings'],
}
alerts.append(alert)
print(f'ALERT: {product} - save ${alert["savings"]} on {alert["best_platform"]}')
if not alerts:
print('No significant price differences found')
return alerts
check_alerts(PRODUCTS)Exemple Python
import requests, os, re
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def compare(product):
prices = {}
for platform in ['amazon', 'walmart']:
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': platform, 'query': product}).json()
top = (data.get('organic_results', []) or [{}])[0]
price = re.sub(r'[^\d.]', '', top.get('price', '0'))
prices[platform] = float(price) if price else 0
return prices
print(compare('Sony WH-1000XM5'))Exemple JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function compare(product) {
const prices = {};
for (const platform of ['amazon', 'walmart']) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H, body: JSON.stringify({platform, query: product})
});
const top = ((await r.json()).organic_results || [])[0] || {};
prices[platform] = parseFloat((top.price || '0').replace(/[^\d.]/g, '')) || 0;
}
return prices;
}
compare('Sony WH-1000XM5').then(console.log);Sortie attendue
A unified pipeline that queries Amazon and Walmart for the same products, normalizes the data into a common schema, and alerts on cross-marketplace price differences.