Vergleiche

Parallele vs. sequentielle CAPTCHA-Lösung: Leistungskompromisse

Sequentielles Lösen ist einfach. Paralleles Lösen ist schnell. Die richtige Wahl hängt von Ihrem Volumen, Ihrer Infrastruktur und Ihrer Komplexitätstoleranz ab. Dieser Leitfaden vergleicht beide Ansätze mitCaptchaAIund hilft Ihnen bei der Auswahl der richtigen Strategie.

Direkter Vergleich

Faktor Sequentielle Parallel
Durchsatz (reCAPTCHA v2, 15 s Median) ~240/hour ~10.000+/hour
Codekomplexität Einfach Mäßig bis komplex
Fehlerbehandlung Unkompliziert Erfordert gleichzeitige Fehlerisolierung
Speichernutzung Minimal (~30 MB) Skaliert mit Parallelität (~100–500 MB)
API-Kosten pro Lösung Das Gleiche Das Gleiche
Debugging-Schwierigkeit Einfach Schwieriger (Rennbedingungen, Timing)
Auftragserhaltung Garantiert Erfordert explizites Tracking
Am besten für < 500 löst/day > 500 löst/day

Sequentielles Lösen

Wie es funktioniert

Ein CAPTCHA nach dem anderen: absenden → warten → abfragen → Ergebnis abrufen → weiter.

# sequential_solver.py
import os
import time
import requests

API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")

def solve_sequential(tasks):
    """Solve CAPTCHAs one by one."""
    results = []
    session = requests.Session()

    for task in tasks:
        # Submit
        resp = session.get("https://ocr.captchaai.com/in.php", params={
            "key": API_KEY,
            "method": "userrecaptcha",
            "googlekey": task["sitekey"],
            "pageurl": task["pageurl"],
            "json": "1",
        })
        result = resp.json()
        if result.get("status") != 1:
            results.append({"error": result.get("request")})
            continue

        task_id = result["request"]
        time.sleep(15)

        # Poll
        token = None
        for _ in range(25):
            poll = session.get("https://ocr.captchaai.com/res.php", params={
                "key": API_KEY, "action": "get",
                "id": task_id, "json": "1",
            })
            poll_result = poll.json()
            if poll_result.get("status") == 1:
                token = poll_result["request"]
                break
            if poll_result.get("request") != "CAPCHA_NOT_READY":
                break
            time.sleep(5)

        results.append({"token": token} if token else {"error": "timeout"})

    return results

# 10 tasks sequentially → ~150 seconds total
tasks = [{"sitekey": "SITEKEY", "pageurl": "https://example.com"}] * 10
start = time.time()
results = solve_sequential(tasks)
print(f"Completed in {time.time() - start:.0f}s")

Wenn sequenziell Sinn macht

  • Einseitige Arbeitsabläufe – Ausfüllen eines Formulars nach dem anderen
  • Debugging und Entwicklung – Klarer Ausführungsfluss
  • Geringes Volumen – < 500 Lösungen/day rechtfertigt keine parallele Komplexität
  • Reihenfolgeabhängige Aufgaben – Wenn Lösungsergebnisse nacheinander verwendet werden müssen

Paralleles Lösen

Wie es funktioniert

Senden Sie alle CAPTCHAs auf einmal und fragen Sie gleichzeitig nach Ergebnissen:

# parallel_solver.py
import os
import asyncio
import aiohttp

API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")

async def solve_one(session, sitekey, pageurl, semaphore):
    """Solve a single CAPTCHA within concurrency limits."""
    async with semaphore:
        # Submit
        async with session.get("https://ocr.captchaai.com/in.php", params={
            "key": API_KEY, "method": "userrecaptcha",
            "googlekey": sitekey, "pageurl": pageurl, "json": "1",
        }) as resp:
            result = await resp.json(content_type=None)

        if result.get("status") != 1:
            return {"error": result.get("request")}

        task_id = result["request"]
        await asyncio.sleep(15)

        # Poll
        for _ in range(25):
            async with session.get("https://ocr.captchaai.com/res.php", params={
                "key": API_KEY, "action": "get",
                "id": task_id, "json": "1",
            }) as resp:
                poll_result = await resp.json(content_type=None)

            if poll_result.get("status") == 1:
                return {"token": poll_result["request"]}
            if poll_result.get("request") != "CAPCHA_NOT_READY":
                return {"error": poll_result.get("request")}

            await asyncio.sleep(5)

        return {"error": "timeout"}

async def solve_parallel(tasks, max_concurrent=50):
    """Solve CAPTCHAs in parallel with concurrency control."""
    semaphore = asyncio.Semaphore(max_concurrent)
    connector = aiohttp.TCPConnector(limit=max_concurrent)

    async with aiohttp.ClientSession(connector=connector) as session:
        coros = [
            solve_one(session, t["sitekey"], t["pageurl"], semaphore)
            for t in tasks
        ]
        return await asyncio.gather(*coros)

# 10 tasks in parallel → ~20 seconds total
import time
tasks = [{"sitekey": "SITEKEY", "pageurl": "https://example.com"}] * 10
start = time.time()
results = asyncio.run(solve_parallel(tasks))
print(f"Completed in {time.time() - start:.0f}s")

Beispiel für ein paralleles JavaScript

// parallel_solver.js
const axios = require('axios');
const https = require('https');

const API_KEY = process.env.CAPTCHAAI_KEY || 'YOUR_API_KEY';
const agent = new https.Agent({ keepAlive: true, maxSockets: 50 });
const api = axios.create({ baseURL: 'https://ocr.captchaai.com', httpsAgent: agent });

async function solveOne(sitekey, pageurl) {
  const submit = await api.get('/in.php', {
    params: { key: API_KEY, method: 'userrecaptcha', googlekey: sitekey, pageurl, json: '1' },
  });
  if (submit.data.status !== 1) return { error: submit.data.request };

  await new Promise(r => setTimeout(r, 15000));

  for (let i = 0; i < 25; i++) {
    const poll = await api.get('/res.php', {
      params: { key: API_KEY, action: 'get', id: submit.data.request, json: '1' },
    });
    if (poll.data.status === 1) return { token: poll.data.request };
    if (poll.data.request !== 'CAPCHA_NOT_READY') return { error: poll.data.request };
    await new Promise(r => setTimeout(r, 5000));
  }
  return { error: 'timeout' };
}

(async () => {
  const tasks = Array.from({ length: 10 }, () => ({
    sitekey: 'SITEKEY', pageurl: 'https://example.com',
  }));

  const start = Date.now();
  const results = await Promise.all(tasks.map(t => solveOne(t.sitekey, t.pageurl)));
  console.log(`Completed in ${((Date.now() - start) / 1000).toFixed(0)}s`);
  console.log(`Solved: ${results.filter(r => r.token).length}/${tasks.length}`);

  agent.destroy();
})();

Durchsatz nach Parallelitätsebene

Gleichzeitige Lösungen Geschätzter Durchsatz/hour Speicher (Python) Komplexität
1 (sequentiell) 240 30 MB Niedrig
10 2.400 50 MB Niedrig
25 6.000 80 MB Mittel
50 10.000+ 120 MB Mittel
100 18.000+ 200 MB Hoch

Basierend auf reCAPTCHA v2 mit einer mittleren Lösungszeit von 15 Sekunden.

Hybrider Ansatz

Verwenden Sie sequentiell für den Workflow und parallel für die CAPTCHA-Lösung:

# Process 10 URLs sequentially, but solve their CAPTCHAs in a parallel batch
urls = get_next_batch()  # 10 URLs
captcha_params = [extract_sitekey(url) for url in urls]  # Sequential extraction
tokens = asyncio.run(solve_parallel(captcha_params, max_concurrent=10))  # Parallel solving
for url, result in zip(urls, tokens):
    submit_form(url, result.get("token"))  # Sequential submission

Fehlerbehebung

Problem Ursache Lösung
Ergebnis passt nicht zum eigenen Fall Solver-Typ oder Eingabeparameter wurden falsch auf den Zieltyp gemappt Vergleiche Zielseite, Solver-Methode und Pflichtparameter noch einmal systematisch
Beispiel läuft, aber Produktion scheitert Session, Header oder Proxy-Kontext weichen vom Test ab Übertrage erfolgreiche Testbedingungen möglichst unverändert in den Live-Workflow
Fehler bleiben unklar Logs enthalten zu wenig Kontext für eine belastbare Diagnose Protokolliere Solver-Typ, Latenz, Fehlercode und Downstream-Reaktion gemeinsam

Verwandte Leitfäden

  • Batch-CAPTCHA-Lösung mehrerer Aufgaben
  • Python Threadpool CAPTCHA-Parallelität
  • Node.js Promise.allSettled Batch-CAPTCHA
Kommentare sind für diesen Artikel deaktiviert.