#JAVA-常用API-爬虫

1.爬虫

我们在正则表达式的讲解中可以使用字符串的方法materchs()来匹配,并且返回一个boolean

String name = "lshhhljh";
System.out.println(name.matches("lsh{3}\\s{3}"));
//true

现在我们将利用正则表达式来爬取本地或者网站上的文本内容

a.本地文本

在此之前我们先学习一下两个会用到的类

  • Pattern:表示正则表达式
  • Matcher:表示文本匹配器,按照正则表达式的规则去读取字符串,从头开始读取

Matcher表示在大串中获取符合规则的子串

我们来简单介绍一下这两个类:

  • Pattern:
    • 编译正则表达式:用于将正则表达式字符串编译为一个模式对象,这个编译后的对象可以高效的应用于多次匹配操作
    • 创建Matcher对象
  • Matcher:用于对输入的字符串进行基于正则表达式的匹配操作。它与Pattern类紧密相连

通过例子来介绍这Matcher的方法:

 String s = "文章包括各种文体的著作、作品,如诗歌、戏剧、小说、" +"科学论文,记叙文、议论文、说明文、应用文等等。" +"“千古文章未尽才”“文章千古事”“文章憎命达”“板凳要坐十年冷、文章不写一字空”" +"“积句而成章,积章而成篇”“言出为论,下笔成章”等";
Pattern p = Pattern.compile("文章");
Matcher matcher = p.matcher(s);
boolean b = matcher.find();
String s1 = matcher.group();
System.out.println(s1);

输出的结果是:文章

  1. boolean b = matcher.find()

拿着文本匹配器从头开始读取,寻找是否有满足规则的子串

  • 如果没有,方法返回false
  • 如果有,返回true。在底层记录子串的起始索引和结束索引+1
  1. String s1 = matcher.group()
  • 方法底层会根据find方法记录的索引进行字符的截取
  • 使用的是subString(起始索引,结束索引)包头不包尾。会把截取的小串进行返回。

所以find方法记录的索引才是结束索引+1


但是上述的代码只能返回一个匹配的结果,所以我们需要用到循环

 Pattern p = Pattern.compile("文章");Matcher matcher = p.matcher(s);while (matcher.find()) {String s1 = matcher.group();System.out.println(s1);}

在代码中需要我们注意的是我们需要反复的调用find方法,所以在while循环中要把find方法放进去。

find方法在多次调用时会依次往字符串的后面查找,所以可以使用循环找到所有的结果

b.网络文本

说明:略
代码示例:

//创建一个URL对象
URL url = new URL( spec: "https://m.sengzan.com/jiaoyu/29104.html?ivk_sa=1025883i");
//连接上这个网址
//细节:保证网络是畅通
URLConnection conn = url. openConnection();
//创建一个对象去读取网络中的数据
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
//获取正则表达式的对象 pattern
String regex = "[1-9]\\d{17}";
Pattern pattern = Pattern.compile(regex);
//在读取的时候每次读一整行
while ((line = br.readLine()) != null) {//拿着文本匹配器的对象matcher按照pattern的规则去读取当前的这一行信息Matcher matcher = pattern.matcher(line);while(matcher.find()){System.out.println(matcher.group());
}
br.close();

2.带条件爬取

有的时候我们要对爬取的内容作限制和修改,就用到了待条件爬取的规则

我们先看一个例子:来自黑马程序员

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

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

代码示例:

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

输出的结果是4个Java
String regex = "Java( ?= 8|11|17)"中括号中的部分只是当作了限制条件,但是不会被输出。

  • ? 在这里被当作占位符,可以理解为前面的Java
  • =表示在占位符后面要跟的数据,在这里是指要获取的子串的Java后面要跟的数据
  • |表示“或者”的意思

因为第一个Java后面没有跟版本数字所以没有被打印

补充:((?i)Java)( ?= 8|11|17) ---- 第一个(?i)表示Java在匹配的时候忽略大小写,第二个? 表示前面的((?i)Java)


需求二:爬取版本号为8,11,17的Java文本。正确爬取结果为:Java8Java11 Java17Java17

  1. 第一种方法,不使用? 作为占位符
String regex = "Java(8|11|17)";
  1. 第二种方法:使用?
String regex = "Java(?:8|11|17)";

这两种方式都是可以满足上面的要求的


需求三:爬取除了版本号为8,11,17的Java文本

String regex = "Java(?!8|11|17)";

只需要修改正则表达式即可
在这里:表示去除的意思


4. 贪婪爬取和非贪婪爬取

我们前面介绍过正则表达式的数量词,其中有这两个:

  • * :表示 * 前面这个字符匹配零次或多次
  • + :表示 + 前面这个字符匹配一次或多次

那到底是匹配一次还是多次呢?
在Java编译器种默认的匹配机制是贪婪爬取:就是尽可能多的进行匹配

例如:

abbbbbbbbbbbaaaaa

这段字符,如果正则表达式为:ab+

  • 贪婪爬取:abbbbbbbbbbb
  • 非贪婪爬取:ab

默认的爬取方式为贪婪爬取,我们怎么样使用非贪婪爬取呢?

  • ab+?
  • ab*?

在正则表达式的后面加上一个?即可


5.正则表达式在字符串方法中的使用

返回值是字符串类型的方法中正则表达式的使用

方法名说明
public boolean matches(String regex)判断字符串是否满足正则表达式的规则
public String replaceAll(String regex,String newStr)按照正则表达式的规则进行替换
public String[] split(String regex)按照正则表达式的规则切割字符串

代码示例:

有一段字符串:小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠

  • 要求1:把字符串中三个姓名之间的字母替换为vs
  • 要求2:把字符串中的三个姓名切割出来
String s="小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠";
//细节:
//方法在底层跟之前一样也会创建文本解析器的对象
//然后从头开始去读取字符串中的内容,只要有满足的,那么就用第二个参数去替换。
String resut1 = s.replaceAll("[\\w&&[^_]]+", "vs");
System.out.println(resut1);//要求二
String[] arr = s.split( regex: "[\\w&&[^_]]+");
for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);
}

第二个切割的方法就是按照正则表达式去切割,把正则表达式匹配到的字符串当作断点切割


6.捕获分组和非捕获分组

题目的分组是针对正则表达式来说的
分组:就是正则表达式中的小括号:()

我们给出代码示例:

//简易身份证号码
String regex1 = "\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2})";
//邮箱号
String regex2 = "[1-9]\d{16}(\\d|x|x)";
//24小时时间的两种方式
String regex3 = "([01]\\d|2[0-3]): [0-5]\\d: [0-5]\d"
String regex4 = "([01]\d|2[0-3])(:[0-5]\\d){2}"

用括号表示分组,再使用分组进行复用


同时我们需要知道,分组其实是有序号的:

(\\d(\\d))(\\d)
1    2      3

分组的序号是看左括号进行排序的

a.捕获分组

就是把这一组的数据捕获出来再使用一次
代码示例:

//需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符
//举例: abc123abc    b456b   123789123  &!@abc&!@  abc123abd(false)
String regex2 = "(.+).+\\1";
System.out.println("abc123abc".matches(regex2));
System.out.println("b456b".matches(regex2));
System.out.println("123789123".matches(regex2));
System.out.println("&!@abc&!@".matches(regex2));
System.out.println("abc123abd".matches(regex2));

代码示例二:

String str="我要学学编编编编程程程程程程”;
//需求:把重复的内容 替换为 单个的
//学学
//编编编编
//程程程程程程
//(.)表示把重复内容的第一个字符看做一组
//\\1 表示第一字符再次出现
//+至少一次
//$1 表示把正则表达式中第一组的内容,再拿出来用
String result = str.replaceAll( regex:"(.)\\1+", replacement: "$1");
System.out.println(result);

String result = str.replaceAll( regex:"(.)\\1+", replacement: "$1")这行代码在进行替换的时候仍然使用了第一组的内容。所以使用了$组号

因为是在正则表达式的外部使用组号,所以需要使用这个符号:$


b.非捕获分组

非捕获分组:
分组之后不需要再用本组数据,仅仅是把数据括起来。

符号含义举例
( ?: 正则)获取所有Java( ?: 8|11|17)
( ?= 正则)获取前面部分Java( ?= 8|11|17)
( ?! 正则)获取不是指定内容的前面部分Java( ?! 8 | 11|17)
非捕获分组不占用组号,仅仅是把数据括起来,并且括号内的数据是否进行获取还要看非捕获分组的分类

代码示例:前面的Java字符串案例,这里不再赘述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/483529.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pycharm链接neo4j数据库(简单)

1.安装pycharm 2.安装库 pip install py2neo -i https://pypi.tuna.tsinghua.edu.cn/simple 3.代码试运行 from py2neo import Graph, Node, Relationship# 连接到Neo4j数据库&#xff0c;使用Bolt协议 graph Graph("bolt://localhost:7687", auth("neo…

故障诊断 | Transformer-LSTM组合模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | Transformer-LSTM组合模型的故障诊断(Matlab) 源码设计 %% 初始化 clear close all clc disp(此程序务必用2023b及其以上版本的MATLAB!否则会报错!) warning off %

flask的第一个应用

本文编写一个简单的实例来记录下flask的使用 文章目录 简单实例flask中的路由无参形式有参形式 参数类型不同的http方法本文小结 简单实例 flask的依赖包都安装好之后&#xff0c;我们就可以写一个最简单的web应用程序了&#xff0c;我们把这个应用程序命名为first.py: from fl…

jmeter 压测常用静默参数解释应用

简介&#xff1a; JMeter静默压测&#xff08;即无界面压测&#xff09;是一种常用的性能测试方法&#xff0c;用于模拟多个用户同时访问系统并测量系统的响应时间和吞吐量等关键性能指标。在JMeter静默压测中&#xff0c;常用的压测参数及其解释如下&#xff1a; 一、基本…

《Python基础》之Pandas库

目录 一、简介 二、Pandas的核心数据结构 1、Series 2、DataFrame 三、数据读取与写入 1、数据读取 2、数据写入 四、数据清洗与处理 1、处理缺失值 2、处理重复值 3、数据转换 五、数据分析与可视化 1、统计描述 2、分组聚合 3、数据可视化 六、高级技巧 1、时…

【C语言】结构体(四)

本篇重点是typedef关键字 一&#xff0c;是什么&#xff1f; typedef用来定义新的数据类型&#xff0c;通常typedef与结构体的定义配合使用。 简单来说就是取别名 ▶ struct 是用来定义新的数据类型——结构体 ▶ typedef是给数据类型取别名。 二&#xff0c;为什么&#xf…

12月2日星期一今日早报简报微语报早读

12月2日星期一&#xff0c;农历十一月初二&#xff0c;早报#微语早读。 1、公安部&#xff1a;全国机动车所有人12月2日起均可申领电子行驶证&#xff1b; 2、2025年国考笔试开考&#xff1a;参考率约为86.7%&#xff0c;约65人录1人&#xff1b; 3、今日头条、拼多多等9款A…

Navicat连接SQL Server及SpringBoot连接SQL Server(jtds)

Navicat连接SQL Server 安装自带的SQL Server客户端 去到Navicat安装目录&#xff0c;找到安装程序&#xff0c;安装即可。 安装对应版本的Microsoft ODBC Driver for SQL Server 打开Navicat输入对应的SQL Server相关信息 然后点测试连接&#xff0c;提示连接成功。 Spr…

【机器学习】CatBoost 模型实践:回归与分类的全流程解析

一. 引言 本篇博客首发于掘金 https://juejin.cn/post/7441027173430018067。 PS&#xff1a;转载自己的文章也算原创吧。 在机器学习领域&#xff0c;CatBoost 是一款强大的梯度提升框架&#xff0c;特别适合处理带有类别特征的数据。本篇博客以脱敏后的保险数据集为例&#x…

用三维模型的顶点法向量计算法线贴图

法线贴图的核心概念是在不增加额外多边形数目的情况下&#xff0c;通过模拟细节来改善光照效果。具体流程包括&#xff1a; 法线的计算与存储&#xff1a;通过法线映射将三维法线向量转化为法线贴图的 RGB 值。渲染中的使用&#xff1a;在片段着色器中使用法线贴图来替代原有的…

Hadoop分布式文件系统(二)

目录 1. 引言1. Hadoop文件操作命令2. 部分常用的Hadoop FS Shell命令2.1 ls列出文件2.2 mkdir创建目录2.3 put上传文件2.4 cat查看文件2.5 get复制文件2.6 rm删除文件 3. Hadoop系统管理命令4. HDFS Java API 示例参考 1. 引言 大多数HDFS Shell命令的行为和对应的Unix Shell命…

ESP32-S3模组上跑通ES8388(13)

接前一篇文章&#xff1a;ESP32-S3模组上跑通ES8388&#xff08;12&#xff09; 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回解析了es8388_init函数中的第6段代码&#xff0c;本回继续往下解析。为了便于理解和回顾&#xff0c;再次贴出es8388_init函数源码&#xff0c;在…

LearnOpenGL学习(光照 -- 颜色,基础光照,材质,光照贴图)

光照 glm::vec3 lightColor(0.0f, 1.0f, 0.0f); glm::vec3 toyColor(1.0f, 0.5f, 0.31f); glm::vec3 result lightColor * toyColor; // (0.0f, 0.5f, 0.0f); 说明&#xff1a;当我们把光源的颜色与物体的颜色值相乘&#xff0c;所得到的就是这个物体所反射的颜色。 创建…

Linux条件变量线程池详解

一、条件变量 【互斥量】解决了线程间同步的问题&#xff0c;避免了多线程对同一块临界资源访问产生的冲突&#xff0c;但同一时刻对临界资源的访问&#xff0c;不论是生产者还是消费者&#xff0c;都需要竞争互斥锁&#xff0c;由此也带来了竞争的问题。即生产者和消费者、消费…

Figma入门-自动布局

Figma入门-自动布局 前言 在之前的工作中&#xff0c;大家的原型图都是使用 Axure 制作的&#xff0c;印象中 Figma 一直是个专业设计软件。 最近&#xff0c;很多产品朋友告诉我&#xff0c;很多原型图都开始用Figma制作了&#xff0c;并且很多组件都是内置的&#xff0c;对…

威联通-001 手机相册备份

文章目录 前言1.Qfile Pro2.Qsync Pro总结 前言 威联通有两种数据备份手段&#xff1a;1.Qfile Pro和2.Qsync Pro&#xff0c;实践使用中存在一些区别&#xff0c;针对不同备份环境选择是不同。 1.Qfile Pro 用来备份制定目录内容的。 2.Qsync Pro 主要用来查看和操作文…

大R玩家流失预测在休闲社交游戏中的应用

摘要 预测玩家何时会离开游戏为延长玩家生命周期和增加收入贡献创造了独特的机会。玩家可以被激励留下来&#xff0c;战略性地与公司组合中的其他游戏交叉链接&#xff0c;或者作为最后的手段&#xff0c;通过游戏内广告传递给其他公司。本文重点预测休闲社交游戏中高价值玩家…

基于Java Springboot宠物咖微信小程序

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信开发者工具 数…

ultralytics-YOLOv11的目标检测解析

1. Python的调用 from ultralytics import YOLO import os def detect_predict():model YOLO(../weights/yolo11n.pt)print(model)results model(../ultralytics/assets/bus.jpg)if not os.path.exists(results[0].save_dir):os.makedirs(results[0].save_dir)for result in…

蓝桥杯准备训练(lesson1,c++方向)

前言 报名参加了蓝桥杯&#xff08;c&#xff09;方向的宝子们&#xff0c;今天我将与大家一起努力参赛&#xff0c;后序会与大家分享我的学习情况&#xff0c;我将从最基础的内容开始学习&#xff0c;带大家打好基础&#xff0c;在每节课后都会有练习题&#xff0c;刚开始的练…