Htmlunit是一款模擬瀏覽抓取頁面內容的java框架,具有js解析引擎(rhino),可以解析頁面的js腳本,得到完整的頁面內容,特殊適合於這種非完整頁面的站點抓取。
下載地址:
https://sourceforge.net/projects/htmlunit/files/htmlunit/
maven地址:
<dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit</artifactId> <version>2.18</version> </dependency>
代碼的實現非常簡單,主要分為兩種常用場景:
- 解析頁面的js
- 不解析頁面的js
package cn.qlq.craw.httpunit; import com.gargoylesoftware.htmlunit.BrowserVersion; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; /** * httpunit爬蟲 * @author liqiang * */ public class HttpUnitCraw { public static void main(String[] args) throws Exception { HttpUnitCraw crawl = new HttpUnitCraw(); String url = "http://qiaoliqiang.cn/"; System.out.println("----------------------抓取頁面時不解析js-----------------"); crawl.crawlPageWithoutAnalyseJs(url); System.out.println("----------------------抓取頁面時解析js-------------------"); crawl.crawlPageWithAnalyseJs(url); } /** * 功能描述:抓取頁面時不解析頁面的js * @param url * @throws Exception */ public void crawlPageWithoutAnalyseJs(String url) throws Exception{ //1.創建連接client WebClient webClient = new WebClient(BrowserVersion.CHROME); //2.設置連接的相關選項 webClient.getOptions().setCssEnabled(false); webClient.getOptions().setJavaScriptEnabled(false); webClient.getOptions().setTimeout(10000); //3.抓取頁面 HtmlPage page = webClient.getPage(url); System.out.println(page.asXml()); //4.關閉模擬窗口 webClient.closeAllWindows(); } /** * 功能描述:抓取頁面時並解析頁面的js * @param url * @throws Exception */ public void crawlPageWithAnalyseJs(String url) throws Exception{ //1.創建連接client WebClient webClient = new WebClient(BrowserVersion.CHROME); //2.設置連接的相關選項 webClient.getOptions().setCssEnabled(false); webClient.getOptions().setJavaScriptEnabled(true); //需要解析js webClient.getOptions().setThrowExceptionOnScriptError(false); //解析js出錯時不拋異常 webClient.getOptions().setTimeout(10000); //超時時間 ms //3.抓取頁面 HtmlPage page = webClient.getPage(url); //4.將頁面轉成指定格式 webClient.waitForBackgroundJavaScript(10000); //等侍js腳本執行完成 System.out.println(page.asXml()); //5.關閉模擬的窗口 webClient.closeAllWindows(); } }
主要關注webClient的幾個選項配置,
需要將這兩個開關打開才可以解析頁面的js,css的渲染默認關掉就可以,因為爬蟲本身沒有界面,所以這塊不需要,即下面的配置:
htmlunit在解析js的時候也有可能失敗,這塊還沒有深入研究,后續使用遇到問題再記錄
抓取到的內容默認以xml形式獲得,即page.asXml(), 因為這樣可以通過jsoup去解析html頁面數據,jsoup是一個比較方便簡潔的工具.
