在线抓取网页( 另外一个超棒的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应用,自动重复抓取任意网站页面指定元素

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线