快速“替”网站提供RSS服务
- 方便的RSS
如今,RSS已经无处不在,从最早的新闻网站,到如今的Weblog,无不充斥着大量的RSS。RSS极大的方便了新闻阅读者。它带来的最大好处就是将被动浏览新闻改成阅读者主动订阅新闻,阅读者不必登陆网站,就可以即时看到自己关心的新闻频道,这样使阅读者摆脱了网站广告和无聊内容的干扰。
Netscape最先提出RSS,它将自己网站的新闻内容组织成RSS,方便网站之间沟通和访问者的阅读和订阅。后来,大家都意识到RSS的方便性和潜在的商业价值,一拥而上,又提出了几个标准,如RSS0.91,RSS0.92,RSS1.0,RSS2.0,ATOM等等。
继Netscape之后,许多网站都开始提供RSS。大量RSS的出现,促使新闻聚合器软件的诞生,它可以方便的使用户订阅自己喜爱频道的RSS。
RSS是一个XML文件,它主要由<channel> 和<item>标签组成,<channel>表示一个新闻频道,<item>表示新闻频道中的新闻条目。
问题
RSS是如此的方便,但是很多网站出于自身利益考虑,比如广告利益,并没有提供RSS。这么好的东西,他们提供怎么办呢?
本文提供一种十分简单,有效的方式分析新闻频道网页内容,生成RSS文件,可以在最短的时间内让你“替”它提供RSS服务:)。
我们将chinadaily的新闻频道http://www.chinadaily.com.cn/english/home/news.html做为分析目标,它是人民日报的英文版,并没有提供RSS。
通过对目标页面的分析,我们发现虽然网页上存在大量的超链接,但是指向新闻内容的链接具有一定规律性。
http://www.chinadaily.com.cn/english/doc/2004-09/09/content_373147.htm
http://www.chinadaily.com.cn/english/doc/2004-09/09/content_372925.htm
http://www.chinadaily.com.cn/english/doc/2004-09/09/content_373132.htm
很明显,chinadaily采用的新闻发布系统生成的新闻具有特定的格式。所以我们只要找到这些符合规律的超链接,就得到了所有的新闻链接,而且过滤掉了无关内容,如广告。
整个过程,包括几个步骤:
- 分析网页,抓取网页得到网页内全部的超链接。
- 分析超链接,得到所有符合要求的超链接。
- 组织RSS并生成RSS文件。
- 输出结果。
- 分析网页
首先抓取网页,然后再根据HTML标签分析网页。这里介绍一个十分好的网页分析开源工具——htmlparser。它是sourceforge下的开源项目,它自描述为“a super-fast real-time parser for real-world HTML”。
Parser parserLink = new Parser("http://www.chinadaily.com.cn/english/home/news.html");
ObjectFindingVisitor visitorLink = new ObjectFindingVisitor(LinkTag.class);
parserLink.visitAllNodesWith(visitorLink);
Node[] links = visitorLink.getTags();
首先,使用解析目标的URL地址构造一个Parser,然后使用visitor,遍历得到所有的超链接。它将返回一个Node数组,对于htmlparser来说,任何一个HTML标签都是一个Node。
分析超链接
经过上一步,我们已经得到目标网站所有的超链接,现在开始分析它,找到符合规律的超链接,它们就是新闻了。
通过分析目标网页中新闻的超链接,我们发现它们全部是以http://www.chinadaily.com.cn/english/doc/开始,最后是content_ 加上几个数字和htm后缀结束的。所以,我们只要找到符合这个规律的超链接就可以了。
这里使用正则表达式,它可以高效快速的实现我们这个需求。
正则表达式如下:
^http://www.chinadaily.com.cn/english/doc/.*/content_//d+//.htm$
“^”表示以“http://www.chinadaily.com.cn/english/doc/”开始;“$”表示以“.htm”结束;中间的“/d”表示任意多个数字;“.*”表示任意多个任意字符。
以下使用正则表达式遍历所有超链接:
for (int i = 0; i < links.length; i++) {
LinkTag linkTag = (LinkTag) links[i];
if (linkTag.getLink().matches(pattern)) {
…………
}
}
- RSS构造器
现在已经得到了所有的新闻超链接,下一步开始构造RSS:)
我们使用十分优秀的开源工具,informa。它也是sourceforge下的开源项目,它的目标是“to provide a news aggregation library based on the Java Platform”。
首先我们构造一个RSS channel。
ChannelIF channel = new Channel();
channel = new Channel("ChinaDaily news");
channel.setLanguage("en");
channel.setSite(new URL(http://www.chinadaily.com.cn/english/home/news.html));
channel.setDescription("This is a demo for topic 'extract news to rss'. All the test material are chinadaily.com.cn's news");
然后,将上一步得到的新闻超链接组织成RSS item,加入到RSS channel中。
if (linkTag.getLink().matches(pattern)) {
item = new Item();
item.setTitle(linkTag.getLinkText());
item.setLink(new URL(linkTag.getLink()));
item.setDescription("please visit " + linkTag.getLink() + " to find more.");
//add item to rss channel
channel.addItem(item);
}
- RSS输出
Ok,到这里,工作已经基本上结束了,只需要把工作结果输出就可以了。
ChannelExporterIF exporter = new RSS_0_91_Exporter(“news.xml”);
exporter.write(channel);
这里使用的同样是informa提供的工具,采用RSS0.91格式输出。
让我们看一下结果。
<rss version="0.91">
<channel>
<title>ChinaDaily news</title>
<description>This is a demo for topic 'extract news to rss'.
All the test materials are chinadaily.com.cn's news</description>
<link>http://www.chinadaily.com.cn/english/home/news.html</link>
<language>en</language>
<item>
<title>・China sends 2 satellites into preset orbits</title>
<link>http://www.chinadaily.com.cn/english/doc/2004-09/09/content_373147.htm</link>
<description>please visit
http://www.chinadaily.com.cn/english/doc/2004-09/09/content_373147.htm
to find more.</description>
</item>
- 结束语
本文介绍了一种十分简单、有效的抽取网页链接并组织成RSS的方法,它让您可以在最短的时间内为一个喜欢的网站提供RSS。但是它仅仅抽取的是新闻标题,如果打算将新闻内容抽取出来,还需要一些改进。
参考资料
分析的目标网站http://www.chinadaily.com.cn/english/home/news.html
网页分析器:http://htmlparser.sourceforge.net/
RSS分析工具:http://informa.sourceforge.net/
一个JAVA写的RSS聚合器:http://rssowl.sourceforge.net/
有关正则表达式http://java.sun.com/docs/books/tutorial/extra/regex/
RSS0.91标准http://my.netscape.com/publish/formats/rss-spec-0.91.html
RSS2.0 标准http://blogs.law.harvard.edu/tech/rss
关于atom http://www.atomenabled.org/