HtmlUnit是一個無界面瀏覽器Java程序,可以很便捷的操作網頁,就是我們常說的爬蟲。它爲HTML文檔建模,提供了調用頁面、填寫表單、單擊鏈接等操作的API。就跟你在瀏覽器裏做的操作一樣。
Httpclient+jsoup也是能夠爬取一些我們常需要的數據,但是還是有一些缺陷,比如有些頁面數據是js加載出來的 httpclient解析不出來,比如百度雲用戶頁面,淘寶頁面,連開源中國博客的博客內容都是Js加載或者處理的,所以httpClient是解析不出來的,這裏htmlunit就是一個很好的方案,內嵌js瀏覽器,模擬Js運行,把結果執行出來。
下面是我爬取的疫情數據,包括了一些獲取常規元素的方法
package com.xmy.cn;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlListItem;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class test
{
public static void main(String[] args) throws InterruptedException
{
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//取消js css支持
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
HtmlPage page;
try {
//獲取需要解析的頁面
page = webClient.getPage("https://m.medsci.cn/wh.do");
Thread.sleep(1000); // 休息10秒鐘
//獲取頁面全部文本
// System.out.println(page.asText());
//====根據tag名稱 查詢所需數據===//
//HTML中tag是由尖括號包圍的關鍵詞,比如 <html>
DomNodeList<DomElement> aList = page.getElementsByTagName("p");
// for(int i=0;i<aList.getLength();i++)
// {
// DomElement a=aList.get(i);
// System.out.println(a.asText());
// }
//標題
DomElement a = aList.get(0);
System.out.println(a.asText());
//===xpath方式查詢所需數據===//
//確診人數
HtmlListItem item1 = (HtmlListItem) page.getByXPath("//ul['count_list']/li").get(0);
//疑似人數
HtmlListItem item2 = (HtmlListItem) page.getByXPath("//ul['count_list']/li").get(1);
//死亡人數
HtmlListItem item3 = (HtmlListItem) page.getByXPath("//ul['count_list']/li").get(3);
//治癒人數
HtmlListItem item4 = (HtmlListItem) page.getByXPath("//ul['count_list']/li").get(4);
System.out.println("確診人數: "+item1.asText());
System.out.println("疑似人數: "+item2.asText());
System.out.println("死亡人數: "+item3.asText());
System.out.println("治癒人數: "+item4.asText());
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//釋放資源
webClient.closeAllWindows();
}
}
}
輸出結果:
截至 2020-2-5 21:37:27 數據統計
確診人數: 24511確診
疑似人數: 15625疑似
死亡人數: 490死亡
治癒人數: 901治癒