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