Günde birkaç yüz CAPTCHA çözüyorsanız sıralı işleme fazlasıyla yeterlidir; hacim binlere çıktığında paralel çözüm neredeyse zorunlu hale gelir. Karar aslında tek bir soruya iner: günlük çözüm hacminiz ve gecikme bütçeniz ne kadar? Bu rehber iki yaklaşımı CaptchaAI örnekleriyle karşılaştırır, önce her iki yöntemi kodla gösterir, ardından hangisinin sizin iş yükünüze uyduğunu netleştirir.
Kısa cevap:
- < 500 çözüm/gün: sıralı işleme yeterlidir; ek karmaşıklığa gerek yok.
- > 500 çözüm/gün: paralel çözüme geçin; verim farkı belirgindir.
- Karışık iş akışı: iş akışını sıralı, çözümü paralel yürüten hibrit modeli değerlendirin.
Ayrıntılar ve çalışan kod aşağıda.
Sıralı CAPTCHA çözme
Nasıl çalışır?
Tek seferde tek CAPTCHA: gönderin → bekleyin → sorgulayın → sonucu alın → sonraki.
# 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")
Sıralı çözümün mantıklı olduğu durumlar
- Tek sayfalı iş akışları — Aynı anda tek bir form doldurulduğunda
- Hata ayıklama ve geliştirme — Yürütme akışı net ve izlenebilirdir
- Düşük hacim — < 500 çözüm/gün paralel karmaşıklığı haklı çıkarmaz
- Sıraya bağlı görevler — Çözüm sonuçlarının belirli bir düzende kullanılması gerektiğinde
Paralel CAPTCHA çözme
Nasıl çalışır?
Tüm CAPTCHA'ları aynı anda gönderin, sonuçları eş zamanlı olarak sorgulayın:
# 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")
Buradaki max_concurrent=50 değerinin plan thread sayınızla uyumlu olması kritik önemdedir: thread limitinizin üzerine çıkarsanız API ERROR_NO_SLOT_AVAILABLE döndürmeye başlar.
Node.js ile paralel çözme örneği
// 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();
})();
Eşzamanlılık düzeyine göre verim
| Eşzamanlı çözüm | Tahmini verim/saat | Bellek (Python) | Karmaşıklık |
|---|---|---|---|
| 1 (sıralı) | 240 | 30 MB | Düşük |
| 10 | 2.400 | 50 MB | Düşük |
| 25 | 6.000 | 80 MB | Orta |
| 50 | 10.000+ | 120 MB | Orta |
| 100 | 18.000+ | 200 MB | Yüksek |
reCAPTCHA v2 ve 15 saniyelik medyan çözüm süresi temel alınmıştır.
Verim eşzamanlılıkla doğrusal artmaz: 100 çözümün ötesinde kazanç azalırken bellek maliyeti hızla yükselir. Bu yüzden çoğu üretim kurulumu 50–100 aralığında çalışır.
Hangisini seçmelisiniz: hacim eşiği
Pratik eşik nettir. Günde 500 çözümün altında kalıyorsanız sıralı işleme sadeliğiyle kazandırır — tek bir yürütme akışı, kolay hata ayıklama ve minimum bellek. Bu sınırı aştığınızda paralel çözümün verim farkı bariz hale gelir: aynı iş, tek şeritli bir yolda değil, çok şeritli bir yolda akar.
Örneğin Türkiye'deki bir e-ticaret ekibi, gece çalışan ödeme akışı QA testlerinde yüzlerce reCAPTCHA doğrulamasını dar bir zaman penceresinde tamamlamak zorunda kalır. Burada sıralı işleme pencereyi aşar; paralel çözüm ise aynı yükü dakikalar içinde bitirir.
Eşzamanlılığın üst sınırını planınızdaki thread sayısı belirler:
- BASIC ($15/ay, 5 thread): küçük testler ve tekil form akışları için başlangıç noktası.
- ADVANCE ($90/ay, 50 thread): aynı anda 50 çözüme kadar; orta ölçekli kazıma ve QA işleri.
- PREMIUM ($170/ay, 100 thread): 100 eşzamanlı çözüm; yüksek hacimli üretim yükleri.
Thread bazlı USD fiyatlandırma, TL'deki dalgalanmadan bağımsız olarak aylık maliyeti öngörülebilir tutar — uzun soluklu otomasyon projeleri için gerçek bir avantaj.
Sıralı ve paralel: yan yana karşılaştırma
| Faktör | Sıralı | Paralel |
|---|---|---|
| Verim (reCAPTCHA v2, 15 sn medyan) | ~240/saat | ~10.000+/saat |
| Kod karmaşıklığı | Basit | Orta–karmaşık |
| Hata yönetimi | Doğrudan | Eş zamanlı hata izolasyonu gerektirir |
| Bellek kullanımı | Minimum (~30 MB) | Eşzamanlılıkla ölçeklenir (~100–500 MB) |
| Çözüm başına API maliyeti | Aynı | Aynı |
| Hata ayıklama | Kolay | Zor (yarış koşulları, zamanlama) |
| Sıra koruması | Korunur | Açık takip gerektirir |
| En uygun | < 500 çözüm/gün | > 500 çözüm/gün |
Hibrit yaklaşım: sıralı iş akışı, paralel çözüm
İş akışının kendisini sıralı yürütüp yalnızca CAPTCHA çözümünü paralel bir toplu işleme almak çoğu senaryoda en pratik dengeyi kurar:
# 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
Böylece gönderme sırasını korurken en yavaş adım olan CAPTCHA çözümünü paralelleştirir, toplam süreyi kısaltırsınız.
Sık karşılaşılan sorunlar ve çözümleri
Paralel çözüme geçerken en sık rastlanan tökezleme noktaları ve pratik düzeltmeleri aşağıdadır.
| Sorun | Sebep | Çözüm |
|---|---|---|
| Paralel çözüm beklenenden yavaş | Semafor limiti çok düşük | max_concurrent değerini artırın |
| Paralelde rastgele hatalar | Paylaşılan durumun bozulması | Durumu her coroutine/promise için izole edin |
| Sonuçlar sırasız geliyor | asyncio.gather sırayı korur |
Gerekirse dizin (index) takibi kullanın |
API ERROR_NO_SLOT_AVAILABLE döndürüyor |
Aynı anda çok fazla gönderim | Gönderimler arasına küçük bir gecikme ekleyin |
Sık sorulan sorular
Paralel çözüm sıralıdan daha mı pahalı?
Hayır. CaptchaAI eşzamanlı istek başına değil, thread başına ücret alır ve her thread'de sınırsız çözüm hakkı vardır. Paralel çözümün API maliyeti sıralıyla birebir aynıdır; yalnızca toplam sonuca daha hızlı ulaşırsınız.
Kaç thread'e ihtiyacım var?
İhtiyacınız hedeflediğiniz eşzamanlılığa bağlıdır; kabaca şöyle eşleştirebilirsiniz:
- Aynı anda 50 çözüm → 50 thread (ADVANCE, $90/ay)
- Aynı anda 100 çözüm → 100 thread (PREMIUM, $170/ay)
Kod tarafında max_concurrent değerini plan thread sayınızın üzerine çıkarmak ERROR_NO_SLOT_AVAILABLE hatası üretir.
asyncio yerine ThreadPoolExecutor kullanabilir miyim?
Evet. asyncio + aiohttp en verimli yoldur, ancak mevcut kod tabanınız senkronsa ThreadPoolExecutor ile de benzer verim elde edersiniz. İkisi de aynı in.php / res.php akışını kullanır; fark yalnızca eşzamanlılık modelindedir.
ERROR_NO_SLOT_AVAILABLE hatasını nasıl önlerim?
Bu hata, aynı anda plan thread sayınızdan fazla görev gönderdiğinizde oluşur. max_concurrent değerini thread limitinizle hizalayın ve gönderimler arasına küçük bir gecikme ekleyerek anlık yükü dağıtın.
Düşük hacimde paralele geçmeye değer mi?
Günde 500 çözümün altındaysanız genellikle hayır. Paralel çözümün getirdiği yarış koşulu ve hata ayıklama karmaşıklığı, bu hacimde kazandırdığı süreyi haklı çıkarmaz. Önce sıralı başlayın; darboğaza ulaştığınızda geçiş yapın.
Sonraki adımlar
Stratejinizi hacminize göre seçin ve iki yaklaşımı kendi verilerinizle ölçün — CaptchaAI API anahtarınızı alın.
İlgili rehberler: