Python · Amazon
Suivre les prix Amazon avec Python
Les prix sur Amazon changent sans arrêt, et personne n'a envie d'ouvrir la même page produit tous les matins. Dans ce guide, vous écrivez un petit script qui le fait pour vous : il récupère le prix actuel des produits qui vous intéressent, consigne chaque vérification dans un fichier lisible par un tableur et vous prévient quand un prix passe sous le montant que vous êtes prêt à payer.
Vous n'avez pas à vous occuper de la page Amazon elle-même. everydata.io charge pour vous la page produit en direct et renvoie des données propres – titre, prix, devise, disponibilité – : le script reste court et ne casse pas quand Amazon modifie sa mise en page.
Mis à jour le · par everydata.io
Ce que vous aurez à la fin
- Un script qui vérifie une liste de produits Amazon et ajoute chaque prix à prices.csv.
- Un message quand un prix baisse ou atteint votre objectif.
- Une exécution quotidienne planifiée, pour qu'il tourne sans vous.
Ce dont vous avez besoin
- Python 3.10 ou plus récent et le paquet
requests(pip install requests). - Une clé API everydata.io gratuite – créez-la ici.
- L'ASIN de chaque produit : le code à 10 caractères qui suit
/dp/dans l'adresse Amazon.
01Gardez votre clé API hors du code
Connectez-vous, copiez votre clé depuis le tableau de bord et placez-la dans une variable d'environnement. Le script la lit à cet endroit : la clé ne se retrouve jamais dans un fichier que vous pourriez partager.
export EVERYDATA_API_KEY="ds_your_key"02Recherchez un produit
Commencez par une seule requête pour voir ce qui est renvoyé. L'endpoint produit par ASIN prend l'ASIN et la marketplace (com pour amazon.com, de pour amazon.de, etc.).
import os
import requests
API = "https://api.everydata.io"
KEY = os.environ["EVERYDATA_API_KEY"]
resp = requests.get(
f"{API}/amz/amazon-lookup-product-by-asin",
params={"asin": "B07ZPKN6YR", "domainCode": "com"},
headers={"x-api-key": KEY},
timeout=60,
)
resp.raise_for_status()
product = resp.json()
print(product["productTitle"])
print(product["price"], product["currency"], "-", product["warehouseAvailability"])La réponse est au format JSON. Chaque réponse commence par responseStatus et responseMessage, suivis du produit. Voici une version abrégée de l'exemple documenté :
{
"responseStatus": "PRODUCT_FOUND_RESPONSE",
"responseMessage": "Product successfully found!",
"productTitle": "Apple iPhone 11, 64GB, Black - Unlocked (Renewed)",
"productRating": "4.2 out of 5 stars",
"countReview": 60024,
"asin": "B07ZPKN6YR",
"warehouseAvailability": "This item cannot be shipped to your selected delivery location. Please choose a different delivery location.",
"retailPrice": 0,
"price": 0,
"currency": "USD"
}Regardez price dans cet exemple : il vaut 0. Cela arrive quand la page n'affiche aucun prix d'achat – ici parce que l'article ne pouvait pas être livré à l'adresse de livraison. Votre script doit traiter 0 comme « pas de prix pour l'instant », et non comme un produit gratuit.
03Vérifiez une liste de produits et enregistrez chaque résultat
Transformez maintenant cette requête unique en petit tracker. WATCHLIST contient les produits et le prix que vous attendez. Chaque exécution interroge chaque produit une fois, ajoute une ligne à prices.csv et compare le nouveau prix au dernier enregistré.
"""Check the price of a few Amazon products and append each check to prices.csv."""
import csv
import os
import re
import time
from datetime import datetime, timezone
from pathlib import Path
import requests
API = "https://api.everydata.io"
KEY = os.environ["EVERYDATA_API_KEY"]
CSV_FILE = Path("prices.csv")
DOMAIN = "com" # amazon.com – use "de", "co.uk", "fr" … for other marketplaces
# ASIN -> the price at which you want to hear about it
WATCHLIST = {
"B07ZPKN6YR": 30.00,
}
def api_get(path: str, params: dict) -> dict:
"""GET an everydata.io endpoint. Waits when rate limited (429) and retries a failed page load (5xx) once."""
retried = False
for _ in range(4):
resp = requests.get(f"{API}{path}", params=params, headers={"x-api-key": KEY}, timeout=60)
if resp.status_code == 429:
# Too many requests at once. The answer says how long to wait: "... Try again in 12 seconds."
wait = re.search(r"in (\d+) seconds", resp.text)
time.sleep(int(wait.group(1)) + 1 if wait else 60)
continue
if resp.status_code >= 500 and not retried:
retried = True # 5xx answers are not counted against your quota
time.sleep(10)
continue
resp.raise_for_status() # 4xx (wrong key, quota used up, bad parameter) or a second 5xx
return resp.json()
raise RuntimeError("still rate limited after several waits – try again later")
def last_price(asin: str) -> float | None:
"""The most recent price we saved for this ASIN, if any."""
if not CSV_FILE.exists():
return None
with CSV_FILE.open(newline="") as f:
rows = [r for r in csv.DictReader(f) if r["asin"] == asin and r["price"]]
return float(rows[-1]["price"]) if rows else None
def main() -> None:
previous = {asin: last_price(asin) for asin in WATCHLIST}
now = datetime.now(timezone.utc).isoformat(timespec="seconds")
new_file = not CSV_FILE.exists()
with CSV_FILE.open("a", newline="") as f:
writer = csv.writer(f)
if new_file:
writer.writerow(["checked_at", "asin", "title", "price", "retail_price", "currency", "availability"])
for asin, target in WATCHLIST.items():
try:
p = api_get("/amz/amazon-lookup-product-by-asin", {"asin": asin, "domainCode": DOMAIN})
except (requests.RequestException, RuntimeError) as exc:
print(f"{asin}: could not check this time ({exc}) – the next run tries again")
continue # one failed product does not stop the others
price = p.get("price") or None # 0 means the page showed no price
writer.writerow([
now, asin, p.get("productTitle"), price or "", p.get("retailPrice") or "",
p.get("currency") or "", p.get("warehouseAvailability") or "",
])
if price is None:
print(f"{asin}: no price on the page ({p.get('warehouseAvailability')})")
elif price <= target:
print(f"{asin}: {price} {p.get('currency')} – at or below your target of {target}")
elif previous[asin] is not None and price < previous[asin]:
print(f"{asin}: dropped from {previous[asin]} to {price} {p.get('currency')}")
if __name__ == "__main__":
main()Lancez-le avec python3 track.py. La première exécution crée le fichier ; les suivantes ajoutent une ligne par produit. Vous pouvez ouvrir prices.csv dans n'importe quel tableur pour tracer une courbe de prix.
api_get gère les deux réponses que vous rencontrerez tôt ou tard. Si une page ne peut pas être chargée, l'API répond avec un statut 5xx comme 502 ou 503 ; ces réponses ne sont pas décomptées de votre quota, le script attend donc quelques secondes et réessaie une fois. Si vous envoyez trop de requêtes à la fois, la réponse est un 429 qui indique combien de secondes attendre – le script patiente le temps indiqué et continue. Un produit qui échoue encore est signalé et ignoré, et l'exécution suivante le reprend.
04Choisissez comment être prévenu
Le script affiche une ligne dans trois cas : la page n'affiche aucun prix, le prix est inférieur ou égal à votre objectif, ou il a baissé depuis la dernière vérification. L'affichage suffit si vous lisez le journal. Si vous préférez recevoir un message, remplacez les trois appels print par ce que vous utilisez déjà – un e-mail via le module smtplib de Python, un webhook de messagerie ou un service de notifications push.
05Exécutez-le chaque jour
Sur un Mac ou une machine Linux allumée, cron est le planificateur le plus simple. Cette ligne lance le tracker tous les matins à 7 h et conserve un journal :
# Every day at 07:00 – edit with: crontab -e
0 7 * * * cd /home/you/price-tracker && EVERYDATA_API_KEY=ds_your_key /usr/bin/python3 track.py >> track.log 2>&1Sous Windows, le Planificateur de tâches fait le même travail. Un petit serveur ou une tâche CI planifiée conviennent aussi.
Chaque vérification de produit correspond à une requête. Par exemple, trois produits vérifiés une fois par jour représentent environ 90 requêtes par mois, ce qui tient dans l'offre gratuite de 100 requêtes. Pour plus de produits ou plus de vérifications par jour, consultez les tarifs.
06Facultatif : lisez l'historique des prix dont everydata.io dispose déjà
Chaque recherche de produit effectuée via everydata.io enregistre aussi le prix observé. L'endpoint d'historique des prix renvoie ces relevés pour les days derniers jours. Il ne connaît que les produits que quelqu'un a déjà consultés : pour un produit que personne n'a encore vérifié, la liste est vide – votre propre fichier CSV reste la référence fiable.
resp = requests.get(
f"{API}/amz/amazon-price-history",
params={"asin": "B07ZPKN6YR", "domainCode": "com", "days": 90},
headers={"x-api-key": KEY},
timeout=60,
)
data = resp.json()
print(data["count"], "observations")
for point in data["history"]:
print(point["observedAt"], point["price"], point["inStock"]){
"responseStatus": "PRODUCT_FOUND_RESPONSE",
"responseMessage": "Product successfully found!",
"asin": "B07ZPKN6YR",
"domainCode": "com",
"days": 90,
"currency": "USD",
"count": 2,
"history": [
{
"observedAt": "2026-09-18T10:12:00Z",
"price": 39.99,
"retailPrice": 49.99,
"inStock": true
},
{
"observedAt": "2026-09-19T09:40:00Z",
"price": 34.99,
"retailPrice": 49.99,
"inStock": true
}
]
}Endpoints utilisés dans ce guide
Product Details by ASIN · API Amazon
Price History (observations collected by this API) · API Amazon
Ce que vous pouvez faire d’autre avec ces données
Suivi des prix Amazon par API : prix de la Buy Box, prix barré, stock et historique des prix par ASIN en JSON, 15+ marketplaces. 100 appels gratuits/mois.
API produits Amazon au lieu d'un scraper : titre, marque, prix, note, images, points clés, specs, variantes et meilleurs avis en JSON, par URL ou ASIN.
Les offres du jour et Ventes Flash Amazon en JSON : prix promo, prix de référence, remise et état de l'offre par ASIN, filtrés par rayon, remise et note.
Essayez avec vos propres données
L’offre gratuite comprend 100 requêtes par mois, utilisables sur toutes les plateformes – de quoi suivre ce guide de bout en bout.