Monitorear precios de competidores

Configure el monitoreo automatizado de precios en sitios web de la competencia utilizando la API de FourA.

Qué construirá

Un script de Python que:

  1. Obtiene páginas de productos de una lista de URL de competidores
  2. Extrae datos de precios del HTML
  3. Registra los resultados en un archivo CSV
  4. Se ejecuta de forma programada

Requisitos previos

  • Una clave de API de FourA (obtenga una aquí)
  • Python 3.8+
  • Los paquetes requests y beautifulsoup4
pip install requests beautifulsoup4

Paso 1: Defina sus objetivos

Cree una lista de URL de productos para monitorear:

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"},
]

Paso 2: Obtenga páginas a través de 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", "")

Paso 3: Extraiga precios

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

Paso 4: Ejecute y registre los resultados

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()

Paso 5: Prográmelo

Ejecute el script cada hora con cron:

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

Consejos

  • Comience con el endpoint single, cambie a browser si las páginas utilizan renderizado de JavaScript
  • Agregue manejo de errores: los sitios cambian de diseño. Registre los fallos por separado.
  • Mantenga los selectores actualizados: cuando un competidor rediseñe su sitio, actualice el selector CSS
  • Respete los sitios: espacie las request, evite las horas pico, siga el archivo robots.txt

Próximos pasos

Actualizado: 27 de abril de 2026