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.mzph.cn/bicheng/63062.shtml

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

相关文章

Visual Studio 2022 项目配置常用选项

作为一名C++开发者,经常需要配置第三方库,今天来跟大家截图一下,方便大家快速配置: 头文件包含目录: 或者: 库文件包含目录:

如何搭建JMeter分布式集群环境来进行性能测试

在性能测试中,当面对海量用户请求的压力测试时,单机模式的JMeter往往力不从心。如何通过分布式集群环境,充分发挥JMeter的性能测试能力?这正是许多测试工程师在面临高并发、海量数据时最关注的问题。那么,如何轻松搭建…

Kafka从指定时间开始消费数据

需求-故障定位:flink消费kafka数据,某个时间点漏数据 背景:kafka数据保留3天,如果第二天,发现程序异常导致数据丢失,需要定位是topic源头无数据,还是程序处理出现异常。 # 1, 设置一个新的gro…

WebRover :一个功能强大的 Python 库,用于从 Web 内容生成高质量的数据集,专为训练大型语言模型和 AI 应用程序而设计。

2024-11-30 ,由Area-25团队开发的一个专门用于生成高质量网络内容数据集的Python库。该数据集旨在为大型语言模型(LLM)和人工智能应用的训练提供丰富的数据资源。 数据集地址:WebRover Dataset|自然语言处理数据集|AI模型训练数据…

计算机毕业设计hadoop+spark民宿推荐系统 民宿数据分析可视化大屏 民宿爬虫 民宿大数据 知识图谱 机器学习 大数据毕业设计

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

云原生数据库 PolarDB

PolarDB 是阿里云推出的一款云原生数据库,旨在为企业提供高性能、高可靠性的数据库解决方案。它基于云计算环境设计,特别适用于云上的大规模数据处理和存储需求。PolarDB 是一种兼具关系型数据库(RDS)和分布式数据库特性的新型数据…

Eureka和Zookeeper、Nacos的区别

目录 一、Eureka与Zookeeper的区别 适用场景: 架构设计: 功能特性: 社区生态: 二、Eureka与Nacos的区别 接口方式: 实例类型: 健康检测: 服务发现: 一致性与可用性&#…

工程无法进行造价鉴定时,应如何确定工程价款?

工程因缺乏施工资料无法进行造价鉴定的,应如何确定工程价款? 阅读提示:工程造价鉴定是建设工程纠纷中最为常用的鉴定,而该鉴定需要以施工图纸、监理日志等材料作为基础。时常出现因保管不当、时间久远等原因,造成施工资料不齐全…

opencv常用图像处理操作

OpenCV 处理图像的通用流程通常包括以下几个步骤,根据具体需求可以调整或跳过某些步骤。以下是一个通用的框架: 读取图像 加载图像文件到内存中以进行后续处理。 import cv2 读取图像 image cv2.imread(‘image.jpg’) # 彩色图像 gray_image cv2…

微服务的负载均衡可以通过哪些组件实现

微服务的负载均衡可以通过多种组件来实现,以下是一些常见的负载均衡组件及其特点: Nginx: Nginx是一款轻量级的HTTP和反向代理服务器,也是一个高性能的负载均衡器。它支持多种负载均衡算法,如轮询、加权轮询、IP哈希等…

zookeeper在确认config无误后仍处于standalone模式的解决方法

jps查看是否有QuorumPeerMain进程 停止服务后该进程仍然存在,输入: ps -ef | grep QuorumPeerMain | grep -v grep | awk {print $2} | xargs kill 之后再启动一次进程 bin/zkServer.sh start 查看状态 bin/zkServer.sh status 发现报错解决&#…

mac中全局 flutter fvm 控制版本遇到的不生效问题解决

1、下载 dart pub global activate fvm 或者 brew tap leoafarias/fvmbrew install fvm fvm use 3.22.1 上面的每次运行都需要加fvm flutter 我觉得麻烦 我期望的是修改全局的 那么就需要使用到fvm global 命令 如: fvm global 3.24.0 但是我发现flutter --vers…

eltable el-table 横向 滚动条常显

又遇到了难受的问题,el-table嵌入在一个div里面,结果因为内容太多,横向、纵向我都得滚动查看! 结果发现横向滚动时只能让它纵向触底后才能进行横向操作,这就很变态,明显不符合用户操作习惯。如下图: 要先纵…

HBase运维需要掌握的技能:监控与日志管理(5)

HBase 监控与日志管理详解 1. 监控工具: HBase 的监控是确保集群稳定运行的关键。通过使用合适的监控工具,管理员可以及时发现性能瓶颈、故障点,并采取相应的措施。 HBase Web UI: 功能:HBase Web UI 是一个内置的 W…

【webApp之h5端实战】项目基础结构搭建及欢迎页面的实现

这是一个实战项目的webapp,主要是使用原生js/css/html来实现我们的业务。预览下面的实战效果,我们将会从0到1实现这个系列的项目。包括大量的原生js知识,css3动画的开发,以及页面的交互实现。 效果预览 项目准备工作 封装的工具类,用于获取原生dom节点,处理原生dom事件的…

构建 Python 包综合指南setup.py和pyproject.toml

一、说明 在 Python 中,有两种常见的方法来创建可以安装的包pip:使用setup.py和使用pyproject.toml下面是每种方法的简要说明。 二、setup.py(传统方法)

【AI模型对比】Kimi与ChatGPT的差距:真实对比它们在六大题型中的全面表现!

文章目录 Moss前沿AI语义理解文学知识数学计算天文学知识物理学知识英语阅读理解详细对比列表总结与建议 Moss前沿AI 【OpenAI】获取OpenAI API Key的多种方式全攻略:从入门到精通,再到详解教程!! 【VScode】VSCode中的智能AI-G…

THREE.js 入门代码小记(一)

一、坐标系概念 在 three.js 中,相机的默认朝向是沿着 Z 轴的负方向。也就是说,默认情况下,相机会沿着 Z 轴的负方向“看”到场景中的对象,而 X 轴和 Y 轴分别对应水平方向和垂直方向。换句话说,相机的默认位置是 (0,…

[go-redis]客户端的创建与配置说明

创建redis client 使用go-redis库进行创建redis客户端比较简单,只需要调用redis.NewClient接口创建一个客户端 redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379",Password: "",DB: 0, })NewClient接口只接收一个参数red…

图形开发基础之在WinForms中使用OpenTK.GLControl进行图形绘制

前言 GLControl 是 OpenTK 库中一个重要的控件,专门用于在 Windows Forms 应用程序中集成 OpenGL 图形渲染。通过 GLControl,可以轻松地将 OpenGL 的高性能图形绘制功能嵌入到传统的桌面应用程序中。 1. GLControl 的核心功能 OpenGL 渲染上下文&…