如何避免Selenium处理验证码时被网站检测并拦截?
绕过巴西政府SSO登录的自动化检测方案
我写了一个Python脚本,用来登录巴西政府的SSO网站https://sso.acesso.gov.br/login,之前靠2Captcha API自动过验证码一直正常。最近出问题了:哪怕手动输验证码提交,还是报错,而且错误提示和验证码输错的不一样,应该是脚本被网站的反爬检测到了。
但用普通Chrome浏览器手动操作完全没问题,有时候甚至不用验证码,从来没报过错。
以下是我的代码:
from selenium import webdriver from fake_useragent import UserAgent import undetected_chromedriver as uc from fp.fp import FreeProxy user_path = 'C:\\PythonProjects\\User Data' driver_path = 'C:\\PythonProjects\\107\\chromedriver.exe' options = webdriver.ChromeOptions() ## 规避自动化检测的设置 options.add_argument("--start-maximized") options.add_argument('--disable-blink-features=AutomationControlled') ## 用户档案 options.add_argument(f"--user-data-dir={user_path}") ## 用户代理 ua = UserAgent() options.add_argument(f'--user-agent={ua.random}') ## 代理 proxy = FreeProxy().get() options.add_argument(f'--proxy-server={proxy}') ## 初始化浏览器 driver = uc.Chrome( driver_executable_path = driver_path, options = options ) ## 设置设备内存信息 driver.execute_script("Object.defineProperty(navigator, 'deviceMemory', {get: () => 8});") ## 设置navigator.webdriver为undefined driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined});") ## 打开页面 driver.get('https://sso.acesso.gov.br/login') ## 之后我会输入CPF和密码,再用2Captcha处理验证码 ## 我试过只启动浏览器,手动输入信息和验证码,但还是失败
我用https://bot.sannysoft.com/做了自动化特征检测,结果如下:
- Intoli测试结果
- 指纹扫描器(第一部分)
- 指纹扫描器(第二部分)
可行的规避方案
1. 修正undetected_chromedriver的用法
undetected_chromedriver本身就是用来绕过检测的,你的用法存在两处冗余:
- 不要手动指定
driver_executable_path,让库自动匹配对应Chrome版本的驱动,版本不匹配是常见的暴露点 - 加上
use_subprocess=True参数,减少进程层面的特征暴露
修改后的初始化代码:
driver = uc.Chrome( options=options, use_subprocess=True )
2. 删除画蛇添足的手动修改
你手动修改navigator.webdriver和deviceMemory反而会破坏指纹一致性——undetected_chromedriver已经内置了这些伪装,直接删掉这两行代码:
# driver.execute_script("Object.defineProperty(navigator, 'deviceMemory', {get: () => 8});") # driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined});")
3. 替换代理为住宅代理
FreeProxy提供的公开代理基本都被网站拉黑了,建议:
- 使用付费住宅代理(比如BrightData、Oxylabs),模拟真实用户的家庭IP
- 不要每次启动都换代理,保持IP会话稳定,频繁切换IP本身就是异常信号
4. 固定匹配Chrome版本的用户代理
fake_useragent生成的UA可能和当前Chrome版本不匹配,导致指纹冲突:
- 打开Chrome地址栏输入
chrome://version/,复制真实的用户代理字符串,然后固定到代码里:
options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36')
5. 使用真实的Chrome用户档案
确保user_path指向你日常手动登录用的Chrome档案,里面的浏览历史、Cookie、扩展记录会让脚本更像真实用户;不要每次启动都清空档案,保持会话连续性。
6. 模拟真实用户行为轨迹
网站会检测鼠标移动、点击的规整度,自动化操作太机械会被识别:
- 用
selenium-stealth补充更多指纹伪装:
from selenium_stealth import stealth stealth(driver, languages=["pt-BR", "pt"], vendor="Google Inc.", platform="Win32", webgl_vendor="Intel Inc.", renderer="Intel Iris OpenGL Engine", fix_hairline=True, )
- 加入随机延迟,比如输入CPF后等1-2秒再输密码,点击登录按钮前延迟0.5-1秒,模拟用户思考时间:
import random import time time.sleep(random.uniform(1, 2))
7. 用JS代替原生Selenium操作
避免使用driver.find_element()等原生方法,改用JS执行元素操作,减少特征暴露:
# 替代find_element_by_id("cpf").send_keys("你的CPF") driver.execute_script('document.getElementById("cpf").value = "你的CPF"')
内容的提问来源于stack exchange,提问作者Renan
相关产品推荐
相关产品推荐

