Comparisons

Résolution de CAPTCHA parallèle ou séquentielle : compromis en matière de performances

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 :

Les commentaires sont désactivés pour cet article.