1. 程式人生 > >HtmlParser 一個不錯的網站爬蟲工具

HtmlParser 一個不錯的網站爬蟲工具

有時候我們需要在網上獲取自己需要的內容時,而且需求量達到一定程度時,就要通過程式碼來實現重複的操作。

當用Java來幫我們解決這個問題時,我們又如何通過Java來過濾掉多餘的內容,剩餘自己想要的資訊呢,這時HtmlParser會是一個不錯的選擇。

HtmlParser是一個用java語言寫的,用來解析html檔案(網頁)的應用庫,主要的作用就是做網頁的資訊提取。

HtmlParser提供了許多的過濾器給我們選擇,而且使用它只需要下載一個jar包,然後向專案匯入jar包就可以引用了。


在這裡,筆者使用幾個比較常用的過濾器來做網頁提取。

首先,我們需要下載HtmlParser的jar包,下載地址:

點選開啟連結

我們選擇最新的1.6的版本,下載完後,解壓壓縮包,到htmlparser1_6\lib目錄下,複製htmlParser.jar檔案然後貼上到你的專案裡面,跟著下面步驟操作。




然後,我們就要用htmlparser來為我們提取我們需要的資訊

第一種過濾器:LinkStringFilter

(LinkStringFilter(String 屬性值)過濾器是根據href連線屬性中是否含屬性值欄位來篩選)

場景:

估計大家都不會討厭看電影的,那麼就先來獲取電影的下載連結

有些人也許會感覺納悶,直接點選連結不就可以了嗎,但當你要獲取1000個電影的連線時,你就不會這麼覺得了)


抓取程式碼並不是這麼容易的,要在網頁的原始碼找到我們需要的資訊(也就是下載地址),然後找到這個資訊特別的地方,然後利用合適的過濾器去抓取。


下面用程式碼來獲取電影的下載地址(部分程式碼會有提示):

/**
	 * 功能:通過電影的介紹地址來獲取下載地址
	 * @param movieIntroUrl:電影的介紹地址
	 * @return 返回電影的下載地址
	 */
	public static String getDownloadUrl(String movieIntroUrl) {
		String downloadUrl="";
		try {
			Parser parser=new Parser(movieIntroUrl);
			//通過Parser來對Url建立連線,獲取該html的內容
			parser.setEncoding("GBK");
			//設定編碼格式
			NodeList list=(NodeList) parser.extractAllNodesThatMatch(new LinkStringFilter("ftp"));
			//parser.extractAllNodesThatMatch是一個html文字過濾選擇器,返回型別是NodeList
			//extractAllNodesThatMatch(new 過濾器型別)
			//LinkStringFilter(String 屬性值)過濾器是根據href連線屬性中是否含屬性值欄位來篩選
			for(int i=0;i<list.size();i++){
				//遍歷集合裡面的元素
				LinkTag lt=(LinkTag) list.elementAt(i);
				//把list裡面的元素轉成LinkTag型別的物件來傳遞資訊
				downloadUrl=lt.getLink();
				//通過LinkTag物件的getLink()方法獲取抓取的資訊
			}
System.out.println(downloadUrl);
		} catch (ParserException e) {
			e.printStackTrace();
		}
		return downloadUrl;
	}
程式碼本身是不多的,只是註釋有點多。然後我們來拷貝這個網頁的ip地址,執行一下這個方法。
public static void main(String[] args) {
		getDownloadUrl("http://www.dytt8.net/html/gndy/dyzz/20161230/52841.html");
	}


第二種過濾器:HasAttributeFilter

(HasAttributeFilter(String 屬性名,String 屬性值)根據對應的屬性名是否存在這樣的屬性值查詢元素)

這個過濾器的功能強大一些,但是有一些地方需要注意,不是包含屬性值,只能找到完全相等的屬性值的元素

場景:


有些網頁有許多部電影,如果你想把這些電影的下載地址全部獲取,怎麼辦?

點選這些連結,只是進去電影的介紹介面,裡面才有我們要的下載地址,也就是一個電影至少要點選兩次才能下載電影,重複的事情讓程式碼幫我們去完成吧。

分析:首先我們要進入每個電影的介紹介面才能獲取電影的下載地址,那麼我們就要把它們的介紹地址全部拿過來,然後再迴圈進入到這些介紹介面獲取我們最愛的下載地址。檢視網頁的原始碼尋找一些這些連結的規律。


下面來獲取電影的介紹地址(部分程式碼有提示):

/**
	 * 功能:獲取一個分頁裡面的所有電影的介紹地址
	 * @param pageListUrl 分頁的地址
	 * @return	返回一個String[]用於儲存這個分頁的所有的電影的介紹地址
	 */
	public static String[] getIntroUrlFromPageList(String pageListUrl) {
		String movieIntroUrl[]=new String[25];
		//定義String陣列,儲存介紹地址,注意長度一定要剛剛好,否則會出現錯誤
		try {
			Parser parser=new Parser(pageListUrl);
			parser.setEncoding("GBK");
			NodeList list=(NodeList)parser.extractAllNodesThatMatch(new HasAttributeFilter("class","ulink"));
			//HasAttributeFilter(String 屬性名,String 屬性值)根據對應的屬性名是否存在這樣的屬性值查詢元素
			//注意不是包含屬性值,只能找到完全相等屬性值的元素
			for(int i=0;i<list.size();i++){
				LinkTag lt=(LinkTag) list.elementAt(i);
				movieIntroUrl[i]="http://www.ygdy8.net"+lt.getLink();
			}
		} catch (ParserException e) {
			e.printStackTrace();
		}
		return movieIntroUrl;
	}
接著我們來獲取這些電影介紹地址裡面的下載地址:
public static void main(String[] args) {
		String introUrl[]=new String[25];
		introUrl=getIntroUrlFromPageList("http://www.ygdy8.net/html/gndy/dyzz/index.html");
		for (int i = 0; i < introUrl.length; i++) {
			String downloadUrl=getDownloadUrl(introUrl[i]);
		}
	}


第三種過濾器:TagNameFilter

(TagNameFilter(String 標籤名),根據標籤名來查詢對應的元素)

這個過濾器一般結合其他過濾器來使用,單獨使用的查詢效果很低,這裡就不作範例了。

其他過濾器的使用方法與使用效果可以去檢視htmlparser的API文件:點選開啟連結