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 程序 , 本身写 一个 邮件 发送的 程序, 将 爬来的 邮箱 逐个 发广告.

  

  感谢 毕网络

相关文章
相关标签/搜索