上一篇
如何 使用 htmlunit
- 前端开发
- 2025-07-24
- 4
使用HTMLUnit需先配置Java环境,添加依赖,创建WebClient实例,设置JS支持,调用getPage获取页面,解析DOM或执行脚本
环境搭建与基础配置
-
引入依赖
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(); } }