orsen成長錄

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            3 隨筆 :: 2 文章 :: 0 評論 :: 0 Trackbacks
                 今天想學學正則表達式,就隨便寫了個爬蟲。由于才疏學淺,有不足地方請多多指出。
                  網頁來源,是自己在網上爬寫URL保存到文件中,然后在根據文件中的URL來找該網頁中的Email地址。具體實現看代碼
          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;
          /**
           * 網絡爬蟲
           * 首先要把要爬的網頁先存到文件中
           * 
          @author orsen http://www.aygfsteel.com/orsen/
           *
           
          */

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

              
          //線程內部類 每個線程單獨連接一個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{
                                  
          // 然后在找到網頁中沒行看有沒有匹配的Email
                                  getEmail(ss);
                              }

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

                      }

                      flag 
          --;
                  }

              
                  
          /**
                   * 分析目標的頁的一行 找到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"  表示存 要爬的網頁 文件
                      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條網站,開啟50個線程。
                      for (int i = 0; i < 10; i++{
                          sm 
          = reader.readLine();
                          WW w 
          = new WW(sm);
                          w.start();
                          flag
          ++;
                      }

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

                      }

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

              }



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

          }

          執行結果如下圖:
           

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

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


          網站導航:
           
          主站蜘蛛池模板: 长武县| 安阳市| 叙永县| 泗阳县| 通化县| 宜都市| 河池市| 隆昌县| 兰考县| 兖州市| 山东| 洪泽县| 谷城县| 龙门县| 平顺县| 崇义县| 克东县| 当涂县| 含山县| 利辛县| 太谷县| 吴旗县| 米易县| 龙泉市| 建昌县| 乌什县| 金山区| 赤水市| 土默特右旗| 宜君县| 仁化县| 山西省| 漯河市| 武清区| 潮州市| 工布江达县| 登封市| 庆阳市| 报价| 太谷县| 东宁县|