抓取jsp网页源代码( 另外一个超棒的Java的HTML解析器-jsoup-)

优采云 发布时间: 2022-02-25 14:03

  抓取jsp网页源代码(

另外一个超棒的Java的HTML解析器-jsoup-)

  

  在线演示 本地下载

  如果您曾经开发过内容聚合类网站,那么使用程序动态集成来自不同页面或网站 程序的内容的能力对您来说肯定非常熟悉。通常,如果我们使用java,我们会使用一些HTML解析,例如httpparser。最早的集成搜索是利用httpparser抓取谷歌和百度的搜索结果,并集成呈现给搜索用户,这就是GBin1域名的由来。

  所以今天,我们介绍另一个很棒的Java HTML解析器——jsoup,这个类库可以帮助你实时处理HTML。提供非常方便的 API 来提取和处理数据。最重要的是它使用类似jQuery的语法来处理DOM、CSS等。如果你使用过jQuery,你就会知道它处理DOM的强大和方便。

  主要特点

  jsoup 实现了 WHATWG HTML5 标准,与现代浏览器解析 DOM 的方式相同。主要功能:

  基本上jsoup可以帮你处理各种HTML问题,帮你验证非法标签,创建干净的DOM树。

  实现抓取功能

  这里我们将实现一个简单的抓取功能,你只需要指定url,并指定你需要抓取的具体元素,例如ID或者class。在后台我们将使用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 方法 - 第二部分

  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文件后,会看到如下界面:

  8、

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线