java爬虫 htmlunit与jsoup技术

场景使用:网页爬虫,一个网页数据抓取工具。
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
    ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值