一、前言
在 Web 爬虫技术中,Selenium 作为一款强大的浏览器自动化工具,能够模拟真实用户操作,有效应对 JavaScript 渲染、Ajax 加载等复杂场景。而集成代理服务则能够解决 IP 限制、地域访问限制等问题。本文将详细介绍如何利用 Java+Selenium+ 代理服务实现高效的爬虫系统。
二、Selenium 简介
Selenium 是一个用于 Web 应用程序自动化测试的工具集,它主要用于自动化浏览器操作,可以模拟用户与网页的交互行为,如点击按钮、填写表单、滚动页面等。在爬虫领域,Selenium 特别适合处理那些需要 JavaScript 渲染、需要登录或有反爬措施的网站。
三、环境准备
- JDK1.8
- Maven 项目管理
- 相关依赖
<!-- Selenium --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency><dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.3.2</version></dependency>
四、代码实现
本系统采用的是工厂模式创建 WebDriver 实例,这样做的好处主要是可以提供统一的创建方法,不管使用那种浏览器都适用,自由配置。其次就是维护方便,浏览器配置变更只需修改工厂类中的相关方法,扩展性也不错,可以轻松添加新的浏览器支持,比如 Opera 或者 Safari 等等。
4.1 创建 WebDriver 工厂类
import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
org.openqa.selenium.chrome.ChromeOptions;
org.openqa.selenium.edge.EdgeDriver;
org.openqa.selenium.edge.EdgeOptions;
org.openqa.selenium.firefox.FirefoxDriver;
org.openqa.selenium.firefox.FirefoxOptions;
org.openqa.selenium.remote.CapabilityType;
org.openqa.selenium.remote.PageLoadStrategy;
org.slf4j.Logger;
org.slf4j.LoggerFactory;
java.util.ArrayList;
java.util.HashMap;
java.util.List;
java.util.Map;
java.util.concurrent.TimeUnit;
{
LoggerFactory.getLogger(WebDriverFactory.class);
;
;
;
;
;
String proxyHost;
proxyPort;
String proxyUsername;
String proxyPassword;
{ CHROME, EDGE, FIREFOX }
WebDriverFactory {
.headless = headless;
;
}
WebDriverFactory {
.pageLoadTimeoutSeconds = seconds;
;
}
WebDriverFactory {
.scriptTimeoutSeconds = seconds;
;
}
WebDriverFactory {
.implicitWaitSeconds = seconds;
;
}
WebDriverFactory {
.proxyEnabled = ;
.proxyHost = host;
.proxyPort = port;
;
}
WebDriverFactory {
.proxyUsername = username;
.proxyPassword = password;
;
}
WebDriver {
(browserType) {
CHROME: createChromeDriver();
EDGE: createEdgeDriver();
FIREFOX: createFirefoxDriver();
:
log.info();
createEdgeDriver();
}
}
WebDriver {
WebDriverManager.edgedriver().setup();
();
Map<String,Object> edgePrefs = <>();
edgePrefs.put(, );
List<String> args = getCommonBrowserArgs();
Map<String,Object> edgeOptions = <>();
edgeOptions.put(, args);
options.setCapability(,);
options.setPageLoadStrategy(PageLoadStrategy.NORMAL);
options.setCapability(, );
options.setCapability(, edgeOptions);
options.setCapability(, );
configureProxy(options);
(options);
configureTimeouts(driver);
log.info();
driver;
}
WebDriver {
WebDriverManager.chromedriver().setup();
();
(headless) {
options.addArguments();
}
(String arg : getCommonBrowserArgs()) {
options.addArguments(arg);
}
options.setPageLoadStrategy(PageLoadStrategy.NORMAL);
configureProxyForChrome(options);
(options);
configureTimeouts(driver);
log.info();
driver;
}
WebDriver {
WebDriverManager.firefoxdriver().setup();
();
(headless) {
options.addArguments();
}
configureProxy(options);
(options);
configureTimeouts(driver);
log.info();
driver;
}
List<String> {
List<String> args = <>();
(headless) {
args.add();
args.add();
}
args.add();
args.add();
args.add();
args.add();
args.add();
args.add();
args.add();
args.add();
args.add();
args.add();
args.add();
args.add();
args.add();
args.add();
args.add();
args.add();
args.add();
args.add();
args.add();
args.add();
args;
}
{
(proxyEnabled && proxyHost != && !proxyHost.isEmpty() && proxyPort > ) {
{
String proxyUrl;
(proxyUsername != && !proxyUsername.isEmpty() && proxyPassword != ) {
proxyUrl = + proxyUsername + + proxyPassword + + proxyHost + + proxyPort;
} {
proxyUrl = + proxyHost + + proxyPort;
}
();
proxy.setHttpProxy(proxyUrl);
proxy.setSslProxy(proxyUrl);
(options EdgeOptions) {
((EdgeOptions) options).setCapability(CapabilityType.PROXY, proxy);
} (options FirefoxOptions) {
((FirefoxOptions) options).setCapability(CapabilityType.PROXY, proxy);
}
log.info(, proxyHost, proxyPort);
} (Exception e) {
log.error(, e.getMessage());
}
}
}
{
(proxyEnabled && proxyHost != && !proxyHost.isEmpty() && proxyPort > ) {
{
String proxyUrl;
(proxyUsername != && !proxyUsername.isEmpty() && proxyPassword != ) {
proxyUrl = + proxyUsername + + proxyPassword + + proxyHost + + proxyPort;
} {
proxyUrl = + proxyHost + + proxyPort;
}
();
proxy.setHttpProxy(proxyUrl);
proxy.setSslProxy(proxyUrl);
options.setCapability(CapabilityType.PROXY, proxy);
log.info(, proxyHost, proxyPort);
} (Exception e) {
log.error(, e.getMessage());
}
}
}
{
driver.manage().timeouts().pageLoadTimeout(pageLoadTimeoutSeconds, TimeUnit.SECONDS);
driver.manage().timeouts().setScriptTimeout(scriptTimeoutSeconds, TimeUnit.SECONDS);
driver.manage().timeouts().implicitlyWait(implicitWaitSeconds, TimeUnit.SECONDS);
log.debug(, pageLoadTimeoutSeconds, scriptTimeoutSeconds, implicitWaitSeconds);
}
}


