Anwendungsfälle

E-Commerce-Preisüberwachung mit CAPTCHA-Verwaltung

E-Commerce-Websites schützen Produktseiten mit CAPTCHAs, um automatisiertes Price Scraping zu verhindern. Mit CaptchaAI können Sie zuverlässige Preisüberwachungssysteme aufbauen, die diese Herausforderungen automatisch bewältigen.

Das Problem

Preisüberwachungs-Bots sind auf den wichtigsten Plattformen mit CAPTCHAs konfrontiert:

Plattform CAPTCHA-Typ Auslöser
Amazon Bild-CAPTCHA, reCAPTCHA Hohes Anfragevolumen
Walmart Cloudflare Turnstile Bot-Erkennung
eBay reCAPTCHA v2 Verdächtige Muster
Bester Kauf Cloudflare Challenge Der gesamte automatisierte Verkehr
Shopify-Shops reCAPTCHA v3 Variiert je nach Shop-Konfiguration

Ohne CAPTCHA-Behandlung fällt Ihre Überwachungspipeline stillschweigend aus und es entstehen Preislücken in Ihren Daten.

Architektur

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

Umsetzung

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

Node.js-Implementierung

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, ""));
}

Terminplanung

Führen Sie alle 30 Minuten Überprüfungen mit cron durch:

# crontab -e
*/30 * * * * cd /opt/monitor && python price_monitor.py >> /var/log/prices.log 2>&1

Oder verwenden Sie die schedule-Bibliothek von Python:

import schedule

schedule.every(30).minutes.do(lambda: monitor_prices(products))

while True:
    schedule.run_pending()
    time.sleep(60)

Kostenvoranschlag

Lautstärke CAPTCHAs/Day Schätzung: Tägliche Kosten
50 Produkte, alle 30 Min ~2.400 ~2-5 $
200 Produkte, alle 15 Min ~19.200 ~15–30 $
1000 Produkte pro Stunde ~24.000 ~20-40 $

Nicht alle Seitenladevorgänge lösen CAPTCHAs aus. Die tatsächlichen Kosten können 50–70 % niedriger sein.

FAQ

Wie erkenne ich Preisänderungen?

Vergleichen Sie aktuelle Preise mit gespeicherten Werten. Durch die Benachrichtigung bei Änderungen >5 % können Störungen aus geringfügigen Schwankungen herausgefiltert werden.

Werde ich trotz CAPTCHA-Lösung blockiert?

Rotieren Sie Proxys und User-Agents, um Blockierungen zu minimieren. Platzanforderungen im Laufe der Zeit statt Burst-Fetching.

Kann ich Preise in mehreren Währungen überwachen?

Ja. Analysieren Sie das Währungssymbol zusammen mit dem Preis. CaptchaAI funktioniert global, unabhängig vom Gebietsschema der Zielsite.

Verwandte Leitfäden

Kommentare sind für diesen Artikel deaktiviert.