为什么使用?

目标网站有非常严格的反自动化检测:即使经过伪装,也可能被封禁

由于服务器明显在检测“是否为用户主动点击”,而 Java 原生网络库无法模拟 sec-fetch-user: ?1 这类行为,最可靠的方式是使用 Selenium 浏览器自动化。

AI大模型时代写这篇文章的作用是因为有些坑是大模型并不知道的,或者之前喂给大模型的学习参数中,本身就是有问题的。

配置

maven导入

<!-- Selenium Java -->
            <dependency>
                <groupId>org.seleniumhq.selenium</groupId>
                <artifactId>selenium-java</artifactId>
                <version>4.20.0</version>
            </dependency>

            <!-- WebDriver Manager(自动管理 ChromeDriver) -->
            <dependency>
                <groupId>io.github.bonigarcia</groupId>
                <artifactId>webdrivermanager</artifactId>
                <version>5.6.3</version>
            </dependency>
        <!-- ✅ 添加 Apache HttpClient 5(关键!) -->
        <dependency>
            <groupId>org.apache.httpcomponents.client5</groupId>
            <artifactId>httpclient5</artifactId>
            <version>5.2.1</version>
        </dependency>

查看Chrome浏览器版本,并下载对应的ChromeDriver

驱动下载

示例代码

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;

public class MapDataDownloader {

    private WebDriver driver;
    private WebDriverWait wait;

    // 配置ChromeDriver路径和下载目录
    private static final String CHROME_DRIVER_PATH = "D:\\develop\\chrome\\chromedriver.exe"; 

    public MapDataDownloader() {
        initDriver();
    }

    private void initDriver() {
        System.setProperty("webdriver.chrome.driver", CHROME_DRIVER_PATH);
        ChromeOptions options = new ChromeOptions();
        // 设置下载参数
        Map<String, Object> prefs = new HashMap<>();
//        prefs.put("download.default_directory", downloadDir);  设置了报错,直接使用浏览器默认的下载地址即可
        prefs.put("download.prompt_for_download", false);
        prefs.put("download.directory_upgrade", true);
        prefs.put("safebrowsing.enabled", false);
        prefs.put("profile.default_content_settings.popups", 0); // 禁用弹出窗口
        prefs.put("profile.content_settings.exceptions.automatic_downloads.*.setting", 1); // 允许自动下载
        options.setExperimentalOption("prefs", prefs);
        options.addArguments("--remote-allow-origins=*");

        driver = new ChromeDriver(options);
        wait = new WebDriverWait(driver, Duration.ofSeconds(30));
    }

    /**
     * 对中文地址进行URL编码
     */
    private String encodeAddress(String address) {
        try {
            return URLEncoder.encode(address, StandardCharsets.UTF_8.toString())
                    .replaceAll("\\+", "%20"); // 将+号替换为%20
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return address;
        }
    }

    /**
     * 构建URL
     */
    private String buildDownloadUrl(String address) {
        String encodedAddress = encodeAddress(address);
        return "https://xxx.xxxxxx.com/downloadVector/" + encodedAddress + "?format=gson";
    }

    /**
     * 构建URL
     */
    private String buildDownloadUrl2(String address) {
        String encodedAddress = encodeAddress(address);
        return "https://xxx.xxxxxx.com/getCunAddress?address=" + encodedAddress;
    }

    /**
     * 构建下载URL
     */
    private String buildDownloadUrl3(String address) {
        String encodedAddress = encodeAddress(address);
        return "https://xxx.xxxxxx.com/vectordata/" + encodedAddress + ".gson";
    }

    /**
     * 方法1:使用Selenium直接访问下载链接(推荐)
     */
    public void downloadFileWithSelenium(String address) {
        try {
            String downloadUrl = buildDownloadUrl(address);
            System.out.println("正在下载: " + address);
            System.out.println("下载URL: " + downloadUrl);
            String s = buildDownloadUrl2(address);
            driver.get(s);
            Thread.sleep(2000);
            String s1 = buildDownloadUrl3(address);
            driver.get(s1);
            Thread.sleep(3000);
            System.out.println("下载完成: " + address);
        } catch (Exception e) {
            System.err.println("下载失败: " + address);
            e.printStackTrace();
        }
    }

    /**
     * 批量下载文件
     */
    public void batchDownload(String[] addresses, boolean useHttpMethod) throws InterruptedException {
        System.out.println("开始批量下载,文件数量: " + addresses.length);
        int successCount = 0;
        int failCount = 0;
        // 先访问首页,建立上下文(重要!)
        driver.get("https://xxx.xxxxxx.com");
        // 等待下载开始
        Thread.sleep(10000);
        for (int i = 0; i < addresses.length; i++) {
            String address = addresses[i];
            System.out.println("\n进度: " + (i + 1) + "/" + addresses.length);
            try {
                downloadFileWithSelenium(address);
                successCount++;
            } catch (Exception e) {
                System.err.println("下载失败: " + address);
                failCount++;
            }
        }
        System.out.println("\n下载完成!成功: " + successCount + ",失败: " + failCount);
    }

    /**
     * 关闭浏览器
     */
    public void close() {
        if (driver != null) {
            driver.quit();
        }
    }

    public static void main(String[] args) {
        // 您的地址数组
        String[] addresses = {
                "山东省xx市xx区田xxx区渔xxxxx委员会",
                "山东省xx市xx区田xxx区文xxxxx委员会"
                };

        // 创建下载器实例
        MapDataDownloader downloader = new MapDataDownloader();
        try {
            // 或者使用Selenium方法下载
            downloader.batchDownload(addresses, false);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            downloader.close();
        }
    }
}

更多推荐