htmlunit

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治癒

 

 

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