La résolution séquentielle est simple. La résolution parallèle est rapide. Le bon choix dépend de votre volume, de votre infrastructure et de votre tolérance à la complexité. Ce guide compare les deux approches avecCaptchaAIet vous aide à choisir la bonne stratégie.
Comparaison face à face
| Facteur | Séquentiel | Parallèle |
|---|---|---|
| Débit (reCAPTCHA v2, médiane de 15 s) | ~240/hour | ~10 000+/hour |
| Complexité du code | Simple | Modéré à complexe |
| Gestion des erreurs | Simple | Nécessite une isolation simultanée des erreurs |
| Utilisation de la mémoire | Minimum (~ 30 Mo) | Échelle avec simultanéité (~ 100 à 500 Mo) |
| Coût de l'API par résolution | Idem | Idem |
| Difficulté de débogage | Facile | Plus dur (conditions de course, timing) |
| Conservation des commandes | Garanti | Nécessite un suivi explicite |
| Idéal pour | < 500 résolutions/day | > 500 solutions/day |
Résolution séquentielle
Comment ça marche
Un CAPTCHA à la fois : soumettez → attendez → sondage → obtenez le résultat → ensuite.
# 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")
Quand le séquentiel a du sens
- Flux de travail sur une seule page – Remplir un formulaire à la fois
- Débogage et développement — Flux d'exécution clair
- Faible volume — < 500 résolutions/day ne justifie pas une complexité parallèle
- Tâches dépendantes de l'ordre — Lorsque les résultats de la résolution doivent être utilisés dans l'ordre
Résolution parallèle
Comment ça marche
Soumettez tous les CAPTCHA en même temps et interrogez les résultats simultanément :
# 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")
Exemple parallèle 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();
})();
Débit par niveau de concurrence
| Résolutions simultanées | Débit estimé/hour | Mémoire (Python) | Complexité |
|---|---|---|---|
| 1 (séquentiel) | 240 | 30 Mo | Faible |
| 10 | 2 400 | 50 Mo | Faible |
| 25 | 6 000 | 80 Mo | Moyen |
| 50 | 10 000+ | 120 Mo | Moyen |
| 100 | 18 000+ | 200 Mo | Élevé |
Basé sur reCAPTCHA v2 avec un temps de résolution médian de 15 s.
Approche hybride
Utilisez séquentiel pour le flux de travail et parallèle pour la résolution de CAPTCHA :
# 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
Dépannage
| Problème | Parce que | Corriger |
|---|---|---|
| Parallèle plus lent que prévu | Sémaphore trop restrictif | Augmenter max_concurrent |
| Pannes aléatoires en parallèle | Corruption étatique partagée | État isolé par coroutine/promise |
| Des résultats dans le désordre | asyncio.gather préserve l'ordre |
Utilisez le suivi d'index si nécessaire |
L'API renvoie ERROR_NO_SLOT_AVAILABLE |
Trop de soumissions simultanées | Ajouter un petit délai entre les soumissions |
FAQ
Puis-je passer du séquentiel au parallèle sans modifier la structure de mon code ?
Oui, si vous extrayez la logique de résolution dans une fonction autonome. Le seul changement consiste à encapsuler les appels dans asyncio.gather (Python) ou Promise.all (JavaScript).
La résolution parallèle coûte-t-elle plus cher ?
Non. CaptchaAI facture par thread (avec résolutions illimitées par thread), pas au-delà par requête simultanée. La résolution parallèle a le même coût d'abonnement que la résolution séquentielle ; vous atteignez simplement le total plus rapidement.
Quelle est la simultanéité pratique maximale ?
La plupart des configurations atteignent des rendements décroissants supérieurs à 100 résolutions simultanées. Au-delà de cela, concentrez-vous sur l’optimisation des paramètres de résolution plutôt que sur l’ajout de concurrence.
Prochaines étapes
Choisissez la stratégie qui correspond à votre volume –récupérez votre clé API CaptchaAI.
Guides associés :
- Résolution parallèle de CAPTCHA
- 10 000 tâches par heure
- Optimisation de la mémoire et du processeur