Beim ersten Laden der Seite sind nicht alle CAPTCHAs vorhanden. Viele Websites rendern CAPTCHAs langsam – nach einem Klick auf eine Schaltfläche, einem Formularfokus, einem Bildlauf oder einem Timer. Wenn Ihre Automatisierung die Seitenquelle sofort erfasst, ist das CAPTCHA noch nicht vorhanden. In dieser Anleitung erfahren Sie, wie Sie dynamisch geladene CAPTCHAs erkennen und darauf warten.
Häufige Lazy-Loading-Auslöser
| Auslöser | Beispiel | So aktivieren Sie |
|---|---|---|
| Klicken Sie auf die Schaltfläche | „Senden“ fügt reCAPTCHA zum Formular hinzu | Klicken Sie zuerst auf die Schaltfläche |
| Formfokus | CAPTCHA erscheint, wenn die Eingabe fokussiert ist | Fokussieren Sie das Feld email/password |
| Scrollposition | CAPTCHA wird geladen, wenn der Abschnitt sichtbar ist | Scrollen Sie zum Formular |
| Timer | CAPTCHA wird nach 3 Sekunden geladen | Warten Sie auf die Verzögerung |
| JavaScript-Bedingung | CAPTCHA wird nach AJAX-Antwort geladen | Lösen Sie die Voraussetzungsanforderung aus |
Methode 1: MutationObserver
Beobachten Sie, wie im DOM for CAPTCHA-Elemente hinzugefügt werden:
Puppenspieler
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://example.com/login');
// Set up MutationObserver before triggering the CAPTCHA
const captchaInfo = await page.evaluate(() => {
return new Promise((resolve) => {
// Check if already present
const existing = document.querySelector('.g-recaptcha, .cf-turnstile, .h-captcha');
if (existing) {
resolve({
type: existing.className,
sitekey: existing.getAttribute('data-sitekey'),
});
return;
}
// Watch for new elements
const observer = new MutationObserver((mutations) => {
for (const mutation of mutations) {
for (const node of mutation.addedNodes) {
if (node.nodeType !== 1) continue;
const captcha = node.matches?.('.g-recaptcha, .cf-turnstile, .h-captcha')
? node
: node.querySelector?.('.g-recaptcha, .cf-turnstile, .h-captcha');
if (captcha) {
observer.disconnect();
resolve({
type: captcha.className,
sitekey: captcha.getAttribute('data-sitekey'),
});
return;
}
}
}
});
observer.observe(document.body, { childList: true, subtree: true });
// Timeout after 30 seconds
setTimeout(() => {
observer.disconnect();
resolve(null);
}, 30000);
});
});
console.log('Detected CAPTCHA:', captchaInfo);
Auslösen der Ladung
// Click the submit button to trigger CAPTCHA
await page.click('#submit-btn');
// Or focus the input
await page.focus('#email');
// Or scroll to the form
await page.evaluate(() => {
document.querySelector('#signup-form').scrollIntoView();
});
Methode 2: Warten Sie auf die Skriptinjektion
CAPTCHAs erfordern ihre JavaScript-Bibliothek. Achten Sie darauf:
// Wait for reCAPTCHA script to load
await page.waitForFunction(() => {
return typeof window.grecaptcha !== 'undefined'
&& typeof window.grecaptcha.render === 'function';
}, { timeout: 30000 });
// Now extract parameters
const sitekey = await page.evaluate(() => {
const el = document.querySelector('.g-recaptcha');
return el?.getAttribute('data-sitekey');
});
Für Drehkreuz
await page.waitForFunction(() => {
return typeof window.turnstile !== 'undefined';
}, { timeout: 30000 });
const sitekey = await page.evaluate(() => {
const el = document.querySelector('.cf-turnstile');
return el?.getAttribute('data-sitekey');
});
Methode 3: Renderaufrufe abfangen
Vor dem Rendern in die CAPTCHA-Bibliothek einbinden:
// Inject before page scripts run
await page.evaluateOnNewDocument(() => {
window.__captchaDetected = null;
// Hook grecaptcha.render
let _grecaptcha;
Object.defineProperty(window, 'grecaptcha', {
set(val) {
_grecaptcha = val;
const origRender = val.render;
val.render = function(container, params) {
window.__captchaDetected = {
type: 'recaptcha',
sitekey: params.sitekey,
callback: params.callback?.name,
container: typeof container === 'string' ? container : container.id,
};
return origRender.apply(this, arguments);
};
},
get() { return _grecaptcha; },
});
});
await page.goto('https://example.com/signup');
// Trigger the CAPTCHA (click, scroll, etc.)
await page.click('#show-form');
// Wait for detection
await page.waitForFunction(() => window.__captchaDetected !== null, {
timeout: 30000,
});
const detected = await page.evaluate(() => window.__captchaDetected);
console.log('Detected:', detected);
// { type: 'recaptcha', sitekey: '6Le-wvkS...', callback: 'onCaptcha', container: 'recaptcha-box' }
Python (Selenium): Warten auf faule CAPTCHAs
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://example.com/login")
# Trigger the CAPTCHA loading
submit = driver.find_element(By.ID, "submit-btn")
submit.click()
# Wait for CAPTCHA to appear
try:
captcha_el = WebDriverWait(driver, 30).until(
EC.presence_of_element_located((
By.CSS_SELECTOR,
".g-recaptcha, .cf-turnstile, .h-captcha"
))
)
sitekey = captcha_el.get_attribute("data-sitekey")
captcha_class = captcha_el.get_attribute("class")
if "g-recaptcha" in captcha_class:
captcha_type = "recaptcha"
elif "cf-turnstile" in captcha_class:
captcha_type = "turnstile"
else:
captcha_type = "hcaptcha"
print(f"Type: {captcha_type}, Sitekey: {sitekey}")
except Exception:
print("No CAPTCHA appeared within 30 seconds")
Warten auf Iframe (reCAPTCHA)
# reCAPTCHA loads an iframe even when the div exists but the script is still loading
WebDriverWait(driver, 30).until(
EC.presence_of_element_located((
By.CSS_SELECTOR,
"iframe[src*='recaptcha'], iframe[src*='challenges.cloudflare.com']"
))
)
print("CAPTCHA iframe loaded")
Vollständige Erkennung + Lösungsfluss
import requests
import time
def detect_and_solve(driver, api_key, trigger_action=None):
"""Detect a lazy-loaded CAPTCHA, solve it, and inject the token."""
# 1. Trigger the CAPTCHA
if trigger_action:
trigger_action(driver)
# 2. Wait for it to appear
captcha_el = WebDriverWait(driver, 30).until(
EC.presence_of_element_located((
By.CSS_SELECTOR,
".g-recaptcha, .cf-turnstile, .h-captcha"
))
)
sitekey = captcha_el.get_attribute("data-sitekey")
page_url = driver.current_url
captcha_class = captcha_el.get_attribute("class")
# 3. Determine type and method
if "g-recaptcha" in captcha_class:
method, key_param, token_field = "userrecaptcha", "googlekey", "g-recaptcha-response"
elif "cf-turnstile" in captcha_class:
method, key_param, token_field = "turnstile", "sitekey", "cf-turnstile-response"
else:
method, key_param, token_field = "hcaptcha", "sitekey", "h-captcha-response"
# 4. Mit CaptchaAI lösen
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": api_key, "method": method,
key_param: sitekey, "pageurl": page_url, "json": "1",
}).json()
task_id = resp["request"]
for _ in range(24):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": api_key, "action": "get", "id": task_id, "json": "1"
}).json()
if result["status"] == 1:
token = result["request"]
break
# 5. Inject
driver.execute_script(f"""
const el = document.querySelector('textarea[name="{token_field}"], input[name="{token_field}"]');
if (el) el.value = arguments[0];
""", token)
return token
Fehlerbehebung
| Problem | Ursache | Lösung |
|---|---|---|
| CAPTCHA erscheint nie | Falsche Triggeraktion | Überprüfen Sie die Seite, um herauszufinden, was das CAPTCHA auslöst |
| Sitekey ist null | Element existiert, aber das Skript wurde nicht ausgeführt | Warten Sie auf den CAPTCHA-Iframe, nicht nur auf das Div |
| Der Beobachter übersieht es | CAPTCHA war bereits da | Überprüfen Sie, ob Elemente vorhanden sind, bevor Sie den Beobachter einrichten |
| Auszeit | CAPTCHA wird nur für echte Benutzer geladen | Verwenden Sie einen vollwertigen Browser mit realistischem Browser-Signalprofil |
FAQ
Wie erkenne ich, ob ein CAPTCHA lazy-loaded ist?
Zeigen Sie die Seitenquelle an (Strg+U). Wenn das CAPTCHA-Div oder -Skript nicht vorhanden ist, aber angezeigt wird, wenn Sie mit der Seite interagieren, wird es verzögert geladen.
Funktioniert das mit Headless-Browsern?
Ja, mit Vorbehalten. Einige Websites laden CAPTCHAs nur für nicht-headless-Browser. Verwenden Sie headless: 'new' in Puppeteer oder aktivieren Sie --disable-blink-features=AutomationControlled.
Lösen Sie alle CAPTCHAs mit CaptchaAI
Holen Sie sich Ihren API-Schlüssel unter captchaai.com.
Verwandte Leitfäden
- CAPTCHA-Parameter mit Browser-DevTools extrahieren
- Umgang mit mehreren CAPTCHAs auf einer einzelnen Seite
- Extrahieren von reCAPTCHA-Parametern