zoukankan      html  css  js  c++  java
  • 【Java爬虫-HtmlUnit学习总结】


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

     

    环境搭建

    Maven依赖
        <dependency>
        <groupId>net.sourceforge.htmlunit</groupId>
        <artifactId>htmlunit</artifactId>
        <version>2.15</version>
        </dependency>
    

    1. 基本使用

      final WebClient webClient=new WebClient();//创建对象
      final HtmlPage page=webClient.getPage("https://www.baidu.com");//获取页面
      System.out.println(page.asText());//asText() 顾名思义 获取所有文本
      webClient.closeAllWindows();//关闭窗口 
    
        List<HtmlAnchor> achList=page.getAnchors();
        for(HtmlAnchor ach:achList){
          System.out.println(ach.getHrefAttribute());
          }
    
    1.HtmlUnit对Javascript的支持不是很好 
    2.HtmlUnit对CSS的支持不是很好所以我们修改一下,
        final WebClient webClient=new WebClient();
        webClient.getOptions().setCssEnabled(false);//关闭css
        webClient.getOptions().setJavaScriptEnabled(false);//关闭js
        final HtmlPage page=webClient.getPage("https://www.baidu.com");
        System.out.println(page.asText());
        webClient.closeAllWindows();
    

    1.1 模拟特定浏览器

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

     1.2 代理服务器的配置

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

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

     1.3 模拟表单的提交

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

     1.4 获取页中所有的链接

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

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

     1.5 使用Htmlunit上传文件

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

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

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

     1.6 查找特定元素

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

    1.6.1 通过get方法获取

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

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

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

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

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

        //1.创建对象
        WebClient webClient=new WebClient(BrowserVersion.CHROME);
        //2.设置参数
        //启动js
        webClient.getOptions().setJavaScriptEnabled(true);
        //关闭css渲染
        webClient.getOptions().setCssEnabled(false);
        //启动重定向
        webClient.getOptions().setRedirectEnabled(true);
        //启动cookie管理
        webClient.setCookieManager(new CookieManager());
        //启动ajax代理
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());
        //js运行时错误,是否抛出异常
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        //3.获取页面
        HtmlPage page=webClient.getPage(url);
        //等待js渲染执行 waitime等待时间(ms)
        webClient.waitForBackgroundJavaScript(waitime);
        //4.解析页面
        ......
    
  • 相关阅读:
    为恶畏人知,恶中犹有善路,为善而急人知,善处即是恶根。
    win7 64位 php环境开启curl服务Call to undefined function
    php根据汉字获取拼音(php基于拼音搜索实现原理)
    Fatal error: Call to undefined function mb_detect_encoding()
    学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践
    springMVC介绍及配置
    Java--详解WebService技术
    网站SEO优化
    Java温故而知新(5)设计模式详解(23种)
    java温故而知新(9)OOP(面向对象编程)理念
  • 原文地址:https://www.cnblogs.com/iitxt/p/8980940.html
Copyright © 2011-2022 走看看