記錄一下:前兩天有個爬蟲的項目出問題了,爬取的服務端升級了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