欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java爬虫 htmlunit与jsoup技术

程序员文章站 2022-03-02 21:09:01
...

场景使用:网页爬虫,一个网页数据抓取工具。
htmlunit可以模拟浏览器执行,但是不会正真打开一个浏览器界面,是webdriver的轻量级实现。
优点:比webDriver运行快,少占用资源。
缺点:对js,css的支持不是很好,需要处理。

使用方法

  1. 首先加载htmlunit对应的jar包
    a. 对应下载:htmluint-2.23.jar(也可以下载最新版的)

  2. 处理js,css,重定向

    private void initClient() {
        this.webClient = new WebClient();
    
        this.webClient.setAjaxController(new NicelyResynchronizingAjaxController());
        // 启动JS
        this.webClient.getOptions().setJavaScriptEnabled(true);
    //          this.webClient.waitForBackgroundJavaScript(10000);
        this.webClient.waitForBackgroundJavaScriptStartingBefore(10000);
        // 禁用Css,可避免自动二次请求CSS进行渲染
        this.webClient.getOptions().setCssEnabled(false);
        // 启动客户端重定向
        this.webClient.getOptions().setRedirectEnabled(true);
        // js运行错误时,是否抛出异常
        this.webClient.getOptions().setThrowExceptionOnScriptError(false);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    注意:getpage的时候一定要剖析浏览器的请求方式(post或者get,不同的请求对应不同的处理方式,getpage对应的是get请求)

  3. 获取网页源码

    HtmlPage indexPage =webclient.getPage(dataUrl)//网页链接
    • 1
  4. 解析
    a.直接利用htmlunit进行解析

    //id获取<input>text元素
    HtmlInput inputName = indexPage.getHtmlElementById("id");
    
    //id获取button元素
    HtmlSubmitInput btn = indexPage.getHtmlElementById("button");
    
    //xpath获取<a>标签元素
    HtmlAnchor link = (HtmlAnchor) indexPage.getByXPath("xpath");
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意:xpath方法用的比较广泛,可以唯一定位一个html元素。更多解析方式见官方api文档:http://htmlunit.sourceforge.net/table-howto.html

    //htmlunit还可以模拟键盘动作,例如回车
    indexPage.pressAccessKey((char) 10);
    • 1
    • 2
    //解析表格
      HtmlTable table = indexPage.getHtmlElementById("tableId");
            for (HtmlTableBody body : table.getBodies()) {
                for (HtmlTableRow row : body.getRows()) {
                    for (final HtmlTableCell cell : row.getCells()) {
                        //TODO 表格数据
                        System.out.println(cell.asText());
                    }
                }
            }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    b.解析方式亦可以换成熟悉的jsoup

    //需要转换比较费时
    String html= indexPage.asXml();
    Document doc= Jsoup.parse(html);
    
    //通过id
    Element element= doc.getElementById("elementId");
    
    //更多解析方式看jsoup官方api
    ...