zoukankan      html  css  js  c++  java
  • HtmlUnit

    HtmlUnit学习总结

     

    本文摘抄其他博客或者技术论坛,自己搜集整理如下:

    HtmlUnit学习总结

    摘要

    htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。是一个没有界面的浏览器,运行速度迅速。(百度百科)

    环境搭建

    MAVEN依赖

    
    
    1. <dependency>
    2. <groupId>net.sourceforge.htmlunit</groupId>
    3. <artifactId>htmlunit</artifactId>
    4. <version>2.15</version>
    5. </dependency>

    1. 基本使用

    HtmlUnit简介:HtmlUnit说白了就是一个浏览器,这个浏览器是用Java写的无界面的浏览器,正因为其没有界面,因此执行的速度还是可以滴,HtmlUnit提供了一系列的API,这些API可以干的功能比较多,如表单的填充,表单的提交,模仿点击链接,由于内置了Rhinojs引擎,因此可以执行Javascript

    网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源HtmlUnit包,4行代码就OK啦,例子如下:

    
    
    1. final WebClient webClient=new WebClient();//创建对象
    2. final HtmlPage page=webClient.getPage("https://www.baidu.com");//获取页面
    3. System.out.println(page.asText());//asText() 顾名思义 获取所有文本
    4. webClient.closeAllWindows();//关闭窗口

    在程序中写上上面的4行代码,运行,就可以得到页面的全部内容,上面代码在运行的过程中会出现很多警告,出现这些警告的主要原因是由于以下两点: 
    1.HtmlUnitJavascript的支持不是很好 
    2.HtmlUnitCSS的支持不是很好 
    明白了上面的两点后,将代码重新改写一下,该禁用的就禁用,同时禁用一些不必要的功能,也有利于提高程序的运行效率,再者说网络爬虫也不需要CSS的支持

    
    
    1. final WebClient webClient=new WebClient();
    2. webClient.getOptions().setCssEnabled(false);//关闭css
    3. webClient.getOptions().setJavaScriptEnabled(false);//关闭js
    4. final HtmlPage page=webClient.getPage("https://www.baidu.com");
    5. System.out.println(page.asText());
    6. webClient.closeAllWindows();

    重要API的使用 在介绍API的使用之前要先明白的一个问题是,WebClient,WebWindow,Page三者之间的关系,所有的页面最终都是在一个WebWindow对象里面,WebClient在创建时会自动的创建一个WebWindow对象,当调用getPage时会将新页面加载到WebWindow里,你可以理解成WebClient就是IE内核,WebWindow就是呈现页面的浏览器窗口,三者之间的关系图如下图所示:

    1.1 模拟特定浏览器

    可以模拟的浏览器有Chrome/FireFox/IE

    
    
    1. //模拟chorme浏览器,其他浏览器请修改BrowserVersion.xxx常量
    2. WebClient webClient=new WebClient(BrowserVersion.CHROME);

    1.2 代理服务器的配置

    代理的配置很简单,只需要配置好地址,端口,用户名与密码即可

    
    
    1. final WebClient webClient = new WebClient(BrowserVersion.CHROME,"http://127.0.0.1",8087);
    2. final DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();
    3. credentialsProvider.addCredentials("username","password");

    1.3 模拟表单的提交

    
    
    1. //获取表单
    2. final HtmlForm form = page.getFormByName("form");
    3. //获取提交按扭
    4. final HtmlSubmitInput button = form.getInputByName("submit");
    5. //一会得输入的
    6. final HtmlTextInput textField = form.getInputByName("userid");
    7. textField.setValueAttribute("test");
    8. //点击提交表单
    9. final HtmlPage page = button.click();

    1.4 获取页中所有的链接

    网络爬虫中主要目的就是获取页中所有的链接,代码如下:

    
    
    1. List<HtmlAnchor> achList=page.getAnchors();
    2. for(HtmlAnchor ach:achList){
    3. System.out.println(ach.getHrefAttribute());
    4. }

    1.5 使用Htmlunit上传文件

    使用HtmlUnit模拟浏览器操作时,我们有时候要做一些上传文件操作。这就要利用HtmlFileInput这个类了。

    通过page获得HtmlForm,再通过HtmlForm获得HtmlFileInput

    
    
    1. HtmlForm form = page.getFormByName("form");//如果有form的话
    2. //如果在获取HtmlForm时,发现form表单没有name属性,也可以通过下列语句获取
    3. //HtmlForm form = page.getForms().get(0);
    4. HtmlFileInput fileInput = form.getInputByName("fileInput");
    5. //通过设置valueAttribute来确定上传哪个文件
    6. fileInput.setValueAttribute("D:\111.jpg");
    7. //最后按下提交按钮提交
    8. HtmlElement submitBtn = page.getElementByName("submit");
    9. submitBtn.click();

    这样就完成了一次上传文件的过程。

    1.6 查找特定元素

    通过get或者XPath可以从HtmlPage中获得特定的Html元素,如下例子

    1.6.1 通过get方法获取

    
    
    1. HtmlPage page=webClient.getPage("http://www.yanyulin.info");
    2. //从[烟雨林博客]上获取标签hed的内容
    3. HtmlDivision div=(HtmlDivision)page.getElementById("hed");

    1.6.2 通过XPath获取

    XPath通常用于无法通过Id搜索或者需要更为复杂的搜索时,XPath的相关教程Xpath

    
    
    1. //同样可以打印出hed的内容,//div中//表示搜索整个文档中的div,并将这些div
    2. //放入list中,然后获取第一个div
    3. final HtmlDivision div = (HtmlDivision) page.getByXPath("//div").get(0);
    4. System.out.println(div.asXml());//asXml() 转换为xml形式

    1.6.3 通过CSS选择器(Selector)获取

    示例: 贴吧自动抢二楼 教程

    通过CSS选择器(Selector)获取元素,代码片段如下: 
    (查看完整代码点击:完整代码

    
    
    1. // 获取当前页的所有class="i"元素。返回 DOM节点列表
    2. DomNodeList<DomNode> iList = page.querySelectorAll(".i");
    3. // 遍历
    4. for(DomNode i: iList) {
    5. // 选择 p 元素
    6. DomNode p = i.querySelector("p");
    7. // asText() 返回 元素文本, contains是 String的方法,查找 "回0 " 字符串
    8. if(p.asText().contains("回0 ")) {
    9. // 这里就是找到了 回帖为0的帖子
    10. // 我们用 父元素 div.i 来继续获取 子元素 a 标签。
    11. HtmlAnchor a = (HtmlAnchor)i.querySelector("a");
    12. // 获取 a 标签的属性 href ,就是帖子详情的地址啦!!
    13. String href = a.getAttribute("href");
    14. System.out.println(href);
    15. }

    2.WebClient常用使用流程及参数设置

    
    
    1. //1.创建对象
    2. WebClient webClient=new WebClient(BrowserVersion.CHROME);
    3. //2.设置参数
    4. //启动js
    5. webClient.getOptions().setJavaScriptEnabled(true);
    6. //关闭css渲染
    7. webClient.getOptions().setCssEnabled(false);
    8. //启动重定向
    9. webClient.getOptions().setRedirectEnabled(true);
    10. //启动cookie管理
    11. webClient.setCookieManager(new CookieManager());
    12. //启动ajax代理
    13. webClient.setAjaxController(new NicelyResynchronizingAjaxController());
    14. //js运行时错误,是否抛出异常
    15. webClient.getOptions().setThrowExceptionOnScriptError(false);
    16. //3.获取页面
    17. HtmlPage page=webClient.getPage(url);
    18. //等待js渲染执行 waitime等待时间(ms)
    19. webClient.waitForBackgroundJavaScript(waitime);
    20. //4.解析页面
    21. ......
  • 相关阅读:
    VS生成Map文件
    Google Android Studio Kotlin 开发环境配置
    byte数组存储到mysql
    C# 读取 appconfig文件配置数据库连接字符串,和配置文件
    关于byte[]与string、Image转换
    运行vs2010,Debug时发生“无法启动程序"http://localhost:xxx",系统找不到指定文件
    【转】使用Navicat for Oracle新建表空间、用户及权限赋予
    eclipse创建maven项目
    使用eclipse自动生成WSDL客户端代码
    使用Apache CXF根据wsdl文件生成代码
  • 原文地址:https://www.cnblogs.com/developer-ios/p/12111393.html
Copyright © 2011-2022 走看看