You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:25:20