使用java的html解析器jsoup和jQuery实现一个自动重复抓取任意网站页面指定元素的web应用...
在線演示??本地下載
如果你曾經開發過內容聚合類網站的話,使用程序動態整合來自不同頁面或者網站內容的功能肯定對于你來說非常熟悉。通常使用java的話,我們都會使用到一些HTML的解析,例如,httpparser,最早gbin1.com的整合搜索就是使用httpparser來抓取Google和Baidu的搜索結果,并且整合呈現給搜索用戶,這也就是GBin1域名的由來。
那么今天呢,我們介紹另外一個超棒的Java的HTML解析器 -?jsoup,這個類庫可以幫助大家實時的處理HTML。提供了非常方便的API來提取和處理數據,最重要的它使用類似jQuery的語法來處理DOM,CSS等,如果你使用過jQuery的話,就知道它處理DOM的強大方便之處。
主要特性
jsoup實現了WHATWG HTML5?的標準,和現代瀏覽器解析DOM的方式一樣。主要功能:
- 可以從URL,文件或者字符串中抓取和解析HTML
- 使用DOM的查詢和CSS選擇器來查找和解壓數據
- 可以處理HTML的屬性,元素和文本
- 幫助用戶處理遞交的內容,并且防止XSS攻擊
- 輸出干凈的HTML
基本上jsoup可以幫助你處理各種的HTML問題,并且幫助你驗證非法的tag,創建一個干凈的DOM樹。
實現一個抓取功能
這里我們將實現一個簡單的抓取功能,你只需要指定url,并且指定你需要抓取的特定元素,例如,ID或者class。后臺我們將使用jsoup抓取,前臺使用jQuery美化生成結果。
大家需要注意以下幾點:
下載jsoup的jar包后,請加入你的classpath路徑,如果你使用jsp,請加入web應用WEB-INF的lib目錄中。
Java相關代碼如下:
Document doc = Jsoup.connect("http://www.gbin1.com/portfolio/lastest.html").timeout(0).get();Elements items = doc.select(".includeitem");
以上代碼,我們定義jsoup使用一個url來獲取HTML,這里使用http://www.gbin1.com/portfolio/lastest.html,這個頁面中列出了gbin1最近發布的文章。如果你查看此頁面源代碼,可以看到,每一個文章都在.includeitem這個class中,因此,我們這里使用doc.select方法來選擇對應的class。
注意我們這里調用timeout(0),這意味著持續的請求url,缺省為2000。即2秒后超時。大家可以看到這里使用了類似jQuery的鏈狀調用,非常方便。
for (Element item : items) {Elements links = item.select("a");
for(Element link: links){
link.attr("href",link.attr("abs:href"));
}
Elements imgs = item.select("img");
for(Element img: imgs){
img.attr("src",img.attr("abs:src"));
}
String html = item.html();
out.println("<li class=\"item\">" + html + "</li>");
}
以上代碼中,我們處理每一個查詢到的includeitem元素。查找"a"和"img",將其中的href元素值修改為絕對路徑。
link.attr("abs:href")以上代碼將會得到對應鏈接的絕對路徑,其中屬性為abs:href。同理,可以得到圖片絕對路徑abs:src。
代碼運行后,我們可以看到修改完的代碼, 將他們放置于li中。
接下來我們開發控制抓取的javascript頁面:
在這個頁面的實現中,我們使用setInterval方法間隔指定的時間使用ajax調用以上java開發的代碼,基本代碼如下:
//Run for first time$('#msg').html('請耐心等待, 頁面抓取中 ...').fadeIn(400);
//$('#content').html('');
$('#content').load('siteproxy.jsp #result', {url:url, elem:element}, function(){
$('#msg').html('抓取已完成').delay(1500).fadeOut(400);
})
以上代碼非常簡單,我們使用jQuery的load方法來調用siteproxy.jsp,然后取得siteproxy.jsp生成頁面中的#result元素,即抓取內容。如果你不熟悉jQuery的ajax方法,請參考這個系列文章:
jQuery類庫新手使用指南之AJAX方法- 第一部分
jQuery類庫新手使用指南之AJAX方法- 第二部分
jQuery類庫新手使用指南之AJAX方法- 第三部分
jQuery類庫新手使用指南之AJAX方法- 第四部分
為了能夠讓代碼指定間隔時間運行抓取,我們將方法放入setinterval中,如下:
runid = setInterval(function getInfo(){
$('#msg').html('請耐心等待, 頁面抓取中 ...').fadeIn(400);
//$('#content').html('');
$('#content').load('siteproxy.jsp #result', {url:url, elem:element}, function(){
$('#msg').html('抓取已完成').delay(1500).fadeOut(400);
})
}, interval*1000);
通過以上方法,我們可以在用戶觸發抓取后,每隔指定時間觸發抓取動作。
完整js代碼如下:
$(document).ready(function(){var url, element, interval, runid;
$('#start').click(function(){
url = $('#url').val();
element = $('#element').val();
interval = $('#interval').val();
//Run for first time
$('#msg').html('請耐心等待, 頁面抓取中 ...').fadeIn(400);
//$('#content').html('');
$('#content').load('siteproxy.jsp #result', {url:url, elem:element}, function(){
$('#msg').html('抓取已完成').delay(1500).fadeOut(400);
})
runid = setInterval(
function getInfo(){
$('#msg').html('請耐心等待, 頁面抓取中 ...').fadeIn(400);
//$('#content').html('');
$('#content').load('siteproxy.jsp #result', {url:url, elem:element}, function(){
$('#msg').html('抓取已完成').delay(1500).fadeOut(400);
})
}, interval*1000);
});
$('#stop').click(function(){
$('#msg').html('抓取已暫停').fadeIn(400).delay(1500);
clearInterval(runid);
});
});
將以上jsp和html文件部署以后,將可以看到如下界面:
我們需要設置抓取的url和頁面元素,這里缺省是http://www.gbin1.com/portfolio/lastest.html?,元素為.includeitem,點擊開始抓取,可以看到應用抓取如下內容:
注意這里缺省間隔時間為30秒,30秒后會自動重新抓取內容。
你可以嘗試抓取weibo.com, 元素.itemt, 間隔時間10秒,能得到如下內容:
你可以看到和微博首頁的自動刷新內容一樣。
大家可以把這個工具當做頁面重復刷新工具,可以幫助你監控某個網站某個部分內容,當然,你也可以使用它來動態刷新你的網站,提高你的alexa排名。
希望大家喜歡這個工具應用,如果你有任何建議和問題,請給我們留言!謝謝!?
轉載?http://www.gbin1.com/technology/javautilities/20120720jsoupjquerysnatchpage/
轉載于:https://www.cnblogs.com/chenying99/archive/2013/01/04/2844607.html
總結
以上是生活随笔為你收集整理的使用java的html解析器jsoup和jQuery实现一个自动重复抓取任意网站页面指定元素的web应用...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET-第一天-HTML基础
- 下一篇: 将Bitmap byte裸数据转换成Bi