在线抓取网页( 另外一个超棒的Java的HTML解析器-jsoup-)
优采云 发布时间: 2021-11-26 10:08在线抓取网页(
另外一个超棒的Java的HTML解析器-jsoup-)
在线演示本地下载
如果你曾经开发过内容聚合类网站,那么使用程序动态整合不同页面或网站的内容的功能你一定很熟悉。通常在使用java的时候,我们会用到一些HTML解析,比如httpparser,最早的集成搜索就是用httpparser抓取Google和百度的搜索结果,并集成呈现给搜索用户,这就是GBin1的由来域名。
所以今天,我们介绍另一个很棒的Java HTML解析器-jsoup,这个类库可以帮助你实时处理HTML。它提供了一个非常方便的 API 来提取和处理数据。最重要的是它使用类似jQuery的语法来处理DOM、CSS等。如果你用过jQuery,你就会知道它在处理DOM方面的强大和便利。
主要特点
jsoup 实现了 WHATWG HTML5 标准,与现代浏览器解析 DOM 的方式相同。主要功能:
基本上jsoup可以帮你处理各种HTML问题,帮你验证非法标签,创建干净的DOM树。
实现爬取功能
这里我们将实现一个简单的爬取功能,您只需要指定url,并指定您需要爬取的具体元素,例如ID或类。后台我们会使用jsoup来获取,前台会使用jQuery来美化生成的结果。
大家需要注意以下几点:
相对路径问题:您抓取的页面中的链接可能使用了相对路径,需要将其作为绝对路径处理,否则将无法在本地服务器上正常打开链接
相对路径问题:同上,还需要处理转换
大小问题:如果抓取的图片特别大,需要使用代码转换为本地样式,也可以选择使用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,这里就用到了。本页列出了gbin1最近发布的文章。如果查看这个页面的源码,可以看到每个文章都在.includeitem类中,所以我们使用doc.select方法来选择对应的类。
注意我们这里调用的是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("" + html + "");
}
在上面的代码中,我们处理了每个被查询的 includeitem 元素。找到“a”和“img”,将href元素值修改为绝对路径。
link.attr("abs:href")
上面的代码会得到对应链接的绝对路径,这里的属性是abs:href。同理可以得到图片的绝对路径abs:src。
代码运行后,我们就可以看到修改后的代码,放到li中。
接下来,我们开发一个页面来控制抓取:
在这个页面的实现中,我们使用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 方法初学者指南-第 1 部分
jQuery 库的 AJAX 方法初学者指南-第 2 部分
初学者使用jQuery库的AJAX方法-第三部分
jQuery 库的 AJAX 方法初学者指南-第 4 部分
为了让代码以指定的时间间隔运行爬取,我们将方法放在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和页面元素。默认情况下,该元素是 .includeitem。点击开始爬取,可以看到应用爬取了以下内容:
注意这里的默认间隔是30秒,30秒后会自动检索内容。
可以尝试抓取element.itemt,间隔10秒,可以得到如下内容:
你可以在微博首页看到和自动刷新一样的内容。
您可以将此工具用作重复页面刷新工具,它可以帮助您监控网站 的某个部分。当然,你也可以用它来动态刷新你的网站,提高你的alexa排名。.
希望大家喜欢这个工具应用。如果您有任何建议或问题,请给我们留言!谢谢!
来源:使用java的html解析器jsoup和jQuery实现一个web应用,自动重复抓取任意网站页面指定元素