在线抓取网页(使用java的html解析器jsoup和jQuery实现一个自动重复任意网站页面指定元素的web应用在线演示)

优采云 发布时间: 2022-02-22 20:31

  在线抓取网页(使用java的html解析器jsoup和jQuery实现一个自动重复任意网站页面指定元素的web应用在线演示)

  使用java的html解析器jsoup和jQuery实现一个自动重复抓取任意网站页面的指定元素的web应用

  在线演示 本地下载

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

  所以今天,我们介绍另一个很棒的Java HTML parser-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代码如下:

  在上面的代码中,我们定义了jsoup使用一个url来获取HTML,这里就用到了。本页列出了 gbin1 最近发布的 文章。如果查看此页面的源代码,可以看到每个 文章 都在 .includeitem 类中。因此,我们使用 doc.select 方法来选择对应的类。

  注意我们这里调用了timeout(0),意思是连续请求url,默认2000,即2秒后超时。可以看到这里使用了类似jQuery的链式调用,非常方便.

  在上面的代码中,我们处理了每个被查询的 includeitem 元素。找到“a”和“img”,将其中的href元素值修改为绝对路径。

  1link.attr("abs:href")

2

  上面的代码会得到对应链接的绝对路径,其中属性为abs:href。同理可以得到图片abs:src的绝对路径。

  代码运行后,我们可以看到修改后的代码,把它们放在li中。

  接下来我们开发控制爬取的javascript页面:

  在这个页面的实现中,我们使用setInterval方法,以指定的时间间隔,调用上面使用ajax开发的java代码。基本代码如下:

  1//Run for first time

2$('#msg').html('请耐心等待, 页面抓取中 ...').fadeIn(400);

3//$('#content').html('');

4$('#content').load('siteproxy.jsp #result', {url:url, elem:element}, function(){

5 $('#msg').html('抓取已完成').delay(1500).fadeOut(400);

6})

7

  上面的代码非常简单。我们使用jQuery的load方法调用siteproxy.jsp,然后在siteproxy.jsp的生成页面中获取#result元素,即抓取内容。如果对jQuery的ajax方法不熟悉,请参考本系列文章:

  jQuery 类库初学者指南的 AJAX 方法 - 第 1 部分

  jQuery 类库初学者指南之 AJAX 方法 - 第二部分

  jQuery 类库初学者指南 - 第 3 部分的 AJAX 方法 jQuery 类库初学者指南 - 第 4 部分的 AJAX 方法

  为了让代码以指定的时间间隔运行爬取,我们将方法放在 setinterval 中如下:

  1runid = setInterval(

2function getInfo(){

3 $('#msg').html('请耐心等待, 页面抓取中 ...').fadeIn(400);

4 //$('#content').html('');

5 $('#content').load('siteproxy.jsp #result', {url:url, elem:element}, function(){

6 $('#msg').html('抓取已完成').delay(1500).fadeOut(400);

7 })

8}, interval*1000);

9

  通过上述方法,我们可以在用户触发抓取后每隔指定时间触发抓取动作。

  完整的js代码如下:

  1$(document).ready(function(){

2 var url, element, interval, runid;

3 $('#start').click(function(){

4 url = $('#url').val();

5 element = $('#element').val();

6 interval = $('#interval').val();

7

8 //Run for first time

9 $('#msg').html('请耐心等待, 页面抓取中 ...').fadeIn(400);

10 //$('#content').html('');

11 $('#content').load('siteproxy.jsp #result', {url:url, elem:element}, function(){

12 $('#msg').html('抓取已完成').delay(1500).fadeOut(400);

13 })

14

15 runid = setInterval(

16 function getInfo(){

17 $('#msg').html('请耐心等待, 页面抓取中 ...').fadeIn(400);

18 //$('#content').html('');

19 $('#content').load('siteproxy.jsp #result', {url:url, elem:element}, function(){

20 $('#msg').html('抓取已完成').delay(1500).fadeOut(400);

21 })

22 }, interval*1000);

23 });

24

25 $('#stop').click(function(){

26 $('#msg').html('抓取已暂停').fadeIn(400).delay(1500);

27 clearInterval(runid);

28 });

29

30});

31

  部署上面的jsp和html文件后,会看到如下界面:

  我们需要设置要抓取的url和页面元素。默认情况下,该元素是 .includeitem。点击开始爬取,可以看到应用爬取了以下内容:

  注意这里默认的间隔是30秒,30秒后会自动重新爬取内容。

  可以尝试抓取element.itemt,间隔10秒,可以得到如下:

  可以看到和微博首页的自动刷新内容一样。

  你可以把这个工具当作一个页面刷新工具,它可以帮你监控一个网站的某部分内容,当然你也可以用它来动态刷新你的网站,提高你的网站 Alexa排名。

  希望大家喜欢这个工具应用程序,如果您有任何建议和问题,请给我们留言!谢谢!

  来源:使用java的html解析器jsoup和jQuery实现一个自动重复抓取任意网站页面的指定元素的web应用

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线