1. 程式人生 > >[Jsoup] 使用HtmlUnit + Jsoup解析js動態生成的網頁

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

在使用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幫助文件

  1. <!-- https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit -->

  2. <dependency>

  3. <groupId>net.sourceforge.htmlunit</groupId>

  4. <artifactId>htmlunit</artifactId>

  5. <version>2.29</version>

  6. </dependency>

示例程式碼:

  1. public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {

  2.         // 遮蔽HtmlUnit等系統 log

  3.         LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log","org.apache.commons.logging.impl.NoOpLog");

  4.         java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);

  5.         java.util.logging.Logger.getLogger("org.apache.http.client").setLevel(Level.OFF);

  6. String url = "https://bluetata.com/";

  7. System.out.println("Loading page now-----------------------------------------------: "+url);

  8. // HtmlUnit 模擬瀏覽器

  9. WebClient webClient = new WebClient(BrowserVersion.CHROME);

  10. webClient.getOptions().setJavaScriptEnabled(true); // 啟用JS直譯器,預設為true

  11. webClient.getOptions().setCssEnabled(false); // 禁用css支援

  12. webClient.getOptions().setThrowExceptionOnScriptError(false); // js執行錯誤時,是否丟擲異常

  13. webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);

  14. webClient.getOptions().setTimeout(10 * 1000); // 設定連線超時時間

  15. HtmlPage page = webClient.getPage(url);

  16. webClient.waitForBackgroundJavaScript(30 * 1000); // 等待js後臺執行30秒

  17. String pageAsXml = page.asXml();

  18. // Jsoup解析處理

  19. Document doc = Jsoup.parse(pageAsXml, "https://bluetata.com/");

  20. Elements pngs = doc.select("img[src$=.png]"); // 獲取所有圖片元素集

  21. // 此處省略其他操作

  22. System.out.println(doc.toString());

  23. }

● Jsoup學習討論QQ群:50695115

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

Flag Counter

--------------------- 本文來自 bluetata 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/dietime1943/article/details/79035779?utm_source=copy