当前位置: 首页 > news >正文

#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字符串案例,这里不再赘述


相关文章:

#JAVA-常用API-爬虫

1.爬虫 我们在正则表达式的讲解中可以使用字符串的方法materchs()来匹配&#xff0c;并且返回一个boolean值 String name "lshhhljh"; System.out.println(name.matches("lsh{3}\\s{3}")); //true现在我们将利用正则表达式来爬取本地或者网站上的文本内…...

Qt 面试题复习10~12_2024-12-2

Qt 面试题 28、Qt 如果一个信号的处理方法一直未被执行有哪些可能性29、Qt 三大核心机制30、虚函数表31、什么是Qt事件循环 &#xff1f;32、纯虚函数和普通的虚函数有什么区别33、Qt 的样式表是什么&#xff1f;34、描述Qt的TCP通讯流程35、自定义控件流程36、什么是Qt的插件机…...

在OpenHarmony系统下开发支持Android应用的双框架系统

在 OpenHarmony 系统下开发支持 Android 应用的双框架系统&#xff0c;主要的目标是实现 OpenHarmony 本身作为底层操作系统&#xff0c;并通过兼容层或者桥接技术&#xff0c;允许 Android 应用在其上运行。双框架系统的架构设计会涉及到 OpenHarmony 和 Android 的结合&#…...

对力扣77组合优化的剪枝操作的理解

77. 组合 代码随想录放出了这一张图 我乍一看觉得想当然,但是仔细想想,又不知道以下剪枝代码作何解释,因此我想通过这篇文章简要解释一下 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(int n, int k, int sta…...

SpringMVC中的Handler、HandlerMapping、HandlerAdapter

SpringMVC中的Handler、HandlerMapping、HandlerAdapter到底是啥 这东西,虽然说和我们的开发没啥关系,尤其是当你用SpringBoot进行开发时,这些接口离你越来越远了。讲实话,要不是这学期扫一眼学校的课件,我都不知道有这东西,这东西本来就是对使用框架进行开发的开发者隐藏…...

tomcat 8在idea启动控制台乱码

Tomcat 8在IntelliJ IDEA&#xff08;简称IDEA&#xff09;启动控制台出现乱码的问题&#xff0c;通常是由于Tomcat的默认编码格式&#xff08;UTF-8&#xff09;与IDEA或操作系统的默认编码格式&#xff08;如GBK&#xff09;不一致所导致的。以下是一些解决此问题的步骤&…...

windows下kafka初体验简易demo

这里提供了windows下的java1.8和kafka3.9.0版本汇总&#xff0c;可直接免费下载 【免费】java1.8kafka2.13版本汇总资源-CSDN文库 解压后可以得到一个文件夹 资料汇总内有一个kafka文件资料包.tgz&#xff0c;解压后可得到下述文件夹kafka_2.13-3.9.0&#xff0c;资料汇总内还…...

证明直纹极小曲面是平面或者正螺旋面.

目录 证明直纹极小曲面是平面或者正螺旋面 证明直纹极小曲面是平面或者正螺旋面 证明&#xff1a;设极小直纹面 S S S的参数表示为 r ( u , v ) a ( u ) v c ( u ) . (u,v)\mathbf{a}(u)v\mathbf{c}(u). (u,v)a(u)vc(u).则 r u a ′ v c ′ , r v c , r u ∧ r v a ′ ∧…...

matlab2024a安装

1.开始安装 2.点击安装 3.选择安装密钥 4.接受条款 5.安装密钥 21471-07182-41807-00726-32378-34241-61866-60308-44209-03650-51035-48216-24734-36781-57695-35731-64525-44540-57877-31100-06573-50736-60034-42697-39512-63953 6 7.选择许可证文件 8.找许可证文件 9.选…...

Observability:如何在 Kubernetes pod 中轻松添加应用程序监控

作者&#xff1a;来自 Elastic Jack Shirazi•Sylvain Juge•Alexander Wert Elastic APM K8s Attacher 允许将 Elastic APM 应用程序代理&#xff08;例如 Elastic APM Java 代理&#xff09;自动安装到 Kubernetes 集群中运行的应用程序中。该机制使用变异 webhook&#xff0…...

关于Nginx前后端分离部署spring boot和vue工程以及反向代理的配置说明

最近项目中用到关于Nginx前后端分离部署spring boot和vue工程以及反向代理的配置&#xff0c;总结了一下说明&#xff1a; 1、后端是spring boot工程&#xff0c;端口8000&#xff0c;通过 jar命令启动 nohup java -jar xxx-jsonflow-biz.jar > /usr/local/nohup.out 2>…...

redis渐进式遍历

文章目录 一. 渐进式遍历介绍二. scan命令 一. 渐进式遍历介绍 keys * , 一次性把整个redis中所有的key都获取到, 这个操作比较危险, 可能会阻塞redis服务器 通过渐进式遍历, 就可以做到, 既能够获取到所有的key, 又不会卡死服务器 渐进式遍历, 不是一个命令把所有key都拿到,…...

【C++】数据类型与操作实践:详细解析与优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目一&#xff1a;三个数的倒序输出1.1 题目描述与代码实现代码实现&#xff1a; 1.2 代码解析与细节说明1.3 使用 int 类型的合理性分析1.4 其他数据类型的考虑1.5 代码优…...

C# 集合(Collection)

文章目录 前言一、动态数组&#xff08;ArrayList&#xff09;二、哈希表&#xff08;Hashtable&#xff09;三、排序列表&#xff08;SortedList&#xff09;四、堆栈&#xff08;Stack&#xff09;五、队列&#xff08;Queue&#xff09;六、点阵列&#xff08;BitArray&…...

【智能控制】实验,基于MATLAB的模糊推理系统设计,模糊控制系统设计

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…...

前端跳转路由的时候,清掉缓存

清除路由缓存的方法 ‌使用 $router.push() 方法‌&#xff1a;在跳转路由时&#xff0c;可以通过传递一个包含 replace: true 属性的对象来实现清除路由缓存。例如&#xff1a; this.$router.push({ path: "/new-route", replace: true }); ‌使用 $router.replace…...

基于 LlamaFactory 的 LoRA 微调模型支持 vllm 批量推理的实现

背景 LlamaFactory 的 LoRA 微调功能非常便捷&#xff0c;微调后的模型&#xff0c;没有直接支持 vllm 推理&#xff0c;故导致推理速度不够快。 LlamaFactory 目前支持通过 VLLM API 进行部署&#xff0c;调用 API 时的响应速度&#xff0c;仍然没有vllm批量推理的速度快。 …...

【赵渝强老师】PostgreSQL的物理存储结构

PostgreSQL在执行initdb的数据库集群初始化时会指定一个目录。该目录通过环境变量$PGDATA来表示。当数据库集群初始化完成后&#xff0c;会在这个目录生成相关的子目录以及一些文件。这些生成的文件就是PostgreSQL的物理存储结构中的文件。如下图所示。 如上图所示&#xff0c…...

智能探针技术:实现可视、可知、可诊的主动网络运维策略

网络维护的重要性 网络运维是确保网络系统稳定、高效、安全运行的关键活动。在当今这个高度依赖信息技术的时代&#xff0c;网络运维的重要性不仅体现在技术层面&#xff0c;更关乎到企业运营的方方面面。网络运维具有保障网络的稳定性、提升网络运维性能、降低企业运营成本等…...

CTF-PWN: 全保护下格式化字符串利用 [第一届“吾杯”网络安全技能大赛 如果能重来] 赛后学习(不会)

通过网盘分享的文件&#xff1a;如果能重来.zip 链接: https://pan.baidu.com/s/1XKIJx32nWVcSpKiWFQGpYA?pwd1111 提取码: 1111 --来自百度网盘超级会员v2的分享漏洞分析 格式化字符串漏洞,在printf(format); __int64 sub_13D7() {char format[56]; // [rsp10h] [rbp-40h]…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...