Selenium如何通过带用户名和密码的代理进行连接?
解决Firefox + Selenium代理认证失效问题
你的代码为什么无效?
我来拆解下你代码里的几个关键问题:
- 代理类型与认证配置不匹配:你明明配置的是HTTP/SSL代理,但却把用户名和密码放到了
socks_username和socks_password这两个SOCKS代理专属的偏好项里,完全驴唇不对马嘴!对应HTTP代理的认证字段应该是network.proxy.http_username和network.proxy.http_password。 - FirefoxProfile已被弃用:从Selenium 4.x版本开始,官方已经不再推荐用
FirefoxProfile做浏览器配置了,转而使用FirefoxOptions。旧的Profile方式在新版本浏览器和Selenium组合下,很容易出现兼容性问题。 - 安全限制导致明文密码被忽略:现代Firefox为了防止密码泄露,会直接忽略通过偏好设置注入的明文代理密码,就算你字段写对了,浏览器也不会生效。
当前有效实现代理认证的最优方法
方法1:用Selenium 4官方代理API(最推荐)
Selenium 4专门新增了代理配置API,原生支持带认证的代理,不需要手动改浏览器偏好,代码简洁还靠谱:
from selenium import webdriver from selenium.webdriver.common.proxy import Proxy, ProxyType # 配置代理基本信息 proxy = Proxy() proxy.proxy_type = ProxyType.MANUAL proxy.http_proxy = f"{PROXY_HOST}:{PROXY_PORT}" proxy.ssl_proxy = f"{PROXY_HOST}:{PROXY_PORT}" # 设置代理认证信息 proxy.socks_username = USERNAME proxy.socks_password = PASSWORD # 绑定到Firefox配置项 options = webdriver.FirefoxOptions() options.proxy = proxy # 启动浏览器验证 driver = webdriver.Firefox(options=options) driver.get("http://whatismyipaddress.com/")
这个API会自动处理代理认证的注入逻辑,绕过浏览器的安全限制,是目前兼容性最好的方案。
方法2:用浏览器扩展注入认证(特殊场景备选)
如果上述方法不生效(比如用的是旧版Selenium或特殊代理服务),可以做一个极简的Firefox扩展来自动注入认证:
- 新建一个文件夹
proxy_auth_extension,里面创建两个文件:
manifest.json
{ "manifest_version": 2, "name": "Proxy Auth Helper", "version": "1.0", "permissions": ["proxy", "tabs", "storage", "<all_urls>"], "background": { "scripts": ["background.js"] } }
background.js
// 配置代理地址 const proxyConfig = { mode: "fixed_servers", rules: { singleProxy: { scheme: "http", host: "<你的代理主机>", port: parseInt("<你的代理端口>") }, bypassList: ["localhost"] } }; browser.proxy.settings.set({value: proxyConfig, scope: "regular"}, () => {}); // 自动注入认证信息 function handleAuth(details) { return { authCredentials: { username: "<你的代理用户名>", password: "<你的代理密码>" } }; } browser.webRequest.onAuthRequired.addListener( handleAuth, {urls: ["<all_urls>"]}, ["blocking"] );
- 把文件里的占位符替换成你的实际代理信息,然后把文件夹打包成
proxy_auth.zip压缩包。 - 在Selenium中加载这个扩展:
from selenium import webdriver options = webdriver.FirefoxOptions() # 加载代理认证扩展 options.add_extension("proxy_auth.zip") driver = webdriver.Firefox(options=options) driver.get("http://whatismyipaddress.com/")
这种方式借助浏览器扩展的权限绕过明文密码限制,适配性也很强。
内容的提问来源于stack exchange,提问作者yoni keren
相关产品推荐
相关产品推荐

