HTTPX ist ein moderner Python-HTTP-Client mit asynchroner Unterstützung und HTTP/2.. Diese Anleitung zeigt, wie man es mit CaptchaAI sowohl für die synchrone als auch für die asynchrone CAPTCHA-Lösung verwendet.
Anforderungen
| Anforderung | Einzelheiten |
|---|---|
| Python | 3,8+ |
| httpx | 0,24+ |
| CaptchaAI API-Schlüssel | Holen Sie sich hier eins |
pip install httpx
Synchroner Client
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()
Asynchroner Client
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())
HTTP/2-Unterstützung
HTTPX unterstützt HTTP/2 und reduziert so den Verbindungsaufwand:
pip install httpx[http2]
client = httpx.AsyncClient(http2=True, timeout=30)
HTTP/2 multiplext Anfragen über eine einzelne Verbindung und verbessert so die Leistung beim Senden und Abfragen mehrerer CAPTCHAs.
Scraping-Beispiel mit CAPTCHA-Handhabung
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())
Vergleich: httpx vs. Anfragen vs. aiohttp
| Funktion | httpx (synchronisiert) | httpx (asynchron) | Anfragen | aiohttp |
|---|---|---|---|---|
| Async-Unterstützung | ⏳ | „… | ⏳ | „… |
| HTTP/2 | „… | „… | ⏳ | ⏳ |
| Verbindungspooling | „… | „… | „… | „… |
| API-Kompatibilität | anforderungsartig | anforderungsartig | – | Anders |
| Am besten für | Drop-in-Ersatz | Moderner asynchroner Code | Schnelle Skripte | Hohe Parallelität |
FAQ
Sollte ich httpx anstelle von Anfragen verwenden?
Für neue Projekte, ja. httpx verfügt über eine mit Anfragen kompatible API sowie Async- und HTTP/2-Unterstützung. Für vorhandenen Code, der Anfragen verwendet, ist die Migration unkompliziert.
Ist httpx schneller als aiohttp?
aiohttp hat für rein asynchrone Arbeitslasten einen etwas geringeren Overhead. httpx ist schneller für HTTP/2-Verbindungen und bequemer für gemischten sync/async-Code.
Kann ich httpx mit Scrapy verwenden?
Nicht direkt – Scrapy nutzt die Ereignisschleife von Twisted. Verwenden Sie httpx in eigenständigen Skripten oder mit Asyncio-basierten Frameworks wie FastAPI.
Verwandte Leitfäden
- aiohttp + CaptchaAI Asynchron
- Axios + CaptchaAI (Kein Browser)
- Captcha Scraping Python-Anleitung
Diskussionen (0)
Beteiligen Sie sich an der Unterhaltung
Melden Sie sich an, um Ihre Meinung zu teilen.
AnmeldenNoch keine Kommentare.