如何 使用 htmlunit
- 前端开发
- 2025-07-24
- 6
环境搭建与基础配置
-
引入依赖
HtmlUnit的核心库需通过Maven或手动添加JAR包引入,以下是Maven坐标:
<dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit</artifactId> <version>2.60.0</version> <!-最新版本请参考官网 --> </dependency> -
创建WebClient实例
WebClient是HtmlUnit的核心类,负责模拟浏览器行为,基础配置如下:
import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; WebClient client = new WebClient(); client.getOptions().setCssEnabled(false); // 禁用CSS以提高解析速度 client.getOptions().setJavaScriptEnabled(true); // 启用JS支持 -
获取页面内容
通过client.getPage(url)加载页面,返回HtmlPage对象:
HtmlPage page = client.getPage("https://example.com"); String htmlContent = page.asXml(); // 获取HTML源码
| 配置项 | 说明 | 默认值 |
|---|---|---|
| CssEnabled | 是否解析CSS | true |
| JavaScriptEnabled | 是否执行JS | false |
| ThrowExceptionOnScriptError | JS错误时是否抛出异常 | false |
页面交互与数据提取
-
表单提交
通过HtmlForm对象模拟表单提交:
HtmlForm form = page.getFormByName("loginForm"); form.getInputByName("username").setValueAttribute("admin"); form.getInputByName("password").setValueAttribute("123456"); HtmlPage submitPage = form.getInputByValue("Login").click(); -
动态元素处理
对AJAX生成的元素,需启用JS并等待异步加载:
client.waitForBackgroundJavaScript(5000); // 等待5秒执行JS HtmlElement dynamicDiv = page.getElementById("dataContainer");
-
数据抽取
使用XPath或CSS选择器定位元素:
List<HtmlTableRow> rows = page.getByXPath("//table[@id='dataTable']/tbody/tr"); for (HtmlTableRow row : rows) { String cellText = row.getCell(0).asText(); System.out.println(cellText); }
进阶功能与优化
-
Cookie管理
通过CookieManager处理会话:
client.setCookieManager(new CookieManager()); client.getCookieManager().addCookie(new Cookie("sessionId", "abc123")); -
文件下载与上传

- 下载文件:调用HtmlAnchor或HtmlLink的click()方法。
- 上传文件:通过HtmlFileInput设置本地文件路径: HtmlFileInput fileInput = page.getFileInput("fileUpload"); fileInput.setValueAttribute(new File("path/to/localfile").getAbsolutePath());
-
性能优化
- 禁用不必要的功能(如CSS、图片加载)
- 使用WebWindow管理多窗口场景
- 配置超时时间:client.setTimeout(10000);
常见问题与解决方案
FAQs:
Q1:如何处理需要复杂JavaScript验证的页面?
A1:
- 启用JS支持:client.getOptions().setJavaScriptEnabled(true);
- 配置JS引擎:建议使用HtmlUnitBrowserVersionFactory指定浏览器版本(如CHROME)。
- 捕获JS错误:设置client.getOptions().setThrowExceptionOnScriptError(false);避免中断。
Q2:如何设置代理服务器或HTTP请求头?
A2:
- 代理配置: client.getOptions().setProxyConfig(new ProxyConfig("proxy.example.com", 8080));
- 自定义请求头: client.addRequestHeader("User-Agent", "Mozilla/5.0"); client.addRequestHeader("Referer", "https://origin.com");
完整示例代码
import com.gargoylesoftware.htmlunit.; import com.gargoylesoftware.htmlunit.html.; public class HtmlUnitDemo { public static void main(String[] args) throws Exception { // 初始化WebClient WebClient client = new WebClient(); client.getOptions().setCssEnabled(false); client.getOptions().setJavaScriptEnabled(true); // 加载页面 HtmlPage page = client.getPage("https://www.baidu.com"); System.out.println("页面标题:" + page.getTitleText()); // 填写表单 HtmlForm searchForm = page.getFormByName("fm"); HtmlTextInput input = searchForm.getInputByName("wd"); input.setValueAttribute("HtmlUnit教程"); HtmlSubmitButton button = searchForm.getInputByValue("百度一下") instanceof HtmlSubmitButton ? (HtmlSubmitButton) searchForm.getInputByValue("百度一下") : null; HtmlPage resultPage = button.click(); // 提取搜索结果 System.out.println("第一条结果:" + resultPage.getByXPath("//div[@class='result c-container ']/h3/a").asText()); client.close(); } }