[Jsoup] 使用HtmlUnit + Jsoup解析js動態生成的網頁

版權所有:  bluetata  [email protected]
本文地址:  http://blog.csdn.net/dietime1943/article/details/79035779
轉載請註明來源/作者

在使用Jsoup過程中會遇到無法解析通過javascript動態生成的html網頁, 在Jsoup交流羣中也經常會有人問到這個問題, 本文的解決辦法是使用HtmlUnit+Jsoup來解析動態dynamic網頁.

一般會出現動態js加載的網頁源碼爲, 某些關鍵性數據, 比如某簡歷網站的年份, 薪金等敏感數據信息, 也比如某些網站動態加載出來的新聞, 公告, 也比如某些網站在生成快照的時候的更新時間, 這些都可能是通過js動態生成的DOM元素後進行加載的.

Jsoup專注的是解析html, 利用類似JQuery的API進行快速解析html, 並沒有將自身的定位於模擬瀏覽器上, 所以並不是現階段某些人說的Jsoup對於模擬瀏覽器不足等等, 希望大家在給同事講解或者寫博客的時候註明。而對於模擬瀏覽器, 進行無窗口化的訪問, 有很多優秀的開源框架, 比如HttpClient, 也比如今天介紹的HtmlUnit, 亦或者Selenium.

現如今爲止Jsoup-1.10.4是無法動態加載js內容的, 官方作者Jonathan Hedley給予的回覆是:“Javascript is not supported. Jsoup parses HTML.”。HtmlUnit和Selenium本身都是做測試的開源框架, 本身Selenium底層也使用了HtmlUnit, 所以在本文直接介紹使用HtmlUnit進行處理動態js加載的Html問題.


如果是使用Maven構建項目, 請參照如下的配置, 如果是直接導入jar包, 直接到官網下載或者加博文後的Jsoup交流羣, 在羣文件中可以下載jar包和API幫助文檔

    <!-- https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit -->
    <dependency>
        <groupId>net.sourceforge.htmlunit</groupId>
        <artifactId>htmlunit</artifactId>
        <version>2.29</version>
    </dependency>
示例代碼:
    public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
        
        // 屏蔽HtmlUnit等系統 log
        LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log","org.apache.commons.logging.impl.NoOpLog");
        java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
        java.util.logging.Logger.getLogger("org.apache.http.client").setLevel(Level.OFF);

        String url = "https://bluetata.com/";
        System.out.println("Loading page now-----------------------------------------------: "+url);
        
        // HtmlUnit 模擬瀏覽器
        WebClient webClient = new WebClient(BrowserVersion.CHROME);
        webClient.getOptions().setJavaScriptEnabled(true);              // 啓用JS解釋器,默認爲true
        webClient.getOptions().setCssEnabled(false);                    // 禁用css支持
        webClient.getOptions().setThrowExceptionOnScriptError(false);   // js運行錯誤時,是否拋出異常
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
        webClient.getOptions().setTimeout(10 * 1000);                   // 設置連接超時時間
        HtmlPage page = webClient.getPage(url);
        webClient.waitForBackgroundJavaScript(30 * 1000);               // 等待js後臺執行30秒

        String pageAsXml = page.asXml();
        
        // Jsoup解析處理
        Document doc = Jsoup.parse(pageAsXml, "https://bluetata.com/");  
        Elements pngs = doc.select("img[src$=.png]");                   // 獲取所有圖片元素集
        // 此處省略其他操作
        System.out.println(doc.toString());
    }

Jsoup學習討論QQ羣:50695115

Jsoup爬蟲代碼示例及博客內源碼下載:https://github.com/bluetata/crawler-jsoup-maven

更多Jsoup相關文章,請查閱專欄:【Jsoup in action】

本文原創由`bluetata`發佈於blog.csdn.net、轉載請務必註明出處。


Flag Counter








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章