Selenium使用带账号密码的Socks5代理验证失败求助
Selenium使用带账号密码的Socks5代理验证失败求助
嗨,我太懂你这种碰壁的感觉了——用Selenium配置带账号密码的Socks5代理时,直接靠Proxy类设置用户名密码往往不生效,这其实是因为ChromeDriver对这种方式的支持一直不太完善。我给你两个可行的解决方案,你可以试试看:
方案一:通过Chrome偏好设置配置代理(简单快捷)
你可以直接在ChromeOptions里设置Chrome的偏好参数,把代理的地址、账号密码都一次性传入。代码示例如下:
System.setProperty("webdriver.chrome.driver", "chromedriver.exe"); String proxyAddress = "207.244.217.165:6712"; String proxyUser = "xcvbdfbedf"; String proxyPass = "xcvbdfbedf"; ChromeOptions options = new ChromeOptions(); // 指定Socks5代理服务器地址 options.addArguments("--proxy-server=socks5://" + proxyAddress); // 设置代理认证的偏好参数 Map<String, Object> prefs = new HashMap<>(); prefs.put("proxy.socks_username", proxyUser); prefs.put("proxy.socks_password", proxyPass); options.setExperimentalOption("prefs", prefs); WebDriver driver = new ChromeDriver(options); driver.get("https://2ip.ru/");
⚠️ 注意:这种方法在部分新版本的Chrome中可能会失效,因为Chrome的偏好设置规则偶尔会更新。如果这个方法不管用,就试试下面更稳定的方案。
方案二:用Chrome扩展处理代理认证(兼容性拉满)
如果偏好设置的方法不好使,咱们可以搞个简单的Chrome扩展来自动处理代理认证,这种方法几乎适配所有Chrome版本。步骤如下:
- 先创建两个文件:
- manifest.json(扩展配置文件):
{ "version": "1.0.0", "manifest_version": 3, "name": "Proxy Auth Helper", "permissions": ["proxy", "tabs", "webRequest", "webRequestAuthProvider"], "host_permissions": ["<all_urls>"], "background": { "service_worker": "background.js" } } - background.js(代理逻辑处理文件):
// 配置Socks5代理信息 const proxyConfig = { mode: "fixed_servers", rules: { singleProxy: { scheme: "socks5", host: "207.244.217.165", port: 6712 } } }; // 设置代理 chrome.proxy.settings.set({value: proxyConfig, scope: "regular"}, () => {}); // 自动处理代理认证 chrome.webRequest.onAuthRequired.addListener( (details, callback) => { callback({ authCredentials: { username: "xcvbdfbedf", password: "xcvbdfbedf" } }); }, {urls: ["<all_urls>"]}, ["blocking"] );
- manifest.json(扩展配置文件):
- 把这两个文件打包成ZIP压缩包(注意直接把文件放进根目录,不要套文件夹)。
- 在Selenium代码里加载这个扩展:
System.setProperty("webdriver.chrome.driver", "chromedriver.exe"); ChromeOptions options = new ChromeOptions(); // 替换成你刚才打包的ZIP文件路径 options.addExtensions(new File("proxy-auth-extension.zip")); WebDriver driver = new ChromeDriver(options); driver.get("https://2ip.ru/");
为啥你的原代码不行?
你原来用的Proxy.setSocksUsername和setSocksPassword方法,ChromeDriver其实并没有把这些参数正确传递给Chrome浏览器,导致代理的认证信息根本没生效,自然就连接失败啦。
备注:内容来源于stack exchange,提问作者Mine Cheater
相关产品推荐
相关产品推荐

