網頁解析利器——HtmlUnit

網頁解析利器——HtmlUnit

最近做京津冀路網的爬取,遇到一個很麻煩的問題,就是很多網頁上有js腳本,用普通的,例如HtppClient,根本無法做到解析js腳本,後來,百度了一下,找到了一個,是Java從jdk5之後擴展的ScriptEngineManager,
使用如下方法
ScriptEngineManager manager = new ScriptEngineManager();
  // 得到javascript腳本引擎
  ScriptEngine engine = manager.getEngineByName("javascript");
  try
  {
  // 開始運行腳本,並返回當前的小時
  Double hour = (Double)engine.eval("var date = new Date();" +"date.getHours();");
這種Java自帶的雖然不用導入外部的包,但是在實際開發中,這種API經常會報找不到window、document等等,因爲ScriptEngineManager裏面並沒有解析js的引擎,所以這種方案只得作廢。
jsoup是號稱解析網頁很強大的工具,但是隻能解析靜態的網頁,同樣不能解析動態的網頁。
這時候,用到了一個開源的網頁分析工具,HtmlUnit,這種工具自帶有js的解析和css的解析,能夠很好的解析出帶有js的網頁,但是一個缺點就是解析網頁的速度太慢,因爲要解析js,所以解析網頁的速度就慢下來了,如果有時候業務需要不用解析js的話,可以選擇關閉js解析和css解析器,這樣解析網頁速度會比較快了,代碼如下:
public static void main(String[] args) throws Exception{
        String str;
        //創建一個webclient
        WebClient webClient = new WebClient();
        //htmlunit 對css和javascript的支持不好,所以請關閉之
        webClient.getOptions().setJavaScriptEnabled(false);
        webClient.getOptions().setCssEnabled(false);
        //獲取頁面
        HtmlPage page =     webClient.getPage("http://www.baidu.com/");
        //獲取頁面的TITLE
        str = page.getTitleText();
        System.out.println(str);
        //獲取頁面的XML代碼
        str = page.asXml();
        System.out.println(str);
        //獲取頁面的文本
        str = page.asText();
        System.out.println(str);
        //關閉webclient
        webClient.closeAllWindows();
    }
如果想要解析網頁中的js,那麼就不用關閉js和css解析器,在HtmlUnit中,這兩個功能默認是開啓的,網上找資料中,看到很多人說用HtmlUnit解析js並不起作用,這是因爲HtmlUnit解析的時候,時間會比較長,有時候還沒等程序解析完,就執行了輸出結果的程序,所以,最終看不到解析後的結果,所以,可以暫時將該線程掛起,或者讓當前線程睡眠一段時間,再去獲取結果,優化方案如下:
// 新建一個web客戶端
        WebClient webClient = new WebClient(BrowserVersion.FIREFOX_52);
        // 解析獲取的頁面
        HtmlPage page = webClient.getPage("https://www.baidu.com");
        Thread.sleep(10000);
        System.out.println("------獲取的網頁------");
        System.out.println(page.asXml());
        webClient.close();
所以,HtmlUnit還是比較好用的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章