Java版web瀏覽器htmlunit使用記錄-js解釋器

記錄一下:前兩天有個爬蟲的項目出問題了,爬取的服務端升級了mlgbd,給每一個關鍵頁面加了cookie驗證。html

訪問服務器端給返回狀態碼202,而且返回的html裏有一段加密過的js,這段js經過獲取meta標籤裏動態傳入的content值進行計算而後把值存入cookie,原本想看js直接寫的啥 本身經過邏輯取出值去生成cookie的,結果發現js裏的幾個關鍵值都是後臺動態生成的 ,想來想去直接取值麻煩 (1萬行加密js代碼,看的他媽頭都大了 仍是混淆過的)。java

實在是受不了了 領導還每天催。結果想有沒有什麼能直接運行js的東西,就找到了htmlunit。web

經過htmlunit拿到頁面而後運行裏面的js將js設置的cookie拿到,放到本身請求的cookie中,問題順利解決了(因爲每一個頁面都有js設置cookie,先用htmlunit執行js拿到cookie再用httpclient去獲取頁面訪問)。服務器

public String getJsCookie(String url,String... cName) {
        WebClient webClient = new WebClient(BrowserVersion.CHROME);
            //2.設置鏈接的相關選項
            webClient.getOptions().setCssEnabled(false);
            webClient.getOptions().setJavaScriptEnabled(true);  //須要解析js
            webClient.getOptions().setThrowExceptionOnScriptError(false);  //解析js出錯時不拋異常
            //webClient.setJavaScriptEngine(new MyJavaScriptEngine(webClient));//自定義JavaScript引擎,有js錯誤不打印
            webClient.getOptions().setTimeout(10000);  //超時時間  ms
            webClient.waitForBackgroundJavaScript(10000);   //等侍js腳本執行完成
        //3.抓取頁面
        HtmlPage page = null;
        try {
            page = webClient.getPage(url);//爬取頁面的路徑
        } catch (IOException e) {
            e.printStackTrace();
        }
        //4.將頁面轉成指定格式

        //System.out.println(page.asXml());
        CookieManager CM = webClient.getCookieManager(); //WC = Your WebClient's name
        Set<com.gargoylesoftware.htmlunit.util.Cookie> cookies_ret = CM.getCookies();//拿到htmlunit存取的頁面cookie
        String cookiestr="";//按照默認方式進行拼接
        for(com.gargoylesoftware.htmlunit.util.Cookie cookie:cookies_ret){
            //System.out.println(cookie.getName()+":"+cookie.getValue());
            for(String name:cName){
                if(cookie.getName().equals(name)){
                    cookiestr+=name+"="+cookie.getValue()+";";
                }
            }
        }
        return cookiestr;
    }

服務端是能夠訪問了,可是有幾個問題還待解決。
1.js報錯關不掉,重寫了不知是版本問題仍是啥 沒時間去弄了 直接設置異常不拋出也無論用。測試的時候不知道改了啥了 有幾回沒拋 結果還原代碼 改不回去了。。。
2.解析js很慢。解析js太慢了 可能跟須要下載js文件有關 待優化,不過據說htmlunit對js支持不太好
3.試了幾個版本發現都須要httpclient 4.5.2版本。 htmlunit最後用的 2.25最新版的。cookie

相關文章
相關標籤/搜索