HtmlUnit:自动化操作web页面的java工具

news/2024/11/18 3:43:20/文章来源:https://www.cnblogs.com/imliuyu/p/18374846

java有httpclient等工具,可以模拟进行一些web操作,但一些逻辑是在前端js中执行的,此时httpclient就比较困难了。

此时可以考虑使用HtmlUnit,模拟出一个浏览器,全程在浏览器中操作。

 

本文以 在百度中输入搜索关键字->点击“百度一下” 按钮->打印搜索结果 这一过程为例,演示HtmlUnit的使用

 

首先,我们要把上面的过程再代码化一点,F12打开开发者工具,检查发现输入框的id是kw,查询按钮的id是su。

而点击查询后,查询结果是写在这样的div里:

<div  data-tools="{'title': &quot;xxx技术博客_51CTO博客&quot;,'url': xxx;}" aria-hidden="true"></div>

 

因此,上述过程可以描述为

1、打开百度首页

2、查找id为kw的元素,写入查询关键字

3、查找id为su的元素,点击它

4、在页面中查找div标签并打印data-tools属性。

 

依照此过程,我们就开始写代码了:

引入maven依赖

        <dependency><groupId>net.sourceforge.htmlunit</groupId><artifactId>htmlunit</artifactId><version>2.60.0</version></dependency>

按流程写代码

package org.example;import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
import com.gargoylesoftware.htmlunit.util.Cookie;
import org.apache.commons.lang3.StringUtils;import java.util.LinkedList;
import java.util.List;
import java.util.Set;public class Main {public static void main(String[] args) {// 创建一个模拟 Chrome 浏览器的 WebClient 实例final WebClient webClient = new WebClient(BrowserVersion.CHROME);// 配置 WebClientwebClient.getOptions().setThrowExceptionOnScriptError(false);//当JS执行出错的时候是否抛出异常, 这里选择不需要webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//当HTTP的状态非200时是否抛出异常, 这里选择不需要webClient.getOptions().setActiveXNative(false);webClient.getOptions().setCssEnabled(false);//是否启用CSS, 因为不需要展现页面, 所以不需要启用webClient.getOptions().setJavaScriptEnabled(true); //很重要,启用JSwebClient.setAjaxController(new NicelyResynchronizingAjaxController());//很重要,设置支持AJAXHtmlPage page = null;try {// 访问百度主页page = webClient.getPage("https://www.baidu.com/");// 找到搜索输入框HtmlTextInput textField;do {textField = (HtmlTextInput) page.getElementById("kw");if (null != textField) {break;}// 未找到说明页面还没加载完,继续等待页面加载完成webClient.waitForBackgroundJavaScript(1000);} while (true);// 输入查询文本textField.setValueAttribute("HtmlUnit自动测试");// 找到提交按钮并点击HtmlSubmitInput button = (HtmlSubmitInput) page.getElementById("su");page = button.click();//解析页面结果 这里如果百度的页面改了,需要做相应的调整List<String> res = new LinkedList<>();do {// 等待异步 JS 执行完成webClient.waitForBackgroundJavaScript(1000);// 提取结果页面中的<div data-tools="{'title': xxx">元素,也就是百度的检索结果关键元素for (DomElement div : page.getElementsByTagName("div")) {String text = div.getAttribute("data-tools");if (StringUtils.isNotBlank(text)) {res.add(text);}}} while (res.isEmpty());//res非空说明解析到结果了for (String s : res) {System.out.println(s);}System.out.println("--------------------------------------------------");// 获取并打印 cookiesSet<Cookie> cookies = webClient.getCookieManager().getCookies();System.out.println("Cookies:");for (Cookie cookie : cookies) {System.out.println("Name: " + cookie.getName() + ", Value: " + cookie.getValue());}} catch (Exception e) {e.printStackTrace();} finally {webClient.close();}}}

运行得到结果。

 

最后提醒,本文只是以此为例介绍HtmlUnit的使用,请读者在应用中注意遵纪守法,各网站基本都有反爬虫机制,爬虫写得好,牢饭吃到饱。HtmlUnit更应该用到页面自动化测试等场景,而不是打擦边球去写爬虫。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/785622.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx代理服务

Nginx****代理服务代理区别 区别在于代理的对象不⼀样 正向代理代理的对象是客户端 反向代理代理的对象是服务端 2.Nginx****负载均衡2.2Nginx****负载均衡状态配置 backup max_conns 测试 backup 以及 down 状态 当⼀个后端服务器被标记为 backup 时,它将仅作为备⽤服务器使⽤…

声音克隆GPT-SoVITS 2.0软件和详细的使用教程!

天命人,请允许我先蹭个热点! 原始声音: 播放 克隆声音: 播放 文章写了一半,被《黑神话悟空》刷屏了。突发奇想,用里面的声音来做个素材试试看。B站捞了一点声音素材,随便剪一剪,训练一把过,没有调优,就直接拿来用了。情绪还差点意思,音色克隆的还不错。 下面进入正…

手机轰炸机 短信轰炸 可匣 二90二1243交流

使用 fiddler 抓包 获取到了 100+个 发送短信验证的接口 使用自己手机试了一下 速度非常快。因为是同时迸发,所以导致手机短信量一瞬间到了100+ 但是会导致一个问题,就是无感知情况 于是调整接口请求方式,设置异步请求,间隔3s钟,这次以后会达到一个比较好的效果 没办法上传…

元宇宙虚拟展厅_元宇宙线上展馆制作成本有哪些?

在元宇宙中制作虚拟展厅的成本可能因多种因素而有很大差异,包括复杂程度、定制、大小、平台以及所提供的支持和服务水平,企业在决定是否在元宇宙中制作虚拟展厅时应仔细考虑自身需求和预算,并应寻找经验丰富的开发公司和具有成功合作的平台,以确保获得最佳结果.目前,3DCAT已…

利用两个IO口检测6个按键

利用两个IO口检测6个按键用两个IO口扫描6个按键,原理图与扫描程序。 先贴上原理图:以下为思路: 将两个IO口配置为上拉输出(STM32中)或者初始化输出高电平、 1、首先:IO1,IO2输出高电平。 S1按下,电流方向由R1流向GND,此时IO1为低电平。S2按下,电流方向由R2流向GND,此…

织梦dedecms上传服务器后数据连接失败怎么办

当织梦DeDeCMS上传到服务器后出现数据连接失败的问题时,可以采取以下几个步骤来解决这个问题: 1. 检查数据库连接信息打开common.inc.php文件:在织梦CMS的 data 文件夹中找到 common.inc.php 文件。 修改数据库连接信息:数据库服务器地址:确认数据库服务器地址是否正确,例…

织梦DEDECMS怎么实现鼠标移到标题显示完整的title

在织梦DeDeCMS中,实现鼠标移到标题时显示完整的title可以通过修改模板文件中的标签来完成。下面是一种简单的方法来实现这一功能:步骤 1: 找到需要修改的模板文件 打开您需要修改的模板文件,通常这些文件位于 templets 文件夹中。 寻找包含文章标题的地方,例如在列表页模板…

帝国cms如何隐藏前台信息数据

帝国CMS隐藏前台信息数据的方法 隐藏数据库信息在 e/config/config.php 中找到 AllowShowData 参数并将其设置为 false。 登录后台,在 系统管理 → 系统配置 中,选择 栏目 选项卡,将 显示记录数 和 显示栏目索引 设置为 0。隐藏后台登录页面在 e/config/config.php 中找到 a…

织梦dedecms简单吗

织梦DeDeCMS是一款简单且实用的开源网站管理系统,它非常适合个人站长、中小企业和学校等用户使用。以下是织梦DeDeCMS的一些特点,说明它的简单性: 简单安装一键安装:织梦CMS提供了一键安装功能,只需要按照提示完成几步即可快速安装。 无需专业知识:安装过程简单直观,不需…

RocketMQ 的 NameServer 架构解析

RocketMQ的逻辑部署图NameServer核心架构图NamesServer 提供的功能有:Topic 路由信息的管理:NameServer 负责存储和维护 Topic 的路由信息。 Producer 和 Consumer 可以从 NameServer 获取到当前有效的 Broker 的地址和相应的 Topic 分布情况。 每个 Broker 在启动时会向所有…

Springboot实战——黑马点评之缓存

Springboot黑马点评——缓存 1 缓存初识与简单实现1.1 根据商铺id的缓存查询 基础缓存实现:考虑到有数据会同时存在于数据库和缓存中,所以: Q:数据库和缓存的数据一致性问题? A:三种缓存更新策略用来解决一致性问题 1.2 缓存更新策略的选择第一种:内存淘汰第二种:超时剔除…

SQLite 和 DB Browser SQLite介绍安装

SQLite介绍SQLite是轻量级的嵌入式数据库,‌无需独立服务器进程(不用独占服务器的资源),‌适合单用户或低并发场景;‌SQLite功能相对简单,‌不支持存储过程、‌触发器等高级特性,‌数据安全性较低;‌SQLite适用于嵌入式设备、‌移动应用和轻量级桌面应用DB Browser SQLit…