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文件:點選開啟連結