Suivi des prix concurrents

Configurez un suivi automatisé des prix sur les sites web concurrents à l'aide de l'API FourA.

Ce que vous allez créer

Un script Python qui :

  1. Récupère les pages produits à partir d'une liste d'URL concurrentes
  2. Extrait les données de prix du code HTML
  3. Enregistre les résultats dans un fichier CSV
  4. S'exécute selon un calendrier planifié

Prérequis

  • Une clé API FourA (obtenez-en une ici)
  • Python 3.8+
  • Les paquets requests et beautifulsoup4
pip install requests beautifulsoup4

Étape 1 : Définir vos cibles

Créez une liste d'URL de produits à suivre :

targets = [
    {"name": "Competitor A - Widget", "url": "https://competitor-a.com/widget", "selector": ".price"},
    {"name": "Competitor B - Widget", "url": "https://competitor-b.com/products/widget", "selector": "[data-price]"},
    {"name": "Competitor C - Widget", "url": "https://competitor-c.com/item/123", "selector": ".product-price span"},
]

Étape 2 : Récupérer les pages via FourA

import requests
import time

SINGLE_URL = "https://eu.api.foura.ai/api/single/"
BROWSER_URL = "https://eu.api.foura.ai/api/browser/"
API_KEY = "YOUR_API_KEY"

HEADERS = {
    "X-API-Key": API_KEY,
    "Content-Type": "application/json"
}

def fetch_page(url, use_browser=False):
    if use_browser:
        resp = requests.post(BROWSER_URL, headers=HEADERS, json={
            "url": url,
            "timeout_ms": 15000
        })
        if resp.status_code == 429:
            time.sleep(5)
            return fetch_page(url, use_browser)
        return resp.json().get("body", "")
    else:
        resp = requests.post(SINGLE_URL, headers=HEADERS, json={
            "method": "GET",
            "url": url,
            "unblocker": True
        })
        if resp.status_code == 429:
            time.sleep(5)
            return fetch_page(url, use_browser)
        return resp.json().get("data", "")

Étape 3 : Extraire les prix

from bs4 import BeautifulSoup
import re

def extract_price(html, selector):
    soup = BeautifulSoup(html, "html.parser")
    element = soup.select_one(selector)
    if not element:
        return None
    # Extract numeric price from text like "$49.99" or "49,99 EUR"
    text = element.get_text(strip=True)
    match = re.search(r'[\d,.]+', text)
    return float(match.group().replace(',', '.')) if match else None

Étape 4 : Exécuter et enregistrer les résultats

import csv
from datetime import datetime

def monitor_prices():
    timestamp = datetime.now().isoformat()
    results = []

    for target in targets:
        html = fetch_page(target["url"])
        price = extract_price(html, target["selector"])
        results.append({
            "timestamp": timestamp,
            "name": target["name"],
            "url": target["url"],
            "price": price
        })
        print(f"{target['name']}: {price}")
        time.sleep(1)  # Be polite

    # Append to CSV
    with open("prices.csv", "a", newline="") as f:
        writer = csv.DictWriter(f, fieldnames=["timestamp", "name", "url", "price"])
        if f.tell() == 0:
            writer.writeheader()
        writer.writerows(results)

if __name__ == "__main__":
    monitor_prices()

Étape 5 : Planifier l'exécution

Exécutez le script toutes les heures avec cron :

crontab -e
# Add this line:
0 * * * * cd /path/to/project && python3 monitor.py >> monitor.log 2>&1

Conseils

  • Commencez par l'endpoint single, passez à browser si les pages utilisent le rendu JavaScript
  • Ajoutez une gestion des erreurs : les sites modifient leur mise en page. Enregistrez les échecs séparément.
  • Gardez les sélecteurs à jour : lorsqu'un concurrent modifie son design, mettez à jour le sélecteur CSS
  • Respectez les sites : espacez les requêtes, évitez les heures de pointe, respectez le fichier robots.txt

Étapes suivantes

Mis à jour : 27 avril 2026