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(); } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM