在上一篇文章中,我们学习了正则表达式的第一个作用:校验字符串的规则,下面我们来学习第二个作用:查找满足的内容吧,简称:爬虫。
爬虫又分两种:本地爬虫和网络爬虫
我们先来学习一下本地爬虫吧:
本地爬虫
- 有如下文本,请按照要求爬取数据。
- 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);
}
我们下面来运行看一下:
是不是全部都获取出来了呀!下面我们来学习一下网络爬虫吧:
网络爬虫
下面我们随便找了一个身份证的网站:new.guguyu.com/sfz/
将他们的身份证号码全部爬取出来,我们一起来看一下吧:
第一步:创建一个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());
}
}
我们来看一下:
是不是将身份证全部都爬取出来了呀!下面我们来学习一下有条件的爬取吧
有条件的爬取数据
下面我们还是来看第一个例子:
有如下文本,请按照要求爬取数据。 Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Iava8和Iava11, 因为这两个是长期支持版本,下一个长期支持版本是|ava17,相信在未来不久Java17也会逐渐登上历史舞台
- 需求1:爬取版本号为8,11,17的Java文本,但是只要Java,不显示版本号。
- 需求2:爬取版本号为8,11,17的java文本。正确爬取结果为:Java8 Java11 Java17 Java17
- 需求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());
}
是不是和需求一样呀,由于第一个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());
}
我们来打印看一下:
是不是把全部带有版本号的全部爬取出来了呀!
- 需求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());
}
是不是将除了版本号以外的Java全部爬取出来了呀!
好啦,这篇文章就学习到这里。以上就是一个简单的正则表达式的第二个作用,捕获查找满足正则表达式的内容,简称简单的爬虫,我们下期不见不散!!!
==最后非常感谢您的阅读,也希望能得到您的反馈 ==