Selenium 配置带用户名和密码的代理

1,073次阅读
没有评论

共计 4102 个字符,预计需要花费 11 分钟才能阅读完成。

在自动化测试或网页爬取中,经常需要通过代理服务器访问目标网站。Selenium 是一个强大的工具,但配置带用户名和密码的代理需要额外的步骤。本文将详细介绍如何使用 Selenium 和 Java 创建一个 Chrome 代理认证扩展,以实现带用户名和密码的代理配置。我们将提供完整的代码示例和步骤说明,帮助你快速上手。

前置条件

  • Java 开发环境(JDK 8 或以上)
  • Selenium WebDriver(建议最新版本,如 4.x)
  • Chrome 浏览器和对应的 ChromeDriver
  • 代理服务器信息(格式:host:port:username:password)

核心思路

Selenium 本身不支持直接设置带认证的 HTTP 代理。为解决这个问题,我们需要创建一个 Chrome 扩展,通过 manifest.jsonbackground.js 文件配置代理服务器,并处理用户名和密码的认证。然后,通过 Selenium 的 ChromeOptions 加载该扩展,实现代理功能。

实现步骤

1. 创建代理认证扩展

我们需要生成两个文件:manifest.jsonbackground.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.jsonbackground.js 是否正确生成。
  • 性能 :每次运行都会创建新的扩展文件,建议在生产环境中优化目录管理,避免过多临时文件。

总结

通过创建 Chrome 代理认证扩展,我们可以在 Selenium 中轻松配置带用户名和密码的代理。这种方法灵活且可靠,适用于需要代理的自动化测试或爬虫场景。希望本文的代码和步骤能帮助你顺利实现代理配置!

如有疑问,欢迎在评论区留言!

正文完
213
admin
版权声明:本站原创文章,由 admin 于2025-04-21发表,共计4102字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码