Selenium automatisiert Browserinteraktionen, aber CAPTCHAs verhindern dies. Die API von CaptchaAI löst CAPTCHAs extern, während Selenium den Browser verwaltet – Sie extrahieren die CAPTCHA-Parameter, senden sie an die API und fügen das zurückgegebene Token ein.
Anforderungen
| Anforderung | Einzelheiten |
|---|---|
| Python 3.7+ | Mit installiertem Pip |
| Selen | pip install selenium |
| Chrome + ChromeDriver | Passende Versionen |
| Anfragen | pip install requests |
| CaptchaAI API-Schlüssel | Auscaptchaai.com |
Wie es funktioniert
- Selenium lädt die Zielseite
- Ihr Skript extrahiert den CAPTCHA-Site-Schlüssel aus dem Seiten-DOM
- CaptchaAI löst das CAPTCHA mithilfe des Site-Schlüssels und der Seiten-URL
- Ihr Skript fügt das Token in die Seite ein und sendet das Formular ab
Das CAPTCHA wird serverseitig von CaptchaAI gelöst – Selenium interagiert nie direkt mit dem CAPTCHA-Widget.
Schritt 1: Selenium einrichten
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
driver = webdriver.Chrome(options=options)
Das AutomationControlled-Flag hilft, die grundlegende Bot-Erkennung zu vermeiden. Für eine robustere Konfiguration fügen Sie Folgendes hinzu:
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
Schritt 2: Erstellen Sie den CAPTCHA-Solver
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_recaptcha_v2(site_key, page_url):
"""Solve reCAPTCHA v2 using CaptchaAI API."""
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url
})
if not resp.text.startswith("OK|"):
raise Exception(f"Submit failed: {resp.text}")
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id
})
if result.text == "CAPCHA_NOT_READY":
continue
if result.text.startswith("OK|"):
return result.text.split("|")[1]
raise Exception(f"Solve failed: {result.text}")
raise TimeoutError("CAPTCHA solve timed out")
Schritt 3: Site-Schlüssel extrahieren und lösen
# Navigate to the target page
driver.get("https://example.com/login")
# Wait for the reCAPTCHA to load
wait = WebDriverWait(driver, 10)
recaptcha = wait.until(
EC.presence_of_element_located((By.CLASS_NAME, "g-recaptcha"))
)
# Extract the site key
site_key = recaptcha.get_attribute("data-sitekey")
page_url = driver.current_url
print(f"Site key: {site_key}")
print(f"Page URL: {page_url}")
# Solve the CAPTCHA
token = solve_recaptcha_v2(site_key, page_url)
print(f"Token received: {token[:50]}...")
Schritt 4: Injizieren Sie das Token und senden Sie es ab
# Inject the token into the reCAPTCHA response field
driver.execute_script(f"""
document.getElementById('g-recaptcha-response').innerHTML = '{token}';
document.getElementById('g-recaptcha-response').style.display = '';
""")
# If the form uses a callback function, trigger it
driver.execute_script(f"""
if (typeof ___grecaptcha_cfg !== 'undefined') {{
Object.keys(___grecaptcha_cfg.clients).forEach(function(key) {{
var client = ___grecaptcha_cfg.clients[key];
if (client.callback) client.callback('{token}');
}});
}}
""")
# Submit the form
driver.find_element(By.CSS_SELECTOR, "form").submit()
# Wait for navigation
wait.until(EC.url_changes(page_url))
print(f"Success! Now on: {driver.current_url}")
Vollständiges Arbeitsbeispiel
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_recaptcha_v2(site_key, page_url):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url
})
if not resp.text.startswith("OK|"):
raise Exception(f"Submit failed: {resp.text}")
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id
})
if result.text == "CAPCHA_NOT_READY":
continue
if result.text.startswith("OK|"):
return result.text.split("|")[1]
raise Exception(f"Solve failed: {result.text}")
raise TimeoutError("Timed out")
def main():
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
try:
driver.get("https://example.com/login")
wait = WebDriverWait(driver, 10)
# Extract site key
recaptcha = wait.until(
EC.presence_of_element_located((By.CLASS_NAME, "g-recaptcha"))
)
site_key = recaptcha.get_attribute("data-sitekey")
# Solve
token = solve_recaptcha_v2(site_key, driver.current_url)
# Inject and submit
driver.execute_script(
f"document.getElementById('g-recaptcha-response').innerHTML = '{token}';"
)
driver.find_element(By.CSS_SELECTOR, "form").submit()
wait.until(EC.url_changes(driver.current_url))
print("Login successful!")
finally:
driver.quit()
if __name__ == "__main__":
main()
Umgang mit verschiedenen CAPTCHA-Typen
reCAPTCHA v3
def solve_recaptcha_v3(site_key, page_url, action="verify"):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url,
"version": "v3",
"action": action
})
task_id = resp.text.split("|")[1]
# ... same polling logic
Cloudflare Turnstile
def solve_turnstile(site_key, page_url):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "turnstile",
"sitekey": site_key,
"pageurl": page_url
})
task_id = resp.text.split("|")[1]
# ... same polling logic
Fehlerbehebung
| Problem | Ursache | Lösung |
|---|---|---|
| Token abgelehnt | Das Token ist vor der Übermittlung abgelaufen | Injizieren und innerhalb von 120 Sekunden abschicken |
| Site-Schlüssel nicht gefunden | CAPTCHA wird dynamisch geladen | Fügen Sie WebDriverWait mit längerem Timeout hinzu |
NoSuchElementException |
Falscher Selektor | Überprüfen Sie die Seite, um das richtige Element zu finden |
| Nicht übereinstimmende ChromeDriver-Version | Chrome aktualisiert | Laden Sie die passende ChromeDriver-Version herunter |
| Bot-Erkennung trotz korrektem Token | Anti-Bot über CAPTCHA hinaus | Browser-Flags prüfen und Undetected-Chrome-Treiber verwenden |
FAQ
Kann ich Selenium mit CaptchaAI im Headless-Modus ausführen?
Ja. CaptchaAI löst CAPTCHAs serverseitig – der Browser muss nur die Seite laden, um den Site-Schlüssel zu extrahieren. Der Headless-Modus funktioniert einwandfrei.
Muss ich das CAPTCHA-Kontrollkästchen anklicken?
Nein. CaptchaAI gibt ein Token zurück, das Sie direkt in das Formular einfügen. Es ist keine visuelle Interaktion mit dem CAPTCHA-Widget erforderlich.
Was ist mit reCAPTCHA mit Rückrufen?
Einige Websites verwenden JavaScript-Rückrufe anstelle der Formularübermittlung. Verwenden Sie driver.execute_script(), um den Rückruf mit dem gelösten Token auszulösen. SehenSo lösen Sie den reCAPTCHA v2-Rückruf.
Verwandte Leitfäden
- So bewältigen Sie CAPTCHA-Herausforderungen in Web-Scraping-Workflows
- Puppeteer-CAPTCHA-Lösung mit Node.js
- Playwright CAPTCHA-Handhabung