京山游侠

专注技术,拒绝扯淡
posts - 50, comments - 868, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
各位朋友,等人等车等吃饭的时候可以干些什么呢?掏出手机看电子书是不错的选择。昨天,我写了一个小程序,基本上可以把新浪读书频道排行榜一网打尽。

程序只用到了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;
        }
    }
}

让大家看看截图:

新浪读书频道排行榜:
01.PNG

我写的小程序的运行画面:
02.PNG

下载下来的成果:
03.PNG

最后让大家看看我的IDE,我用上了最新版的NetBeans,还把它的主题改成了苹果样子:
04.PNG

最后要说的是,新浪读书频道上的书,根据URL不同,其源代码的结构也不同,所以要用不同的正则表达式来提取。上面的程序只能提取http://book.sina.com.cn/nzt/lit/小说名/序号.shtml这样的电子书。但是对程序做一点修改是很简单的。

评论

# re: 写个小程序将新浪读书频道一网打尽  回复  更多评论   

2008-11-07 19:09 by jestane
不错,楼主是个喜欢动手的人啊,学习了

# re: 写个小程序将新浪读书频道一网打尽  回复  更多评论   

2008-11-07 20:49 by walk
不错啊 偶喜欢

# re: 写个小程序将新浪读书频道一网打尽  回复  更多评论   

2008-11-07 22:29 by 矿矿
相当牛逼!叼 学习!!!

# re: 写个小程序将新浪读书频道一网打尽  回复  更多评论   

2008-11-07 23:06 by 黑蝙蝠
顶一个再说 呵呵

# re: 写个小程序将新浪读书频道一网打尽[未登录]  回复  更多评论   

2008-11-08 19:46 by 的的
不错,学到了,做程序就是要勤动手...

# re: 写个小程序将新浪读书频道一网打尽[未登录]  回复  更多评论   

2008-11-08 20:19 by 海边沫沫
还有一点要注意,对于有些系统,需要把程序中的"\n\n"换成"\r\n\r\n"才能够表现出完美的换行。比如Windows自带的记事本和我的一个MP4需要"\r\n",而我的手机则只要"\n"。

# re: 写个小程序将新浪读书频道一网打尽  回复  更多评论   

2008-11-09 08:53 by ITGXG

# re: 写个小程序将新浪读书频道一网打尽  回复  更多评论   

2008-11-12 13:53 by wavefly
太彪悍了

# re: 写个小程序将新浪读书频道一网打尽  回复  更多评论   

2008-11-16 18:00 by tianming
那个名字就是拼音了,
请问那个序号怎么知道呢

# re: 写个小程序将新浪读书频道一网打尽  回复  更多评论   

2009-05-27 19:35 by http://www.bcstudy.cn
我也写了一个,不过是做成电子书CHM的。

# re: 写个小程序将新浪读书频道一网打尽  回复  更多评论   

2011-01-27 08:51 by jobs
小说名和序号怎么得到呢!

只有注册用户登录后才能发表评论。


网站导航: