从零开始学Java-正则表达式:爬虫

149 阅读4分钟

在上一篇文章中,我们学习了正则表达式的第一个作用:校验字符串的规则,下面我们来学习第二个作用:查找满足的内容吧,简称:爬虫

爬虫又分两种:本地爬虫网络爬虫

我们先来学习一下本地爬虫吧:

本地爬虫

  • 有如下文本,请按照要求爬取数据。
    • Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Iava8和Iava11,因为这两个是长期支持版本,下一个长期支持版本是|ava17,相信在未来不久Java17也会逐渐登上历史舞台
    • 要求:找出里面所有的JavaXX

第一步:定义字符串

String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
        "因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";

第二步:获取要爬取的正则表达式对象

Pattern p = Pattern.compile("Java\d{0,2}");

第三步:获取文本匹配器对象

// 拿着m去读取str,找到符合p的规则的字串
Matcher m=p.matcher(str);

第四步:循环读取

while (m.find()){
    String s = m.group();
    System.out.println(s);
}

我们下面来运行看一下:

image.png

是不是全部都获取出来了呀!下面我们来学习一下网络爬虫吧:

网络爬虫

下面我们随便找了一个身份证的网站:new.guguyu.com/sfz/

image.png

将他们的身份证号码全部爬取出来,我们一起来看一下吧:

第一步:创建一个URL对象

URL url = new URL("https://new.guguyu.com/sfz/");

第二步:连接上这个网络

URLConnection conn = url.openConnection();

第三步:创建一个对象去读取网络中的数据

BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));

第四步:获取正则表达式对象

String regex="[1-9]\d{17}";
Pattern pattern = Pattern.compile(regex);

第五步:循环读取

String line;
// 在读取的时候每次读一整行
while((line =br.readLine())!= null){
    // 拿着文本匹配器的对象Matcher按照pattern的规则去读取当前这一行的信息
    Matcher matcher=pattern.matcher(line);
    while (matcher.find()){
        System.out.println(matcher.group());
    }
}

我们来看一下:

image.png

是不是将身份证全部都爬取出来了呀!下面我们来学习一下有条件的爬取吧

有条件的爬取数据

下面我们还是来看第一个例子:

有如下文本,请按照要求爬取数据。 Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Iava8和Iava11, 因为这两个是长期支持版本,下一个长期支持版本是|ava17,相信在未来不久Java17也会逐渐登上历史舞台

  1. 需求1:爬取版本号为8,11,17的Java文本,但是只要Java,不显示版本号。
  2. 需求2:爬取版本号为8,11,17的java文本。正确爬取结果为:Java8 Java11 Java17 Java17
  3. 需求3:爬取除了版本号为8,11,17的Java文本

下面我们一起来实操一下吧:

  • 需求1
// 1.定义一个字符串
String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
        "因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";

// 2.定义正则表达式
// ?理解为前面的数据java
// =表示在java后面要跟随的数据
// 但是在读取的时候,只读取前半部分
String regex = "Java(?=8|11|17)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
while (m.find()) {
    System.out.println(m.group());
}

image.png

是不是和需求一样呀,由于第一个Java没有版本号,所有没有爬取出来噢!

  • 需求2
// 1.定义一个字符串
String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
      "因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
                
// 需求2
String regex1 = "Java(8|11|17)";
Pattern p1 = Pattern.compile(regex1);
Matcher m1 = p1.matcher(str);
while (m1.find()) {
    System.out.println(m1.group());
}

我们来打印看一下:

image.png

是不是把全部带有版本号的全部爬取出来了呀!

  • 需求3
// 1.定义一个字符串
String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +
      "因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
      
// 需求3
String regex2 = "((?i)Java)(?!8|11|17)";
Pattern p2 = Pattern.compile(regex2);
Matcher m2 = p2.matcher(str);
while (m2.find()) {
    System.out.println(m2.group());
}

image.png

是不是将除了版本号以外的Java全部爬取出来了呀!

好啦,这篇文章就学习到这里。以上就是一个简单的正则表达式的第二个作用,捕获查找满足正则表达式的内容,简称简单的爬虫,我们下期不见不散!!!

==最后非常感谢您的阅读,也希望能得到您的反馈  ==