orsen成長錄

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            3 隨筆 :: 2 文章 :: 0 評論 :: 0 Trackbacks
                 今天想學(xué)學(xué)正則表達式,就隨便寫了個爬蟲。由于才疏學(xué)淺,有不足地方請多多指出。
                  網(wǎng)頁來源,是自己在網(wǎng)上爬寫URL保存到文件中,然后在根據(jù)文件中的URL來找該網(wǎng)頁中的Email地址。具體實現(xiàn)看代碼
          import java.io.BufferedReader;
          import java.io.FileInputStream;
          import java.io.FileNotFoundException;
          import java.io.IOException;
          import java.io.InputStreamReader;
          import java.net.MalformedURLException;
          import java.net.URL;
          import java.util.regex.Matcher;
          import java.util.regex.Pattern;
          /**
           * 網(wǎng)絡(luò)爬蟲
           * 首先要把要爬的網(wǎng)頁先存到文件中
           * 
          @author orsen http://www.aygfsteel.com/orsen/
           *
           
          */

          public class Email {
              
          private BufferedReader reader;
              
          private static int flag = 0;    //統(tǒng)計線程的數(shù)量
              private static long count = 0//統(tǒng)計一同找到的郵件的數(shù)量

              
          //線程內(nèi)部類 每個線程單獨連接一個URL 對其進行操作
              class WW extends Thread {
                  
          //文件中的每一個URL
                  private String tempurl;

                  
          public WW(String url) {
                      
          this.tempurl = url;
                  }


                  
          // 在每個開啟的線程中連接
                  public void run() {
                      
          while (this.isAlive()) {
                          
          try {
                              URL url 
          = new URL(tempurl);
                              String ss;
                              BufferedReader threader 
          = new BufferedReader(
                                      
          new InputStreamReader(url.openStream()));
                              
          while ((ss = threader.readLine()) != null{
                                  
          // 然后在找到網(wǎng)頁中沒行看有沒有匹配的Email
                                  getEmail(ss);
                              }

                          }
           catch (MalformedURLException e) {
                              
          // TODO Auto-generated catch block
                              e.printStackTrace();
                          }
           catch (IOException e) {
                              
          // TODO Auto-generated catch block
                              e.printStackTrace();
                          }

                      }

                      flag 
          --;
                  }

              
                  
          /**
                   * 分析目標(biāo)的頁的一行 找到Email
                   * 
          @param ss one line of target page
                   
          */

                      
          public void getEmail(String ss) {
                          Matcher m 
          = Pattern.compile("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+").matcher(ss);
                          
          while (m.find()) {
                              System.out.println(m.group()
          +"------第----"+count+++"個郵件");
                          }

                      }

              }


              
          public Email() {
                  
          try {
                      
          //"XXXXXXXXXXX"  表示存 要爬的網(wǎng)頁 文件
                      reader = new BufferedReader(new InputStreamReader(new FileInputStream("c:\\www.csdn.net.txt")));
                  }
           catch (FileNotFoundException e) {
                      e.printStackTrace();
                  }
           
              }

          /**
           * 開啟線程,最大開啟39個線程同時同時訪問
           
          */

              
          public void writ() {
                  
          try {
                      String sm;
                      
          // 從文件中讀取50條網(wǎng)站,開啟50個線程。
                      for (int i = 0; i < 10; i++{
                          sm 
          = reader.readLine();
                          WW w 
          = new WW(sm);
                          w.start();
                          flag
          ++;
                      }

                      
          //如果當(dāng)前的線程數(shù)小于20,那么在繼續(xù)開啟新的線程。
                      if(flag < 20 ){
                          
          // 如果還有,那么在條用給方法,形成遞歸。這樣對內(nèi)存消耗非常大。
                          if ((sm = reader.readLine()) != null{
                              writ();
                          }

                      }

                  }
           catch (IOException e) {
                      e.printStackTrace();
                  }

              }



              
          public static void main(String[] args) {
                  
          new Email().writ();
              }

          }

          執(zhí)行結(jié)果如下圖:
           

          由于不會上傳代碼就湊合這看吧。。如果需要請留下Email我將第一時間發(fā)給你。
          posted on 2009-09-24 22:06 Orsen 閱讀(390) 評論(0)  編輯  收藏 所屬分類: Java

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 忻城县| 武陟县| 峨眉山市| 淮滨县| 岳阳市| 阿城市| 营山县| 大同市| 彰武县| 睢宁县| 铁力市| 徐州市| 苏州市| 永春县| 汤阴县| 东至县| 江山市| 湟源县| 元谋县| 卫辉市| 双江| 满城县| 恩施市| 龙海市| 额敏县| 望城县| 蛟河市| 碌曲县| 河津市| 兴宁市| 乌鲁木齐市| 阿克陶县| 崇阳县| 平塘县| 应用必备| 运城市| 张家港市| 萍乡市| 沂水县| 水城县| 德保县|