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

java使用htmlunit工具抓取js中加载的数据

程序员文章站 2022-06-30 08:52:31
htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。这个没有界面的浏览器,运行速度也是非常迅速的。采用的是Rhinojs引擎。模拟js运行。 说白了就是一个浏览器,这个浏览器是用Ja ......

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

说白了就是一个浏览器,这个浏览器是用java写的*面的浏览器,正因为其没有界面,因此执行的速度还是可以滴,htmlunit提供了一系列的api,这些api可以干的功能比较多,如表单的填充,表单的提交,模仿点击链接,由于内置了rhinojs引擎,因此可以执行javascript。
网页获取和解析速度较快,性能较好,推荐用于需要解析网页脚本的应用场景。

在使用此工具前需要导入htmlunit需要的jar包:

 java使用htmlunit工具抓取js中加载的数据

代码:

public static string url="http://www.xxx.cn/xxx";//抓取数据的地址
    public static void main(string[] args) throws ioexception, saxexception
    {
        webclient wc = new webclient(browserversion.firefox_52);
        wc.getoptions().setjavascriptenabled(true); //启用js解释器,默认为true
        wc.setjavascripttimeout(100000);//设置js执行的超时时间
        wc.getoptions().setcssenabled(false); //禁用css支持
        wc.getoptions().setthrowexceptiononscripterror(false); //js运行错误时,是否抛出异常
        wc.getoptions().settimeout(10000); //设置连接超时时间 ,这里是10s。如果为0,则无限期等待
        wc.setajaxcontroller(new nicelyresynchronizingajaxcontroller());//设置支持ajax
        wc.setwebconnection(new webconnectionwrapper(wc) {
                    public webresponse getresponse(webrequest request) throws ioexception {
                        webresponse response = super.getresponse(request);
                        string data=  response.getcontentasstring();
                        if (data.contains("{\"js中的数据标识\"")){//判断抓到的js数据是否是包含抓取的字段
                            system.out.println(data);
                            writefile(data);//将js中获取的数据写入指定路径的txt文件中
                        }
                        return response;
                    }
                }
        );
        htmlpage page = wc.getpage(url);
        system.out.println("page:" + page);
        try {
            thread.sleep(1000);//设置
        } catch (interruptedexception e) {
            e.printstacktrace();
        }
        //关闭webclient
        wc.close();
    }

    /**
     * 写入txt文件
     */
    public static void writefile(string data) {
        try {
            file writename = new file("data.txt"); // 相对路径,如果没有则要建立一个新的output.txt文件
            writename.createnewfile(); // 创建新文件,有同名的文件的话直接覆盖
            try{
          filewriter writer = new filewriter(writename);
          bufferedwriter out = new bufferedwriter(writer); out.write(data); out.flush(); // 把缓存区内容压入文件 } } catch (ioexception e) { e.printstacktrace(); } }