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


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

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

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

     

    代码:

    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(); } }
  • 相关阅读:
    mysql启动失败
    mini.open参数传递
    json的key动态赋值
    Python文件格式 .py .pyc .pyw .pyo .pyd的主要区别
    centos 7.2 安装mongodb 3.4.4免编译
    tomcat 8.0安装ssl证书,及centos7.2 的openssl升级到最新版本,及ERR_SSL_OBSOLETE_CIPHER错误解决
    云服务器 Centos7.0 部署
    笔记
    oracle 视图的创建,游标,left join
    在Extjs中对日期的处理,以及在后端数据在SQL语句的判断处理
  • 原文地址:https://www.cnblogs.com/qiantao/p/11401608.html
Copyright © 2020-2023  润新知