Posted on 2008-11-07 18:18
京山游侠 阅读(4150)
评论(11) 编辑 收藏 所属分类:
J2EE学习及探索
各位朋友,等人等车等吃饭的时候可以干些什么呢?掏出手机看电子书是不错的选择。昨天,我写了一个小程序,基本上可以把新浪读书频道排行榜一网打尽。
程序只用到了Java中的这样一些知识:
1、URL类,用来连接新浪网
2、BufferedReader类,用来读取数据
3、Pattern类和Matcher类,使用正则表达式来提取小说的正文
完整的代码如下:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package ebookdownloaderforsinanzt;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @author 海边沫沫
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
int upbound = Integer.parseInt(args[1]);
for(int i = 1; i<=upbound ; i++){
System.out.println(getParagraph("http://book.sina.com.cn/nzt/lit/"+args[0]+"/",i));
System.out.println();
}
}
private static String getParagraph(String url,int index) {
int status = 0;
String paragraph = "";
try {
URL ebook = new URL(url + index + ".shtml");
BufferedReader reader = new BufferedReader(new InputStreamReader(ebook.openStream()));
String line;
while ((line = reader.readLine()) != null) {
if (status == 0) {
//还没有碰到标题
Pattern pattern = Pattern.compile("(.*)<tr><td class=title14 align=center><font color=red><B>(.*)</B></font></td></tr>(.*)");
Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
paragraph += matcher.group(2);
paragraph += "\n\n";
status = 1;
}
}
if (status == 1) {
//还没有碰到文章的开头
Pattern pattern = Pattern.compile("(.*)<font id=\"zoom\" class=f14><p>(.*)<!--NEWSZW_HZH_BEGIN-->(.*)");
Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
paragraph += matcher.group(2);
status = 2; //碰到了正文中的画中画
}
}
if (status == 2) {
Pattern pattern = Pattern.compile("(.*)<!--NEWSZW_HZH_END-->(.*)</p>");
Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
paragraph += matcher.group(2);
status = 3;
}
}
}
//替换掉</p><p>
return paragraph.replaceAll("</p><p>", "\n\n");
} catch (Exception e) {
System.out.println(e.toString());
return null;
}
}
}
让大家看看截图:
新浪读书频道排行榜:
我写的小程序的运行画面:
下载下来的成果:
最后让大家看看我的IDE,我用上了最新版的NetBeans,还把它的主题改成了苹果样子:
最后要说的是,新浪读书频道上的书,根据URL不同,其源代码的结构也不同,所以要用不同的正则表达式来提取。上面的程序只能提取http://book.sina.com.cn/nzt/lit/小说名/序号.shtml这样的电子书。但是对程序做一点修改是很简单的。