aiohttp, Python'da engellenmeyen HTTP isteklerini etkinleştirir. Olay döngünüzü engellemeden aynı anda birden fazla CAPTCHA'yı çözmek için CaptchaAI ile birleştirin.
Gereksinimler
| Gereksinim | Ayrıntılar |
|---|---|
| Python | 3.8+ |
| aiohttp | 3.8+ |
| CaptchaAI API anahtarı | Buradan bir tane alın |
pip install aiohttp
Zaman uyumsuz CaptchaAI İstemcisi
import aiohttp
import asyncio
class AsyncCaptchaAI:
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "https://ocr.captchaai.com"
async def submit(self, session, params):
"""Submit a CAPTCHA task and return the task ID."""
params["key"] = self.api_key
async with session.get(
f"{self.base_url}/in.php", params=params
) as resp:
text = await resp.text()
if not text.startswith("OK|"):
raise Exception(f"Submit failed: {text}")
return text.split("|")[1]
async def poll(self, session, task_id, timeout=300):
"""Poll for the result with a timeout."""
params = {
"key": self.api_key,
"action": "get",
"id": task_id,
}
deadline = asyncio.get_event_loop().time() + timeout
while asyncio.get_event_loop().time() < deadline:
await asyncio.sleep(5)
async with session.get(
f"{self.base_url}/res.php", params=params
) as resp:
text = await resp.text()
if text == "CAPCHA_NOT_READY":
continue
if text.startswith("OK|"):
return text.split("|", 1)[1]
raise Exception(f"Solve failed: {text}")
raise TimeoutError(f"Task {task_id} timed out after {timeout}s")
async def solve(self, session, params, timeout=300):
"""Submit and poll in one call."""
task_id = await self.submit(session, params)
return await self.poll(session, task_id, timeout)
async def get_balance(self, session):
"""Check account balance."""
params = {"key": self.api_key, "action": "getbalance"}
async with session.get(
f"{self.base_url}/res.php", params=params
) as resp:
return float(await resp.text())
Tek Bir CAPTCHA Çözün
import asyncio
import os
async def main():
solver = AsyncCaptchaAI(os.environ["CAPTCHAAI_API_KEY"])
async with aiohttp.ClientSession() as session:
# Check balance
balance = await solver.get_balance(session)
print(f"Balance: ${balance:.2f}")
# Solve reCAPTCHA v2
token = await solver.solve(session, {
"method": "userrecaptcha",
"googlekey": "6Le-wvkS...",
"pageurl": "https://example.com",
})
print(f"Token: {token[:50]}...")
asyncio.run(main())
Birden Fazla CAPTCHA'yı Aynı Anda Çözün
async def solve_batch(urls, site_key):
solver = AsyncCaptchaAI(os.environ["CAPTCHAAI_API_KEY"])
async with aiohttp.ClientSession() as session:
tasks = [
solver.solve(session, {
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": url,
})
for url in urls
]
results = await asyncio.gather(*tasks, return_exceptions=True)
for url, result in zip(urls, results):
if isinstance(result, Exception):
print(f"FAILED {url}: {result}")
else:
print(f"SOLVED {url}: {len(result)} chars")
return results
urls = [
"https://example.com/page1",
"https://example.com/page2",
"https://example.com/page3",
"https://example.com/page4",
"https://example.com/page5",
]
asyncio.run(solve_batch(urls, "6Le-wvkS..."))
CAPTCHA İşleme ile Kazıma
async def scrape_with_captcha(url, site_key):
solver = AsyncCaptchaAI(os.environ["CAPTCHAAI_API_KEY"])
async with aiohttp.ClientSession() as session:
# Fetch the page
async with session.get(url) as resp:
html = await resp.text()
# Check if page has a CAPTCHA
if "g-recaptcha" not in html:
return html # No CAPTCHA, return content
# Solve the CAPTCHA
token = await solver.solve(session, {
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": url,
})
# Submit with solved token
async with session.post(url, data={
"g-recaptcha-response": token,
}) as resp:
return await resp.text()
Hız Kontrolü için Semafor
API'nin aşırı yüklenmesini önlemek için eşzamanlı çözümleri sınırlayın:
async def solve_with_limit(urls, site_key, max_concurrent=10):
solver = AsyncCaptchaAI(os.environ["CAPTCHAAI_API_KEY"])
semaphore = asyncio.Semaphore(max_concurrent)
async def solve_one(session, url):
async with semaphore:
return await solver.solve(session, {
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": url,
})
async with aiohttp.ClientSession() as session:
tasks = [solve_one(session, url) for url in urls]
results = await asyncio.gather(*tasks, return_exceptions=True)
solved = sum(1 for r in results if not isinstance(r, Exception))
print(f"Solved {solved}/{len(urls)} CAPTCHAs")
return results
Turnstile Örneği
async def solve_turnstile(url, sitekey):
solver = AsyncCaptchaAI(os.environ["CAPTCHAAI_API_KEY"])
async with aiohttp.ClientSession() as session:
token = await solver.solve(session, {
"method": "turnstile",
"sitekey": sitekey,
"pageurl": url,
})
return token
Sorun giderme
| Hata | Sebep | Düzeltme |
|---|---|---|
ClientConnectorError |
Ağ sorunu | Bağlantıyı kontrol edin |
Submit failed: ERROR_ZERO_BALANCE |
Fon yok | Hesap yükleme |
TimeoutError |
Yavaş çöz | Zaman aşımı parametresini artırın |
RuntimeError: Event loop is closed |
Jupyter'da asyncio.run'yi kullanma |
nest_asyncio'yi kullanın |
SSS
Neden httpx yerine aiohttp?
aiohttp, Python'daki yüksek eş zamanlı iş yükleri için en iyi performansa sahip en olgun eşzamansız HTTP kitaplığıdır. httpx de çalışır; bkz.httpx entegrasyon kılavuzu.
Kaç tane eş zamanlı çözüm çalıştırabilirim?
CaptchaAI 100'den fazla eşzamanlı isteği yönetir. İhtiyaçlarınıza ve dengenize göre eşzamanlılığınızı kontrol etmek için bir semafor kullanın.
Oturumu birden fazla çözümde yeniden kullanabilir miyim?
Evet, yapmalısın. aiohttp oturumları bağlantı havuzlarını koruyarak sonraki isteklerin daha hızlı yapılmasını sağlar.