11.爬虫

前言:

正则表达式的作用:

  • 作用一:校验字符串是否满足规则

  • 作用二:在一段文本中查找满足要求的内容


一.Pattern类和Matcher类:

1.Pattern类:表示正则表达式

a.因此获取Pattern对象就相当于获取正则表达式的对象;

b.compile方法:获取正则表达式的对象,compile方法的形参就是要写的正则表达式

注:因为compile方法是静态的即被static修饰,所以通过类名.方法名去调用compile方法即Pattern.compile来获取正则表达式的对象(获取获取正则表达式的对象不能new)

matcher方法:形参是要爬取的大串

2.Matcher类:文本匹配器,作用:按照正则表达式的规则去读取字符串(注:从头开始读取),在大串中去找符合匹配规则的子串

a. find方法:

针对形参为空的find方法:拿着文本匹配器从头开始读取,寻找是否有满足规则的子串 如果没有,find方法返回false 如果有,find方法返回true,在底层记录子串的起始索引和结束索引+1

b. group方法:该方法底层会根据find方法记录的索引进行字符串的截取,会把截取的子串进行返回 方法substring(起始索引,结束索引)->包头不包尾,所以上面结束索引加1,上述例子即[0,4)即[0,3]

方法substring:类String里的方法

二.本地爬虫:

题目:

代码:

初级:

package a09RegexDemo;
​
import java.util.regex.Matcher;
import java.util.regex.Pattern;
​
public class RegexDemo1 {public static void main(String[] args) {String str="Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
​//1.获取正则表达式的对象Pattern p = Pattern.compile("Java[0-9]{0,2}");//也可以是Java\\d{0,2}
​//2.获取文本匹配器的对象/* m:文本匹配器的对象str:大串p:规则m要在str中找符合p规则的小串  */Matcher m = p.matcher(str);
​//3.拿着文本匹配器从头开始读取,寻找是否有满足规则的子串/*如果没有,find方法返回false如果有,find方法返回true,在底层记录子串的起始索引和结束索引+1 *///比如:str大串中第一个符合规则的子串为一开始的Java,它在大串中的起始索引为0,结束索引加1为3+1即4,此时底层记录0和4boolean b = m.find();
​//4.group方法底层会根据find方法记录的索引进行字符串的截取,会把截取的子串进行返回//方法substring(起始索引,结束索引)->包头不包尾,所以上面结束索引加1,上述例子即[0,4)即[0,3]String s1 = m.group();
​//5.打印System.out.println(s1);//运行结果为Java,此时找到第一个匹配的子串就会停}
}
​

中级:

package a09RegexDemo;
​
import java.util.regex.Matcher;
import java.util.regex.Pattern;
​
public class RegexDemo1 {public static void main(String[] args) {String str="Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
​//1.获取正则表达式的对象Pattern p = Pattern.compile("Java[0-9]{0,2}");//也可以是Java\\d{0,2}
​//2.获取文本匹配器的对象/* m:文本匹配器的对象str:大串p:规则m要在str中找符合p规则的小串  */Matcher m = p.matcher(str);
​//3.拿着文本匹配器从头开始读取,寻找是否有满足规则的子串/*如果没有,find方法返回false如果有,find方法返回true,在底层记录子串的起始索引和结束索引+1 *///比如:str大串中第一个符合规则的子串为一开始的Java,它在大串中的起始索引为0,结束索引加1为3+1即4,此时底层记录0和4boolean b = m.find();
​//4.group方法底层会根据find方法记录的索引进行字符串的截取,会把截取的子串进行返回//方法substring(起始索引,结束索引)->包头不包尾,所以上面结束索引加1,上述例子即[0,4)即[0,3]String s1 = m.group();
​//5.打印System.out.println(s1);//运行结果为Java,此时找到第一个匹配的子串就会停
​//第二次再调用find方法,就会继续读取后面的内容/*之前已读取到4索引上,此时继续从4索引开始读取*///读取到第二个满足要求的子串,方法会继续返回true,并把第二个子串的起始索引和结束索引加1进行记录b=m.find();
​//第二次调用group方法的时候,会根据find方法记录的索引再次截取子串String s2=m.group();
​//打印System.out.println(s2);//运行结果为Java8,此时找到第二个匹配的子串就会停}
}

终极:用循环找出所需要的全部子串

package a09RegexDemo;
​
import java.util.regex.Matcher;
import java.util.regex.Pattern;
​
public class RegexDemo1 {public static void main(String[] args) {String str="Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";
​//1.获取正则表达式的对象Pattern p = Pattern.compile("Java[0-9]{0,2}");//也可以是Java\\d{0,2}//2.获取文本匹配器的对象/*拿着m去读取str,找符合p规则的子串*/Matcher m = p.matcher(str);//3.核心:利用循环读取/*由于不知道符合规则的子串有几个,因此可用while循环*//* m.find()作为循环条件,一直读取,读取到就返回true,之后进行下一轮的读取,一旦读取到false,就说明大串中没有要找的子串了,查找停止 */while (m.find()){String s = m.group();System.out.println(s);}}
}

三.网络爬虫:

1.类URL:

a.针对只有一个形参的构造方法:该构造方法的形参可以是要爬取的网址,抛出异常MalformedURLException;

b.URL对象即网址对象;

c.方法openConnection:用来打开网址,返回类URLConnection,相当于打开网址后创建网址对象

2.类URLConnection:用来连接创建的网址对象,注:要保证网址畅通

方法getInputStream:返回的数据类型为InputStream

3.类InputStreamReader:

构造方法:一共有4个,每个构造方法的形参的类型都有InputStream

4.类BufferedReader

a.方法readLine:返回String型,在读取的时候每次读取一整行,从第一行开始,注:不是所有信息

b.方法close:

5.代码演示:

网课中:

实操:

package a09RegexDemo;
​
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
​
public class RegexDemo2 {public static void main(String[] args) throws IOException {/*需求:爬取链接中的数据*/
​//1.创建一个URL对象URL url = new URL("https://dasai.lanqiao.cn/??/");
​//2.连接上这个网址/*注:要保证网址畅通*/URLConnection conn = url.openConnection();
​//3.创建一个对象去读取网络中的数据BufferedReader br = new BufferedReader( new InputStreamReader( conn.getInputStream() ));
​String line;
​//4.循环进行读取/*在读取的时候每次读取一整行,从第一行开始,注:不是所有信息*/while ( (line=br.readLine()) != null){System.out.println(line);}
​//5.关闭br.close();}
}

四.练习:

题目:

代码:

package a09RegexDemo;
​
import java.util.regex.Matcher;
import java.util.regex.Pattern;
​
public class RegexDemo3 {public static void main(String[] args) {String s="来黑马程序员学习Java," +"电话:18512516758,18512508907" +"或者联系邮箱:boniu@itcast.cn," +"座机电话:01036517895,010-98951256," +"邮箱:bozai@itcast.cn," +"热线电话:400-618-9090,400-618-4000,4006184000,4006189090";
​//手机号的正则表达式为1[3-9]\\d{9}//邮箱的正则表达式为\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}//座机电话的正则表达式为0\\d{2,3}-?[1-9]\\d{4,9}//热线电话的正则表达式400-?[1-9]\\d{2}-?[1-9]\\d{3}
​String regex="(1[3-9]\\d{9})" +"|(\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2})" +"|(0\\d{2,3}-?[1-9]\\d{4,9})" +"|(400-?[1-9]\\d{2}-?[1-9]\\d{3})"; // |表示或,代表满足括号中的一个即可,|左右不能有空格
​//1.获取正则表达式的对象Pattern p = Pattern.compile(regex);
​//2.获取文本匹配器的对象/*利用m去读取s,会按照p的规则找里面的小串*/Matcher m = p.matcher(s);
​//3.利用循环获取每一个数据while (m.find()){String str = m.group();System.out.println(str);}
​}
}
​

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

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

相关文章

【Linux篇】权限管理 - 用户与组权限详解

一. 什么是权限? 首先权限是限制人的。人 真实的人 身份角色 权限 角色 事物属性 二. 认识人–用户 Linux下的用户分为超级用户和普通用户 root :超级管理员,几乎不受权限的约束普通用户 :受权限的约束超级用户的命令提示符是#,普通用…

【RDMA】RDMA read和write编程实例(verbs API)

WRITE|READ编程(RDMA read and write with IB verbs) (本文讲解的示例代码在:RDMA read and write with IB verbs | The Geek in the Corner) 将 RDMA 与verbs一起使用非常简单:首先注册内存块&#xff0c…

UE5 C++ 不规则按钮识别,复选框不规则识别 UPIrregularWidgets

插件名称:UPIrregularWidgets 插件包含以下功能 你可以点击任何图片,而不仅限于矩形图片。 UPButton、UPCheckbox 基于原始的 Button、Checkbox 扩展。 复选框增加了不规则图像识别功能,复选框增加了悬停事件。 欢迎来到我的博客 记录学习过…

洛谷P2670扫雷游戏(Java)

三.P2670 [NOIP2015 普及组] 扫雷游戏 题目背景 NOIP2015 普及组 T2 题目描述 扫雷游戏是一款十分经典的单机小游戏。在 n 行 m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩…

如何加强游戏安全,防止定制外挂影响游戏公平性

在现如今的游戏环境中,外挂始终是一个困扰玩家和开发者的问题。尤其是定制挂(Customized Cheats),它不仅复杂且隐蔽,更能针对性地绕过传统的反作弊系统,对游戏安全带来极大威胁。定制挂通常是根据玩家的需求…

概率论相关知识随记

作为基础知识的补充,随学随记,方便以后查阅。 概率论相关知识随记 期望(Expectation)期望的定义离散型随机变量的期望示例:掷骰子的期望 连续型随机变量的期望示例:均匀分布的期望 期望的性质线性性质期望的…

DICOM MPPS详细介绍

文章目录 前言一、常规检查业务流程二、MPPS的作用三、MPPS的原理1、MPPS与MWL2、MPPS服务过程 四、MPPS的实现步骤1、创建实例2、传递状态 五、总结 前言 医院中现有的DICOM MWL(Modality Worklist)已开始逐渐得到应用,借助它可以实现病人信息的自动录入&#xff0…

Secured Finance 推出 TVL 激励计划以及基于 FIL 的稳定币

Secured Finance 是新一代 DeFi 2.0 协议,其正在推出基于 FIL 的稳定币、固定收益市场以及具有吸引力的 TVL 激励计划,以助力 Filecoin 构建更强大的去中心化金融生态体系,并为 2025 年初 Secured Finance 协议代币的推出铺平道路。Secure Fi…

FPGA Xilinx维特比译码器实现卷积码译码

FPGA Xilinx维特比译码器实现卷积码译码 文章目录 FPGA Xilinx维特比译码器实现卷积码译码1 Xilinx维特比译码器实现2 完整代码3 仿真结果 MATLAB (n,k,m)卷积码原理及仿真代码(你值得拥有)_matlab仿真后代码-CSDN博客 MATLAB 仿真…

Linux 权限管理:用户分类、权限解读与常见问题剖析

🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟 🚩用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩 目录 💯L…

rabbitmq 安装延时队列插件rabbitmq_delayer_message_exchange(linux centOS 7)

1.插件版本 插件地址:Community Plugins | RabbitMQ rabbitmq插件需要对应的版本,根据插件地址找到插件 rabbitmq_delayer_message_exchange 点击Releases 因为我rabbitmq客户端显示的版本是: 所以我选择插件版本是: 下载 .ez文…

遗传算法与深度学习实战(26)——编码卷积神经网络架构

遗传算法与深度学习实战(26)——编码卷积神经网络架构 0. 前言1. EvoCNN 原理1.1 工作原理1.2 基因编码 2. 编码卷积神经网络架构小结系列链接 0. 前言 我们已经学习了如何构建卷积神经网络 (Convolutional Neural Network, CNN),在本节中&a…

数学建模之熵权法

熵权法 概述 **熵权法(Entropy Weight Method,EWM)**是一种客观赋权的方法,原理:指标的变异程度越小,所包含的信息量也越小,其对应的权值应该越低(例如,如果对于所有样本而言,某项指标的值都相…

同道猎聘Q3营收降利润增,AI或成估值重塑关键词

2024年,经济向好的趋势没有改变,挑战却仍然存在。企业纷纷进行结构性变革优化或业务方向调整。这一点反映到人才市场,绝大多数企业对招聘扩张持保守态度,降本增效的主题仍在延续。 作为人才市场水温变化的“温度计”,…

46 基于单片机的烧水壶系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC单片机,采用四个按键,通过DS18B20检测温度,开机显示实时温度 第一个按键为切换功能按键,按下后,可以设置烧水温度的大小&…

推荐学习笔记:矩阵补充和矩阵分解

参考: 召回 fun-rec/docs/ch02/ch2.1/ch2.1.1/mf.md at master datawhalechina/fun-rec GitHub 业务 隐语义模型与矩阵分解 协同过滤算法的特点: 协同过滤算法的特点就是完全没有利用到物品本身或者是用户自身的属性, 仅仅利用了用户与…

【机器学习】—Transformers的扩展应用:从NLP到多领域突破

好久不见!喜欢就关注吧~ 云边有个稻草人-CSDN博客 目录 引言 一、Transformer架构解析 (一)、核心组件 (二)、架构图 二、领域扩展:从NLP到更多场景 1. 自然语言处理(NLP) 2…

【SpringMVC】用户登录器项目,加法计算器项目的实现

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:用户登录项目实现 1:需求 2:准备工作 (1&#xf…

数据结构(2)——顺序表的模拟实现

一:顺序表的认识 通过数据结构(1)对于算法复杂度的理解,现在我们正式进入数据结构的核心内容,今天,先来使用C语言实现一下数据结构中最简单的顺序表。 首先介绍一下顺序表的概念,先从线性表说…

docker更换容器存储位置

一:原因 今天之前在某个服务器上使用docker搭建的服务突然无法访问了,进入服务器查看发现服务运行正常,但是就是无法使用,然后我这边准备将docker服务重新启动下看看,发现docker服务无法重启,提示内存已满…