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

Posted qiantao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();

 

以上是关于java使用htmlunit工具抓取js中加载的数据的主要内容,如果未能解决你的问题,请参考以下文章

Java使用HtmlUnit抓取js渲染页面

Java网页抓取技术HtmlUnit

java htmlunit 抓取网页数据

Java 实现 HttpClients+jsoup,Jsoup,htmlunit,Headless Chrome 爬虫抓取数据

如何使用 Next.js 访问当前在导航中加载的 url 或页面

抓取js动态生成数据