如何在C#的ChromeDriver中配置带认证的代理用于网页抓取?
解决C# Selenium ChromeDriver代理认证的ERR_NO_SUPPORTED_PROXIES错误
Chrome已不再支持直接在代理URL中嵌入用户名密码(http://user:pass@host:port),这是你遇到该错误的核心原因。下面提供两种可靠的解决方案:
方法一:使用Chrome扩展处理代理认证
这种方法兼容性强,适用于大多数场景:
创建代理认证扩展
新建两个文件,打包成zip:manifest.json:{ "version": "1.0.0", "manifest_version": 3, "name": "Proxy Auth", "permissions": ["proxy", "webRequest", "webRequestAuthProvider"], "background": { "service_worker": "background.js" }, "host_permissions": ["<all_urls>"] }background.js:chrome.webRequest.onAuthRequired.addListener( (details, callback) => { callback({ authCredentials: { username: "你的代理用户名", password: "你的代理密码" } }); }, {urls: ["<all_urls>"]}, ["blocking"] );
修改C#代码
- 调整Proxy对象,仅设置代理地址(移除认证信息):
Proxy proxy = new Proxy(); proxy.Kind = ProxyKind.Manual; proxy.IsAutoDetect = false; proxy.HttpProxy = $"{proxyHost}:{proxyPort}"; proxy.SslProxy = $"{proxyHost}:{proxyPort}"; - 在ChromeOptions中添加扩展:
// 替换为你的扩展zip文件路径 options.AddExtension(@"C:\path\to\proxy-auth-extension.zip");
- 调整Proxy对象,仅设置代理地址(移除认证信息):
方法二:通过DevTools协议注入认证信息
无需扩展,直接利用Chrome DevTools传递认证:
调整Proxy设置
和方法一相同,仅设置代理地址,不要嵌入用户名密码。在导航前注入认证
创建driver后,执行DevTools命令:using OpenQA.Selenium.DevTools; using OpenQA.Selenium.DevTools.V117.Network; // 版本需匹配你的Chrome版本 // ... 创建driver的代码 ... var devTools = driver as IDevTools; var session = devTools.CreateDevToolsSession(); await session.Network.Enable(new EnableCommandSettings()); // 设置全局代理认证 await session.Network.SetAuthCredentials(new SetAuthCredentialsCommandSettings { Origin = "*", Credentials = new AuthCredentials { Username = proxyUsername, Password = proxyPassword } }); // 之后再执行导航操作 driver.Navigate().GoToUrl("http://ident.me");
额外排查要点
- 确认代理端口是HTTP/HTTPS类型,而非SOCKS端口。
- 先使用普通ChromeDriver测试,排除UndetectedChromeDriver的配置干扰。
- 移除不必要的参数(如
ignore-certificate-errors),避免代理逻辑冲突。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

