京山游俠

          專注技術,拒絕扯淡
          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
          小說名和序號怎么得到呢!

          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 汉寿县| 板桥市| 察雅县| 铁岭县| 曲松县| 扬中市| 库车县| 新疆| 邵阳市| 茶陵县| 公安县| 南平市| 孙吴县| 叶城县| 乐都县| 樟树市| 临潭县| 松滋市| 大宁县| 武宁县| 福安市| 金川县| 靖宇县| 庆云县| 彭州市| 恭城| 永济市| 沧州市| 兴城市| 芮城县| 乐平市| 明溪县| 三明市| 泉州市| 邳州市| 镇赉县| 江孜县| 海阳市| 昭苏县| 瓮安县| 都昌县|