Les sites de commerce électronique protègent les pages de produits avec des CAPTCHA pour empêcher la suppression automatique des prix. CaptchaAI vous permet de créer des systèmes fiables de surveillance des prix qui répondent automatiquement à ces défis.
Le problème
Les robots de surveillance des prix font face aux CAPTCHA sur les principales plateformes :
| Plateforme | Type de CAPTCHA | Déclencheur |
|---|---|---|
| Amazone | Image CAPTCHA, reCAPTCHA | Volume de demandes élevé |
| Walmart | Cloudflare Turnstile | Détection de robots |
| eBay | reCAPTCHA v2 | Modèles suspects |
| Meilleur achat | Cloudflare Challenge | Tout le trafic automatisé |
| Boutiques Shopify | reCAPTCHA v3 | Varie selon la configuration du magasin |
Sans gestion du CAPTCHA, votre pipeline de surveillance échoue silencieusement, laissant des écarts de tarification dans vos données.
Architecture
Scheduler (every 30 min)
→ URL Queue
→ Scraper Workers (5-10 concurrent)
→ Fetch page
→ CAPTCHA detected?
→ Yes → CaptchaAI → Solve → Retry page
→ No → Parse prices
→ Store in database
→ Alert on price changes
Mise en œuvre
Moniteur de prix (Python)
import requests
import time
import re
import json
import os
from datetime import datetime
API_KEY = os.environ["CAPTCHAAI_API_KEY"]
BASE_URL = "https://ocr.captchaai.com"
def solve_captcha(method, params):
params["key"] = API_KEY
params["method"] = method
resp = requests.get(f"{BASE_URL}/in.php", params=params)
if not resp.text.startswith("OK|"):
raise Exception(f"Submit failed: {resp.text}")
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get(f"{BASE_URL}/res.php", params={
"key": API_KEY, "action": "get", "id": task_id,
})
if result.text == "CAPCHA_NOT_READY":
continue
if result.text.startswith("OK|"):
return result.text.split("|", 1)[1]
raise Exception(f"Solve failed: {result.text}")
raise TimeoutError("CAPTCHA solve timed out")
def fetch_with_captcha(url, session):
"""Fetch a page, solving CAPTCHAs if encountered."""
resp = session.get(url)
# Check for reCAPTCHA
match = re.search(r'data-sitekey=["\']([A-Za-z0-9_-]+)["\']', resp.text)
if match:
site_key = match.group(1)
token = solve_captcha("userrecaptcha", {
"googlekey": site_key,
"pageurl": url,
})
resp = session.post(url, data={"g-recaptcha-response": token})
# Check for Turnstile
match = re.search(
r'class="cf-turnstile"[^>]*data-sitekey=["\']([^"\']+)', resp.text
)
if match:
site_key = match.group(1)
token = solve_captcha("turnstile", {
"sitekey": site_key,
"pageurl": url,
})
resp = session.post(url, data={"cf-turnstile-response": token})
return resp
def extract_price(html, selectors):
"""Extract price from HTML using regex patterns."""
for pattern in selectors:
match = re.search(pattern, html)
if match:
price_str = match.group(1).replace(",", "")
return float(price_str)
return None
def monitor_prices(products):
"""Monitor prices for a list of products."""
session = requests.Session()
session.headers["User-Agent"] = (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0"
)
results = []
for product in products:
try:
resp = fetch_with_captcha(product["url"], session)
price = extract_price(resp.text, product["selectors"])
results.append({
"name": product["name"],
"url": product["url"],
"price": price,
"timestamp": datetime.utcnow().isoformat(),
"status": "ok",
})
print(f" {product['name']}: ${price}")
except Exception as e:
results.append({
"name": product["name"],
"url": product["url"],
"price": None,
"timestamp": datetime.utcnow().isoformat(),
"status": f"error: {e}",
})
print(f" {product['name']}: ERROR - {e}")
return results
# Define products to monitor
products = [
{
"name": "Wireless Headphones",
"url": "https://example.com/product/headphones",
"selectors": [
r'class="price"[^>]*>\$?([\d,]+\.?\d*)',
r'itemprop="price" content="([\d.]+)"',
],
},
{
"name": "Bluetooth Speaker",
"url": "https://example.com/product/speaker",
"selectors": [
r'class="price"[^>]*>\$?([\d,]+\.?\d*)',
],
},
]
print("Starting price check...")
results = monitor_prices(products)
# Save results
with open("prices.json", "w") as f:
json.dump(results, f, indent=2)
Implémentation de Node.js
const axios = require("axios");
const cheerio = require("cheerio");
const API_KEY = process.env.CAPTCHAAI_API_KEY;
async function solveCaptcha(method, params) {
params.key = API_KEY;
params.method = method;
const submit = await axios.get("https://ocr.captchaai.com/in.php", {
params,
});
const taskId = String(submit.data).split("|")[1];
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const poll = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: API_KEY, action: "get", id: taskId },
});
const text = String(poll.data);
if (text === "CAPCHA_NOT_READY") continue;
if (text.startsWith("OK|")) return text.split("|").slice(1).join("|");
throw new Error(text);
}
throw new Error("Timeout");
}
async function monitorPrice(url) {
const resp = await axios.get(url);
const $ = cheerio.load(resp.data);
// Check for reCAPTCHA
const siteKey = $(".g-recaptcha").attr("data-sitekey");
if (siteKey) {
const token = await solveCaptcha("userrecaptcha", {
googlekey: siteKey,
pageurl: url,
});
// Re-fetch with token
const formResp = await axios.post(url, { "g-recaptcha-response": token });
return cheerio.load(formResp.data);
}
const price = $('[itemprop="price"]').attr("content") || $(".price").text();
return parseFloat(price.replace(/[^0-9.]/g, ""));
}
Planification
Exécutez des vérifications toutes les 30 minutes avec cron :
# crontab -e
*/30 * * * * cd /opt/monitor && python price_monitor.py >> /var/log/prices.log 2>&1
Ou utilisez la bibliothèque schedule de Python :
import schedule
schedule.every(30).minutes.do(lambda: monitor_prices(products))
while True:
schedule.run_pending()
time.sleep(60)
Estimation des coûts
| Volume | CAPTCHA/Day | Est. Coût quotidien |
|---|---|---|
| 50 produits, toutes les 30 min | ~2 400 | ~2-5$ |
| 200 produits, toutes les 15 min | ~19 200 | ~15-30$ |
| 1000 produits, par heure | ~24 000 | ~20-40$ |
Tous les chargements de pages ne déclenchent pas des CAPTCHA. Les coûts réels peuvent être inférieurs de 50 à 70 %.
FAQ
Comment détecter les changements de prix ?
Comparez les prix actuels aux valeurs stockées. Les alertes sur les changements > 5 % aident à filtrer le bruit des fluctuations mineures.
Vais-je être bloqué même avec la résolution CAPTCHA ?
Faites pivoter les proxys et les agents utilisateurs pour minimiser le blocage. Demandes d'espace au fil du temps au lieu d'une récupération en rafale.
Puis-je surveiller les prix dans plusieurs devises ?
Oui. Analysez le symbole monétaire à côté du prix. CaptchaAI fonctionne globalement quels que soient les paramètres régionaux du site cible.
Guides connexes
- Gérer CAPTCHA dans Web Scraping
- Gratter sans se bloquer
- Collecte de données d’études de marché