共计 4102 个字符,预计需要花费 11 分钟才能阅读完成。
在自动化测试或网页爬取中,经常需要通过代理服务器访问目标网站。Selenium 是一个强大的工具,但配置带用户名和密码的代理需要额外的步骤。本文将详细介绍如何使用 Selenium 和 Java 创建一个 Chrome 代理认证扩展,以实现带用户名和密码的代理配置。我们将提供完整的代码示例和步骤说明,帮助你快速上手。
前置条件
- Java 开发环境(JDK 8 或以上)
- Selenium WebDriver(建议最新版本,如 4.x)
- Chrome 浏览器和对应的 ChromeDriver
- 代理服务器信息(格式:host:port:username:password)
核心思路
Selenium 本身不支持直接设置带认证的 HTTP 代理。为解决这个问题,我们需要创建一个 Chrome 扩展,通过 manifest.json
和 background.js
文件配置代理服务器,并处理用户名和密码的认证。然后,通过 Selenium 的 ChromeOptions
加载该扩展,实现代理功能。
实现步骤
1. 创建代理认证扩展
我们需要生成两个文件:manifest.json
和 background.js
,并将它们保存在指定目录中。以下是核心代码,用于创建代理认证扩展:
/**
* 创建 Chrome 代理认证扩展
* @param proxyHost 代理主机地址
* @param proxyPort 代理端口
* @param proxyUsername 代理用户名
* @param proxyPassword 代理密码
* @param savePath 扩展文件保存路径
* @return 扩展文件夹路径
*/
private static String createProxyAuthExtension(String proxyHost, int proxyPort, String proxyUsername, String proxyPassword, String savePath) {
// manifest.json 文件内容
String manifestJson = "{\n" +
"\"version\": \"1.0.0\",\n" +
"\"manifest_version\": 2,\n" +
"\"name\": \"Chrome Proxy\",\n" +
"\"permissions\": [\n" +
"\"proxy\",\n" +
"\"tabs\",\n" +
"\"unlimitedStorage\",\n" +
"\"storage\",\n" +
"\"\",\n" +
"\"webRequest\",\n" +
"\"webRequestBlocking\"\n" +
"],\n" +
"\"background\": {\n" +
"\"scripts\": [\"background.js\"]\n" +
"},\n" +
"\"minimum_chrome_version\":\"22.0.0\"\n" +
"}";
// background.js 文件内容
String backgroundJs = "var config = {\n" +
"mode: \"fixed_servers\",\n" +
"rules: {\n" +
"singleProxy: {\n" +
"scheme: \"" + (proxyUsername != null ? "http" : "https") + "\",\n"+" host: \""+ proxyHost +"\",\n" +
"port: parseInt(" + proxyPort + ")\n" +
"},\n" +
"bypassList: [\"foobar.com\"]\n" +
"}\n" +
"};\n" +
"chrome.proxy.settings.set({value: config, scope: \"regular\"}, function() {});\n" +
"function callbackFn(details) {\n" +
"return {\n" +
"authCredentials: {\n" +
"username: \"" + proxyUsername + "\",\n"+" password: \""+ proxyPassword +"\"\n" +
"}\n" +
"};\n" +
"}\n" +
"chrome.webRequest.onAuthRequired.addListener(\n" +
"callbackFn,\n" +
"{urls: [\"\"]},\n" +
"['blocking']\n" +
");";
try {
// 创建扩展保存目录
File directory = new File(savePath);
if (!directory.exists()) {directory.mkdirs();
}
// 写入 manifest.json 文件
try (FileWriter manifestWriter = new FileWriter(new File(directory, "manifest.json"))) {manifestWriter.write(manifestJson);
}
// 写入 background.js 文件
try (FileWriter backgroundWriter = new FileWriter(new File(directory, "background.js"))) {backgroundWriter.write(backgroundJs);
}
} catch (IOException e) {e.printStackTrace();
}
return savePath;
}
这个方法会:
- 生成
manifest.json
,定义扩展的权限和背景脚本。 - 生成
background.js
,设置代理服务器并处理认证请求。 - 将文件保存到指定目录(
savePath
)。
2. 配置 Selenium 和 ChromeOptions
以下是完整的代码,展示如何解析代理字符串、创建扩展并启动浏览器:
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class ProxySetup {public static void start(String proxy) {
// 解析代理字符串
String[] split = proxy.split(":");
if (split.length != 4) {System.out.println("代理格式错误,应为 host:port:username:password");
return;
}
String proxyHost = split[0];
int proxyPort = Integer.parseInt(split[1]);
String proxyUsername = split[2];
String proxyPassword = split[3];
// 创建代理扩展文件夹
String proxyPath = System.getProperty("user.dir") + "\\proxy_extension";
File proxyFolder = new File(proxyPath);
if (!proxyFolder.exists()) {proxyFolder.mkdirs();
}
// 创建代理认证扩展
String pluginPath = createProxyAuthExtension(proxyHost, proxyPort, proxyUsername, proxyPassword, proxyPath);
// 配置 Chrome 选项
ChromeOptions options = new ChromeOptions();
options.addArguments("--load-extension=" + pluginPath);
// 可选:避免自动化检测
options.addArguments("--disable-blink-features=AutomationControlled");
// 设置 ChromeDriver 路径
System.setProperty("webdriver.chrome.driver", "path/to/chromedriver.exe");
// 启动浏览器
ChromeDriver driver = new ChromeDriver(options);
driver.get("https://example.com"); // 替换为你的目标 URL
// 注意:测试完成后可关闭浏览器
// driver.quit();}
// 插入上面定义的 createProxyAuthExtension 方法
// ... (代码同上)
}
3. 使用方法
调用 start
方法并传入代理字符串。例如:
public static void main(String[] args) {
String proxy = "127.0.0.1:8085:username:password";
ProxySetup.start(proxy);
}
注意事项
- ChromeDriver 路径 :确保
webdriver.chrome.driver
指向正确的 ChromeDriver 文件,且版本与 Chrome 浏览器兼容。 - 代理格式 :代理字符串必须为
host:port:username:password
格式,否则会抛出错误。 - 扩展目录 :代理扩展会保存在
user.dir/proxy_extension
目录,确保有写入权限。 - 调试 :如果代理配置失败,可以检查
proxy_extension
目录中的manifest.json
和background.js
是否正确生成。 - 性能 :每次运行都会创建新的扩展文件,建议在生产环境中优化目录管理,避免过多临时文件。
总结
通过创建 Chrome 代理认证扩展,我们可以在 Selenium 中轻松配置带用户名和密码的代理。这种方法灵活且可靠,适用于需要代理的自动化测试或爬虫场景。希望本文的代码和步骤能帮助你顺利实现代理配置!
如有疑问,欢迎在评论区留言!
正文完