Java 正則表達式_網絡爬蟲

 

首先 須要瞭解 一些 關於 網絡爬蟲的 基本知識:html

網絡爬蟲: 所謂的 爬蟲 就是一個 應用 程序, 這個 應用 程序 會 獲取 網絡中的 指定信息(網頁 數據).

例如百度: 啓動 這個 爬蟲 程序 會 自動 的 將 一些 網頁 數據 獲取 來 存到 百度的服務器上 提升了 搜索 效率.

咱們搜索的 時候 , 其實 搜索的 不是 網絡中的 內容, 而是 百度中的 內容, 而 百度就將 全部的 互聯網中的 數據 爬到 它 的服務器上邊 供人們 搜索.正則表達式

 

咱們 也能夠 寫一個 程序 去獲取 網絡中的 指定 資源.

例如: 獲取 網絡中的 郵箱(郵件地址), 用來 發廣告.
網絡 爬蟲: 實際上是一個 應用程序, 獲取 網絡中的 指定信息(符合 指定 規則的信息). String regex數據庫

 

這個例子中 須要用到的 Java 技術有:  List 集合  Java 正則 表達式  Java IO 流 技術  Java 網絡 編程技術.編程

 

代碼以下:   這段 代碼 有一段 時 基於 本地文件的, 我在 爬 網絡 上的 資源時 先 試驗了 一下 本地的 文件.服務器

 

  1     案例:  獲取 網絡中的 郵件 地址.
  2             
  3             // *** 不管是 文件 仍是 網絡 僅僅是 數據源 變了.
  4          */
  5         
  6         
  7         // *** 從 網頁 的 那些 字符串中 去 獲取 郵箱. find();
  8         
  9         File file = new File("tempfile\\mail.html");
 10         
 11         
 12         String regex = "\\w+@\\w+(\\.\\w+)+";   
 13         
 14         // *** 告訴 去哪裏 爬 數據, 按照 什麼 規則爬.
 15         // List<String> list = getMails(file,regex);  // *** 獲得的 數據先 存到 集合中, 而後 遍歷集合 再 存到 數據庫中.
 16         
 17         
 18         String str_url = "http://bbs.tianya.cn/post-enterprise-401802-6.shtml";
 19         List<String> list = getMailsByNet(str_url, regex);
 20         
 21         
 22         
 23         for(String mail : list) {
 24             
 25             System.out.println("List: "  + mail);  // *** 應該 存到 數據庫中.
 26             
 27         }
 28         
 29         
 30     }
 31     
 32     // *** 基於 網絡.
 33     
 34     public static List<String> getMailsByNet(String str_url, String regex) throws IOException{
 35         
 36         // 1. 將 str_url 封裝成 URL 對象, 由它來 幫咱們解析.
 37         
 38         List<String> list = new ArrayList<String>();
 39         
 40         URL url = new URL(str_url);
 41         
 42         // 2. 打開鏈接.
 43         
 44         URLConnection conn = url.openConnection();
 45         
 46         // 3. 獲取 讀取流.
 47         
 48         InputStream in = conn.getInputStream();
 49         // *** 將 字節流 轉換成 字符流, 加 高效, 一次 讀一行, 由於 正則 表達式 只對 字符串 有效.
 50         
 51         BufferedReader bufIn = new BufferedReader(new InputStreamReader(in));
 52         
 53         // 4. 將 正則表達式 編譯成 對象.
 54         
 55         Pattern p = Pattern.compile(regex);
 56         
 57         // 5. 讀取數據.
 58         
 59         String line = null;
 60         
 61         while((line = bufIn.readLine()) != null) {
 62             
 63             Matcher m = p.matcher(line);
 64             
 65             while(m.find()) {
 66                 
 67                 list.add(m.group());
 68                 
 69             }
 70             
 71             
 72         }
 73         
 74          // *** 關閉資源.
 75         bufIn.close();
 76         
 77         // *** 返回集合.
 78         return list;
 79         
 80         
 81     }
 82     
 83     
 84     // *** 基於 本地文件.
 85 
 86     // *** List 能夠 存 重複的, Set 集合 不能夠 存重複的.
 87     public static List<String> getMails(File file, String regex) throws IOException {
 88         
 89         // *** 建立一個 集合 , 存取 爬 到的 郵箱 數據.
 90         
 91         List<String> list = new ArrayList<String>();
 92         
 93         
 94         // 1. 讀取文件. 加 高效, 一次 讀 一行.
 95         
 96         BufferedReader bufr = new BufferedReader( new FileReader(file));
 97         
 98         // 2. 將 正則 規則 編譯成 對象.
 99         
100         Pattern p = Pattern.compile(regex);
101         
102         String line = null;
103         
104         while((line = bufr.readLine())!=null) {
105             
106             Matcher m = p.matcher(line);  // *** 文本 和 正則 對象 關聯.
107             
108             
109             while(m.find()) { 
110                 
111                 // System.out.println(m.group());  // *** 先存起來 , 建立 一個  集合.
112                 
113                 list.add(m.group()); // *** 存到 集合中.
114             }
115         }
116         
117         
118     //    System.out.println(line);
119         
120         // *** 必定要 關閉 資源.
121         bufr.close();
122         
123         // *** 返回 集合.
124         return list;
125         
126         
127     }
128 }
129 
130 // *** 瘋狂爬 網頁的實現,  只要保證 一點, 網址(URL) 一直在 變化, 能夠 爬 到 網頁中的  超連接 時, 修改 網址 進到 超連接的 網址, 如此下去 ,即是 瘋狂爬.  掛一天,  哈哈!!!
131 
132 // *** 等 學習了 Javamail 程序 , 本身寫 一個 郵件 發送的 程序, 將 爬來的 郵箱 逐個 發廣告.

  

  感謝 畢網絡

相關文章
相關標籤/搜索