使用htmlunit采集网页+点击网页按钮
有兴趣可以了解下这款国内人气很旺的JAVA代码生成器基于拖拽,不用写复杂的模板,支持多种数据库,适配wap,管理后台各种功能全有 免费开源 地址:https://blog.csdn.net/adyuebanwan/article/details/83006405 或者 http://www.magicalcoder.com
=======================================================================================
概念
htmlunit:这东西是java无界面浏览器,说白了就是全部是api操作,你就可以访问别人的网页。这意味着 你可以写程序批量去做很多事情 告别手工
问题:
我们采集网页的时候 经常发现 javascript ajax等方式加载出来的html无法采集到,
这个时候选择htmlunit 可以解决这个烦恼 因为这货就是一个浏览器 啥不能干啊 除了没界面而已
版本:
尝试了2.3到2.9版本 结果跑起来发现 没有一个能用的 可能是我使用方式不当 各种js执行异常报错
最后使用2.15版本 同样代码顺利跑起来
项目是maven依赖
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.15</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.7.3</version>
</dependency>
参考代码:
test 1:采集网页
// 模拟一个浏览器
WebClient webClient = new WebClient(BrowserVersion.getDefault());
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.waitForBackgroundJavaScript(10*1000);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setJavaScriptEnabled(true);
URL URL = new URL(url);
HtmlPage page= webClient.getPage(URL);
String firstPageHtml = page.asXml();
Document doc = Jsoup.parse(firstPageHtml);
Element element = doc.select(".album-page-1").first();
String firstPagePhoto = element.html();
outputAppend(output,firstPagePhoto);
//追加分页数据 根据class来获取节点 获取li class=pagination下面所有的a 至于你要获取其他方式 参考xpath
List links = (List) page.getByXPath ("//li[@class='pagination']/a");
//循环去点击页面下一页按钮
if(null!=links){
int size = links.size();
if(size>3){
int min = 2;
int max = size-2;
for(int i=min;i<=max;i++){
//因为循环点击页面按钮,返回的总是第一页数据,所有我们干脆就重新请求一次下一页再发起一次浏览器请求 拜求大神能解决这个问题
getNextPageContent(url, i);
}
}
}
private String getNextPageContent(String url,int idx) throws IOException {
HtmlPage newPage = HtmlPager.getPage(url);
WebClientFactory.getWebClient().waitForBackgroundJavaScript(1000*4);
List newLinks = (List) newPage.getByXPath ("//li[@class='pagination']/a");
HtmlAnchor newlink = (HtmlAnchor)newLinks.get(idx);
newPage = newlink.click();
WebClientFactory.closeAllWindows();
String newHtml = newPage.asXml();
Document doc = Jsoup.parse(newHtml);
Element element = doc.select(".album-page-" + idx).first();
return element.html();
}
至此 结束了 文章中代码不一定能直接跑起来 拷贝代码比较麻烦 但是大体90%的逻辑都在了
希望htmlUnit尽快的强大起来
另外求高手赐教 如何能循环点击获取js执行的最新的所有html
test 2 验证码登录
try
{
WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.waitForBackgroundJavaScript(10*1000);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
HtmlPage page = webClient.getPage("http://www.***.com.cn/login.htm");
HtmlElement username = (HtmlElement)page.getElementById("mobile");
HtmlElement password = (HtmlElement)page.getElementById("password");
HtmlElement valiCode = (HtmlElement)page.getElementById("checkCode");
HtmlImage valiCodeImg = (HtmlImage) page.getElementById("checkCodeImage");
ImageReader imageReader = valiCodeImg.getImageReader();
BufferedImage bufferedImage = imageReader.read(0);
JFrame f2 = new JFrame();
JLabel l = new JLabel();
l.setIcon(new ImageIcon(bufferedImage));
f2.getContentPane().add(l);
f2.setSize(300, 300);
f2.setTitle("验证码");
f2.setVisible(true);
String valicodeStr = JOptionPane.showInputDialog("请输入验证码:");
f2.setVisible(false);
List newLinks = (List) page.getByXPath ("//li[@class='login']/a");
HtmlAnchor newlink = (HtmlAnchor)newLinks.get(0);
username.click();
username.type("123456");
password.click();
password.type("123456");
valiCode.click();
valiCode.type(valicodeStr);
HtmlPage logingPage= newlink.click();
//拿到登录后返回数据
System.out.println(logingPage.getWebResponse().getContentAsString());
//继续登陆后的操作
//......
System.exit(0);
}
catch(Exception e)
{
e.printStackTrace();
}
使用htmlunit采集网页+点击网页按钮相关推荐
- ios html转换成网页,ios App加载本地HTML网页,点击网页链接跳转到app页面的方法
一.如何在APP里加载本地html文件内容: 首先准备一个html文件,比如内容如下: title go to app 接下来,在APP里定义一个UIWebView,用来显示html文件内容: //定 ...
- Delphi中点击网页弹出的Alert对话框的确定按钮
实现的方法有很多,一般都是使用Windows API函数遍历窗口,查找指定标题的窗口,然后从该窗口查找确定按钮,向该按钮发送鼠标消息进行模拟点击.由于IE8由Alert弹出的网页对话框的标题是&quo ...
- python模拟网页点击_python怎么模拟点击网页按钮
python怎么模拟点击网页按钮 前提环境: Python3 和 Visual Studio Code安装完毕 . 安装selenium : 在终端输入: pip install selenium, ...
- php如何模拟网页点击按钮,python模拟点击网页按钮如何实现 python模拟点击网页按钮实现方法...
python模拟点击网页按钮如何实现 python模拟点击网页按钮实现方法 本篇文章小编给大家分享一下python模拟点击网页按钮实现方法,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们 ...
- vue h5网页点击按钮 -- 跳到微信小程序 wx-open-launch-weapp;onMenuShareAppMessage 分享图片不显示,且方法已废弃
h5网页点击按钮,唤醒微信小程序是否可以做? 可以!!,就是有点限制. 通过wx-open-launch-weapp就可以实现,但是限制 微信服务号才可以使用.也就是说必须是微信环境下. 文章最下边, ...
- 自动点击按钮html,如何自动点击网页按钮
如何自动点击网页按钮 http://club. 请问如何点击这个网页上的"领取"按钮(三个如何区分)?谢谢. ttp://www. 红包 - - Excel Home论坛 - ...
- 小程序嵌入web-view网页后,点击网页中的按钮跳转回小程序
1.首先在网页端引入js <script type="text/javascript" src="https://res.wx.qq.com/open/js/jwe ...
- Qt QWebview调用JS,实现QQ邮箱自动填写输入框,模拟鼠标点击网页按钮!!
Qt QWebview调用JS,实现QQ邮箱自动填写输入框,模拟鼠标点击网页按钮!! QWebview调用JS,自动填写用户名和密码,并且JS模拟鼠标点击网页按钮. 下载地址:https://down ...
- JavaScript网页中点击按钮切换显示的内容
前言: 我是实习两个月的前端开发实习生, 最近在制作公司的官方网站过程中遇到了一个网页前端开发中比较普遍的需求: 点击不同的按钮 页面上的内容随之更换, 并且按钮的背景颜色也要呈现为被选中的样式. 以 ...
最新文章
- C#生成的图片无法在ps中打开
- Leetcode4-寻找两个正序数组的中位数原理及代码实现
- 软件研发中的N条原则
- 【翻译自mos文章】job 不能自己主动运行的解决方法
- 李国浩20179307第二周作业
- vsco_VSCO重新设计:更直观,更简化的界面
- 如何订阅MVP on dot NET(或其它播客) - iTunes版
- MYSQL学习笔记2--mysql 静态和动态plugin
- [LOJ 6485]LJJ 学二项式定理
- Spring Cloud消息驱动整合
- 去见你喜欢的人,去做你想做的事
- UEditor 实现新增“转换简体”和“转换繁体字”按钮功能
- 【电子产品】Fast FWR200 公司使用设备人数超过20个后,之后的设备无法上网
- sklearn.metrics.accuracy_score/precision_score/recall_score、micro/macro/weighted(准确率、召回率)
- 导入FontForge生成字体
- 数显之家快讯:【SHIO世硕心语】2021年,中国最赚钱的时代到来!
- 配置路由器交换机常见的坑
- 如何进行Web服务的性能测试
- Java题目汇总(二)
- JZOJ 4745. 看电影
热门文章
- 两个ListView实现的Android点餐页面
- ps photoshop cc 2015 Extract Assets(生成器)切图大法
- 北京理工大学计算机保研面试,保研之旅2:北京理工大学雷达所面试
- iphone开发之屏幕截图
- JavaScript潜入潜出
- PhpStorm 注册码
- 陷阱技术探秘 ──动态汉化Windows技术的分析 (转)
- 在职计算机技术考研英语自我介绍,2019考研复试英语自我介绍范文--在职考研
- 加州大学伯克利分校计算机科学专业,加州大学伯克利分校之计算机科学系
- C++ 标准库(C++ Standary Library)