Java使用selenium + ChromeDriver 爬取内容并下载文件
·
为什么使用?
目标网站有非常严格的反自动化检测:即使经过伪装,也可能被封禁
由于服务器明显在检测“是否为用户主动点击”,而 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();
}
}
}
更多推荐


所有评论(0)