1.本地爬虫
Pattern:表示正则表达式
Matcher:文本匹配器,作用按照正则表达式的规则去读取字符串,从头开始读取。在大串中去找符合匹配规则的子串。
1.2.获取Pattern对象
通过Pattern p = Pattern.compile("正则表达式");获得
1.3.获取Matcher对象
通过Matcher m = p.matcher(str);获得 (m要在str中找符合p规则的小串)
其中, m为Matcher对象, p为正则表达式规则, str为要验证的字符串.
1.4.匹配文本中的对象
boolean b = m.find(); 表示拿着文本匹配器从头开始读取,寻找是否有满足规则的子串如果没有,方法返回false. 如果有,返回true。在底层记录子串的起始索引和结束索引+1.
1.5.截取文本匹配器的索引
String s = m.group(); 这时文本匹配器会停留在第一个匹配文本的结束索引+1处, 返回一个文本中索引为(0,4)不包含4索引的字符串(符合规则的).
1.6.继续匹配和获取索引
重复第4步和第五步, 从上一次停留的地方开始向后查找.
第4步和第5步一般通过while(m.find()){}循环实现.
String s = "电话12345678901, 邮箱123@qq.com";
// 写正则表达式
String regex = "([1]\\d{10}|\\w{1,}@[\\w&&[^-]]{2,}([.][c][omn]{1,3})+)";
// 生成正则对象
Pattern pattern = Pattern.compile(regex);
// 生成匹配器对象
Matcher matcher = pattern.matcher(s);
// 用循环去读取匹配的内容
while (matcher.find()) {
// 获取匹配的字符串
String group = matcher.group();
System.out.println(group);
}
2.网络爬虫
// 创建一个URL对象
URL url = new URL("https://blog.csdn.net/Orange_sparkle?type=lately");
// 连接网址
URLConnection conn = url.openConnection();
// conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
// 创建对象读取数据
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
// conn.setRequestProperty("User-Agent", "Mozilla/4.76");
String information;
// 获取正则表达式对象pattern
// String regex = "";
// Pattern pattern = Pattern.compile(regex);
// 在读取的时候每次读一行
while ((information = bufferedReader.readLine()) != null) {
System.out.println(information);
// Matcher matcher = pattern.matcher(information);
// while (matcher.find()){
// System.out.println(matcher.group());
// }
}bufferedReader.close();
3.有条件的爬取数据
? 代表的是前面的数据, 后面的一个符号加正则表达式的意思是后面需要跟随的数据.
如果不看符号表示的就是需要匹配Java(8|11|17)这个字符串. 而其中的符号表示如下 :
=表示只获取等号之前的数据, 忽略之后的.
: 表示冒号前后都获取
! 表示获取除了感叹号之后的数据
除了设置正则表达式不同, 之后的步骤都和之前一样
4.贪婪爬取和非贪婪爬取
贪婪爬取 : 在爬取数据的时候尽可能的多获取数据 (如:abbbbbbbbbbbb)
非贪婪爬取 : 在爬取数据的时候尽可能的少获取数据 (如:ab)
Java当中,默认的就是贪婪爬取
如果我们在数量词+*的后面加上问号,那么此时就是非贪婪爬取
5.正则表达式在字符串中的使用
先创建一个正则表达式规则, 然后传入字符串方法中, 返回的就是新的替换后的字符串或切割后的字符串数组了.
6.分组
红色为第一组, 蓝色为第二组, 绿色为第三组
6.1.捕获分组
\\组号表示的就是把该组匹配的内容在匹配一遍, 两部分的内容相同.
在外部使用本组数据需要用到$组号.
6.2非捕获分组
特点:不占用组号