使用SeleniumBase绕过Ingatlan网站Cloudflare Turnstile时陷入循环的问题
解决Ingatlan网站Cloudflare Turnstile验证循环问题
问题代码
from seleniumbase import Driver import time driver = Driver(uc=True) url = "https://ingatlan.com/35386626" driver.uc_open_with_reconnect(url, 4) time.sleep(15) driver.uc_gui_click_captcha() time.sleep(60)
问题描述
使用上述代码绕过Ingatlan网站的Cloudflare Turnstile验证时,脚本陷入循环:点击复选框后验证会重新加载,但同一会话中手动操作可正常完成验证。
解决方案
1. 替换固定等待为显式等待,精准控制操作时机
固定time.sleep()无法适配Cloudflare验证的动态加载节奏,过早或过晚操作都会触发二次验证。改用SeleniumBase的显式等待,确保元素就绪后再执行操作:
from seleniumbase import Driver from seleniumbase.common.exceptions import NoSuchElementException driver = Driver(uc=True) url = "https://ingatlan.com/35386626" driver.uc_open_with_reconnect(url, 4) try: # 等待Turnstile验证iframe加载完成 driver.wait_for_element_present('iframe[title="Widget containing a Cloudflare security challenge"]', timeout=20) # 切换到验证iframe driver.switch_to.frame(driver.find_element('iframe[title="Widget containing a Cloudflare security challenge"]')) # 等待复选框可点击后再点击 driver.wait_for_element_clickable('input[type="checkbox"]', timeout=10) driver.click('input[type="checkbox"]') # 切回主文档,等待验证完成(验证iframe消失) driver.switch_to.default_content() driver.wait_for_element_not_present('iframe[title="Widget containing a Cloudflare security challenge"]', timeout=30) except NoSuchElementException: print("验证元素未找到,可能已自动通过验证") driver.quit()
2. 优化浏览器启动参数,贴近真实用户环境
自动化浏览器的指纹特征容易被Cloudflare识别,添加更贴近真实浏览器的配置:
driver = Driver( uc=True, incognito=False, # 和手动操作保持一致的会话模式 headless=False, # 手动操作是可视化模式,避免无头模式触发检测 agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" )
3. 调整页面加载逻辑,避免重复触发验证
uc_open_with_reconnect的多次重连可能导致验证反复触发,尝试改用普通加载配合专用iframe切换方法:
driver.get(url) # 等待Turnstile验证iframe出现 driver.wait_for_element_present('iframe[src*="challenges.cloudflare.com/turnstile"]', timeout=15) # 用SeleniumBase专用方法切换到验证iframe driver.uc_switch_to_frame('iframe[src*="challenges.cloudflare.com/turnstile"]') driver.uc_gui_click_captcha() # 切回主文档,等待页面加载完成 driver.switch_to.default_content() driver.wait_for_page_to_load(timeout=30)
核心原因
脚本的固定等待时间与验证实际加载节奏不匹配,或自动化浏览器的指纹特征与手动操作差异过大,导致Cloudflare判定为自动化行为,重新触发验证。
内容的提问来源于stack exchange,提问作者Aman Emmanuel
相关产品推荐
相关产品推荐

