HTTPX est un client HTTP Python moderne avec prise en charge asynchrone et HTTP/2.. Ce guide montre comment l'utiliser avec CaptchaAI pour la résolution de CAPTCHA synchronisée et asynchrone.
Exigences
| Exigence | Détails |
|---|---|
| Python | 3,8+ |
| httpx | 0,24+ |
| Clé API CaptchaAI | Obtenez-en un ici |
pip install httpx
Client synchrone
import httpx
import time
import os
class CaptchaAISync:
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "https://ocr.captchaai.com"
self.client = httpx.Client(timeout=30)
def solve(self, params, timeout=300):
params["key"] = self.api_key
# Submit
resp = self.client.get(f"{self.base_url}/in.php", params=params)
text = resp.text
if not text.startswith("OK|"):
raise Exception(f"Submit failed: {text}")
task_id = text.split("|")[1]
# Poll
deadline = time.time() + timeout
poll_params = {"key": self.api_key, "action": "get", "id": task_id}
while time.time() < deadline:
time.sleep(5)
result = self.client.get(
f"{self.base_url}/res.php", params=poll_params
)
if result.text == "CAPCHA_NOT_READY":
continue
if result.text.startswith("OK|"):
return result.text.split("|", 1)[1]
raise Exception(f"Solve failed: {result.text}")
raise TimeoutError(f"Task {task_id} timed out")
def get_balance(self):
resp = self.client.get(f"{self.base_url}/res.php", params={
"key": self.api_key, "action": "getbalance"
})
return float(resp.text)
def close(self):
self.client.close()
# Usage
solver = CaptchaAISync(os.environ["CAPTCHAAI_API_KEY"])
token = solver.solve({
"method": "userrecaptcha",
"googlekey": "6Le-wvkS...",
"pageurl": "https://example.com",
})
print(f"Token: {token[:50]}...")
solver.close()
Client asynchrone
import httpx
import asyncio
import os
class CaptchaAIAsync:
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "https://ocr.captchaai.com"
self.client = httpx.AsyncClient(timeout=30)
async def solve(self, params, timeout=300):
params["key"] = self.api_key
# Submit
resp = await self.client.get(
f"{self.base_url}/in.php", params=params
)
text = resp.text
if not text.startswith("OK|"):
raise Exception(f"Submit failed: {text}")
task_id = text.split("|")[1]
# Poll
deadline = asyncio.get_event_loop().time() + timeout
poll_params = {"key": self.api_key, "action": "get", "id": task_id}
while asyncio.get_event_loop().time() < deadline:
await asyncio.sleep(5)
result = await self.client.get(
f"{self.base_url}/res.php", params=poll_params
)
if result.text == "CAPCHA_NOT_READY":
continue
if result.text.startswith("OK|"):
return result.text.split("|", 1)[1]
raise Exception(f"Solve failed: {result.text}")
raise TimeoutError(f"Task {task_id} timed out")
async def get_balance(self):
resp = await self.client.get(f"{self.base_url}/res.php", params={
"key": self.api_key, "action": "getbalance"
})
return float(resp.text)
async def close(self):
await self.client.aclose()
# Usage
async def main():
solver = CaptchaAIAsync(os.environ["CAPTCHAAI_API_KEY"])
# Solve multiple concurrently
tasks = [
solver.solve({
"method": "userrecaptcha",
"googlekey": "6Le-wvkS...",
"pageurl": f"https://example.com/page{i}",
})
for i in range(5)
]
results = await asyncio.gather(*tasks, return_exceptions=True)
for i, r in enumerate(results):
if isinstance(r, Exception):
print(f"Page {i}: FAILED - {r}")
else:
print(f"Page {i}: solved ({len(r)} chars)")
await solver.close()
asyncio.run(main())
Prise en charge de HTTP/2
HTTPX prend en charge HTTP/2, réduisant ainsi la surcharge de connexion :
pip install httpx[http2]
client = httpx.AsyncClient(http2=True, timeout=30)
HTTP/2 multiplexe les requêtes sur une seule connexion, améliorant ainsi les performances lors de la soumission et de l'interrogation de plusieurs CAPTCHA.
Exemple de scraping avec gestion CAPTCHA
import httpx
import re
import os
async def scrape_with_captcha(url, solver):
async with httpx.AsyncClient() as client:
# Fetch page
resp = await client.get(url)
html = resp.text
# Check for reCAPTCHA
match = re.search(
r'data-sitekey=["\']([A-Za-z0-9_-]+)["\']', html
)
if not match:
return html
site_key = match.group(1)
token = await solver.solve({
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": url,
})
# Submit form with token
resp = await client.post(url, data={
"g-recaptcha-response": token,
})
return resp.text
async def main():
solver = CaptchaAIAsync(os.environ["CAPTCHAAI_API_KEY"])
content = await scrape_with_captcha("https://example.com", solver)
print(f"Got {len(content)} chars")
await solver.close()
asyncio.run(main())
Comparaison : httpx vs requêtes vs aiohttp
| Caractéristique | httpx (synchronisation) | httpx (asynchrone) | demandes | aiohttp |
|---|---|---|---|---|
| Prise en charge asynchrone | ⏳ | ✅ | ⏳ | ✅ |
| HTTP/2 | ✅ | ✅ | ⏳ | ⏳ |
| Regroupement de connexions | ✅ | ✅ | ✅ | ✅ |
| Compatibilité API | semblable à des demandes | semblable à des demandes | - | Différent |
| Idéal pour | Remplacement immédiat | Code asynchrone moderne | Scripts rapides | Haute concurrence |
FAQ
Dois-je utiliser httpx sur les requêtes ?
Pour les nouveaux projets, oui. httpx dispose d'une API compatible avec les requêtes ainsi que d'un support async et HTTP/2. Pour le code existant utilisant des requêtes, la migration est simple.
httpx est-il plus rapide que aiohttp ?
aiohttp a une surcharge légèrement inférieure pour les charges de travail asynchrones pures. httpx est plus rapide pour les connexions HTTP/2 et plus pratique pour le code mixte sync/async.
Puis-je utiliser httpx avec Scrapy ?
Pas directement - Scrapy utilise la boucle d'événements de Twisted. Utilisez httpx dans des scripts autonomes ou avec des frameworks asyncio comme FastAPI.
Guides connexes
- aiohttp + CaptchaAI Asynchrone
- Axios + CaptchaAI (pas de navigateur)
- Guide Python pour le grattage de captcha