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

Python Selenium中Windows认证时URL传递特殊字符密码如何处理?

解决Selenium中Windows认证密码含特殊字符的问题

我之前也踩过这个坑!直接在URL里把@转成%40有时候确实不生效,毕竟浏览器对URL里的认证信息解析有特殊逻辑——当密码里包含@这种原本用来分隔凭据和域名的字符时,浏览器会错误地截断密码,导致认证失败。给你几个亲测有效的Python Selenium解决方案:

1. 推荐方案:用Selenium-Wire注入认证头(跨浏览器兼容)

Selenium-Wire是Selenium的扩展库,能拦截和修改HTTP请求,完美解决这个问题。步骤如下:

首先安装库:

pip install selenium-wire

然后编写代码:

from seleniumwire import webdriver

# 配置认证信息,注意密码里的@要转成%40,其他特殊字符也要URL编码
auth_options = {
    'proxy': {
        'http': 'http://username:password%40123@abc.com',
        'verify_ssl': False,  # 如果目标站点是HTTPS且证书有问题可以开启
    }
}

# 初始化浏览器(Chrome/Firefox都支持)
driver = webdriver.Chrome(seleniumwire_options=auth_options)
# 直接访问目标站点即可,不需要在URL里带凭据
driver.get('http://abc.com')

原理是通过代理的方式让请求自动带上认证信息,避开了浏览器直接解析URL凭据的逻辑,转义后的特殊字符也能正常识别。

2. Chrome专用:修改ChromeOptions的启动参数

如果你不想额外安装库,可以试试这个trick,利用Chrome的代理参数来传递认证:

from selenium import webdriver

options = webdriver.ChromeOptions()
# 把带转义凭据的URL作为代理参数
options.add_argument('--proxy-server=http://username:password%40123@abc.com')

driver = webdriver.Chrome(options=options)
driver.get('http://abc.com')

注意:这个方法对部分新版Chrome可能失效,因为Chrome对代理的安全限制越来越严格,但旧版本或者测试环境下大概率能用。

3. Firefox专用:配置Firefox Profile

Firefox可以通过修改Profile设置来允许带特殊字符的凭据URL:

from selenium import webdriver

profile = webdriver.FirefoxProfile()
# 禁用钓鱼链接检测,允许长凭据URL
profile.set_preference("network.http.phishy-userpass-length", 255)
# 信任目标域名,避免认证被拦截
profile.set_preference("network.automatic-ntlm-auth.trusted-uris", "abc.com")

driver = webdriver.Firefox(firefox_profile=profile)
# 这里直接用转义后的凭据URL访问
driver.get('http://username:password%40123@abc.com')

额外注意事项

  • 除了@,密码里的其他特殊字符(比如&、#、$等)也要做URL编码,比如&转成%26,#转成%23,否则同样会导致解析错误。
  • 如果你使用的是Selenium 4.x版本,DesiredCapabilities的方式已经被逐步弃用,优先选择上面的方案。

内容的提问来源于stack exchange,提问作者Shoaib Akhtar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:41:24