十一、常用API——爬虫

目录

  • 爬虫
    • 本地爬虫和网络爬虫
    • 贪婪爬取和非贪婪爬取
    • 正则表达式在字符串方法中的使用
    • 捕获分组和非捕获分组
      • 分组
      • 捕获分组
      • 非捕获分组

爬虫

本地爬虫和网络爬虫

  • 有如下文本,请按照要求爬取数据。(本地爬虫

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

要求:找出里面所有的JavaXX

public static void main(String[] args) {/*有如下文本,请按照要求爬取数据。Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台要求:找出里面所有的JavaXX*/String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";//        method1(str);//0.获取正则表达式对象Pattern p = Pattern.compile("Java\\d{0,2}");//1.获取文本匹配器的对象Matcher m = p.matcher(str);//2.利用循环获取匹配内容while (m.find()){String s = m.group();System.out.println(s);}}private static void method1(String str) {//获取正则表达式对象Pattern p = Pattern.compile("Java\\d{0,2}");//获取文本匹配器的对象//m:文本匹配器的对象//str:大串//p:规则//m要在str中找符合p规则的小串Matcher m = p.matcher(str);//拿着文本匹配器从头开始读取,寻找是否有满足规则的子串//如果没有,方法返回false//如果有,返回true,在底层记录子串的起始索引和结束索引+1boolean b = m.find();//方法底层会根据find方法记录的索引进行字符串的截取//subString(起始索引,结束索引);包头不包尾//把截取的小串进行返回String s1 = m.group();System.out.println(s1);//第二次在调用find的时候,会继续读取后面的内容//读取到第二个满足要求的子串,方法会继续返回true//并把第二个子串的起始索引和结束索引+1,进行记录b = m.find();//第二次调用group方法的时候,会根据find方法记录的索引再次截取String s2 = m.group();System.out.println(s2);}

注意:以下代码中的链接可能已经失效

public class RegexDemo7 {public static void main(String[] args) throws IOException {/* 扩展需求2:把连接:https://m.sengzan.com/jiaoyu/29104.html?ivk sa=1025883i中所有的身份证号码都爬取出来。*///创建一个URL对象URL url = new URL("https://m.sengzan.com/jiaoyu/29104.html?ivk sa=1025883i");//连接上这个网址//细节:保证网络是畅通URLConnection conn = url.openConnection();//创建一个对象去读取网络中的数据BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;//获取正则表达式的对象patternString 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();}
}

需求:

​ 有如下文本,按要求爬取数据。

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

需求1:

​ 爬取版本号为8,11.17的Java文本,但是只要Java,不显示版本号。

需求2:

​ 爬取版本号为8,11,17的Java文本。正确爬取结果为:Java8 Java11 Java17 Java17

需求3:

​ 爬取除了版本号为8,11,17的Java文本。

public static void main(String[] args) {String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是JAva8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台。";//0.爬取版本号为8,11.17的Java文本,但是只要Java,不显示版本号。System.out.println("0.爬取版本号为8,11.17的Java文本,但是只要Java,不显示版本号。");String regex = "(?i)Java(?=8|11|17)";Pattern p = Pattern.compile(regex);Matcher m = p.matcher(str);while (m.find()){String s = m.group();System.out.println(s);}System.out.println("---------------------------------");//1.爬取版本号为8,11,17的Java文本。正确爬取结果为:JAva8 Java11 Java17 Java17System.out.println("爬取版本号为8,11,17的Java文本。正确爬取结果为:Java8 Java11 Java17 Java17");String regex2 = "(?i)Java(8|11|17)";String regex3 = "(?i)Java(?:8|11|17)";Pattern p2 = Pattern.compile(regex3);Matcher m2 = p2.matcher(str);while (m2.find()){System.out.println(m2.group());}System.out.println("---------------------------");//2.爬取除了版本号为8,11,17的Java文本System.out.println("爬取除了版本号为8,11,17的Java文本");String regex4 = "(?i)Java(?!8|11|17)";Pattern p4 = Pattern.compile(regex4);Matcher m4 = p4.matcher(str);while (m4.find()){System.out.println(m4.group());}}

贪婪爬取和非贪婪爬取

只写+和表示贪婪匹配,如果在+和后面加问号表示非贪婪爬取
+? 非贪婪匹配
*? 非贪婪匹配
贪婪爬取:在爬取数据的时候尽可能的多获取数据
非贪婪爬取:在爬取数据的时候尽可能的少获取数据

举例:
如果获取数据:ab+
贪婪爬取获取结果:abbbbbbbbbbbb
非贪婪爬取获取结果:ab

    public static void main(String[] args) {String str = "Java自从95年问世以来,abbbbbbbbbbbbaaaaaaaaaaaaaaaaaa经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";//需求1:按照ab+的方式爬取ab,b尽可能多获取String regex = "ab+";Pattern p = Pattern.compile(regex);Matcher m = p.matcher(str);while (m.find()){System.out.println(m.group());}//需求2:按照ab+的方式爬取ab,b尽可能少获取String regex2 = "ab+?";Pattern p2 = Pattern.compile(regex2);Matcher m2 = p2.matcher(str);while (m2.find()){System.out.println(m2.group());}}

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

在这里插入图片描述

    public static void main(String[] args) {/** 有一段字符串:小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠要求1:把字符串中三个姓名之间的字母替换为vs要求2:把字符串中的三个姓名切割出来* */String str = "小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠";//要求1:把字符串中三个姓名之间的字母替换为vs//按照正则表达式的规则进行替换/** 细节:* 方法在底层跟之前一样也会创建文本解析器的对象* 然后从头开始去读取字符串中的内存,只要有满足的,那么就用第二个参数去替换* */String result = str.replaceAll("[\\w&&[^_]]+", "VS");System.out.println(result);  // 小诗诗VS小丹丹VS小惠惠//要求2:把字符串中的三个姓名切割出来//按照正则表达式的规则切割字符串String[] arr = str.split("[\\w&&[^_]]+");for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}

捕获分组和非捕获分组

分组

分组就是一个小括号

在这里插入图片描述

每组是有组号的,也就是序号
规则1 从1开始,连续不间断
规则2 以左括号为基准,最左边的是第一组,其次为第二组,以此类推。

捕获分组

捕获分组就是把这一组的数据捕获出来,再用一次

public static void main(String[] args) {//需求1:判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符//举例: a123a b456b 17891 &abc& a123b(false)// \\组号:表示把第X组的内容再出来用一次String regex1 = "(.).+\\1";System.out.println("a123a".matches(regex1)); //trueSystem.out.println("b456b".matches(regex1)); //trueSystem.out.println("17891".matches(regex1)); //trueSystem.out.println("&abc&".matches(regex1)); //trueSystem.out.println("a123b".matches(regex1)); //falseSystem.out.println("----------------------------------");//需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符//举例: abc123abc b456b 123789123 &!@abc&!@ abc123abd(false)String regex2 = "(.+).+\\1";System.out.println("abc123abc".matches(regex2)); //trueSystem.out.println("b456b".matches(regex2)); //trueSystem.out.println("123789123".matches(regex2)); //trueSystem.out.println("&!@abc&!@".matches(regex2)); //trueSystem.out.println("abc123abd".matches(regex2)); //falseSystem.out.println("--------------------------------");//需求3:判断一个字符串的开始部分和结束部分是否一致?开始部分内部每个字符也需要一致//举例: aaa123aaa bbb456bbb 111789111 &&abc&&//(.):把首字母看做一组// \\2:把首字母拿出来再次使用// *:作用于\\2,表示后面重复的内容出现日次或多次String regex3 = "((.)\\2*).+\\1";System.out.println("aaa123aaa".matches(regex3)); //trueSystem.out.println("bbb456bbb".matches(regex3)); //trueSystem.out.println("111789111".matches(regex3)); //trueSystem.out.println("&&abc&&".matches(regex3)); //trueSystem.out.println("aa123bb".matches(regex3)); //false}

后续还要继续使用本组的数据
正则内部使用: \组号
正则外部使用: $组号

public static void main(String[] args) {/*需求:将字符串:我要学学编编编编程程程程程程。替换为:我要学编程*/String str = "我要学学编编编编程程程程程程";//  (.)表示把重复内容的第一个字符看做一组//  \\1表示第一字符再次出现//  + 至少一次//  $1 表示把正则表达式中第一组的内容,再拿出来用String new_str = str.replaceAll("(.)\\1+", "$1");System.out.println(str);System.out.println(new_str);}

非捕获分组

非捕获分组:分组之后不需要再用本组数据,仅仅是把数据括起来。
特点:不占用组号
在这里插入图片描述

//身份证号码的简易正则表达式
//非捕获分组:仅仅是把数据括起来
//特点:不占用组号
//这里\\1报错原因:(?:)就是非捕获分组,此时是不占用组号的。//(?:) (?=) (?!)都是非捕获分组//更多的使用第一个
//String regex1 ="[1-9]\\d{16}(?:\\d|x|x)\\1";
String regex2 ="[1-9]\\d{16}(\\d Xx)\\1";
//^([01]\d|2[0-3]):[0-5]\d:[@-5]\d$System.out.println("41080119930228457x".matches(regex2));

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

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

相关文章

记录一些多维数组的方法

文章目录 前言一、获取多维数组的数据二、多维数组自带的方法总结 前言 验证过程中&#xff0c;我们经常会用到多维数组存储数据&#xff0c;本文主要记录一下&#xff0c;如何去获取我们需要的数据&#xff0c;以及多维数组自带的一些方法。 一、获取多维数组的数据 获取多维…

排序-睡眠排序

睡眠排序 小故事: 在一个神奇的小村庄里&#xff0c;村长有一群活泼可爱的小动物们&#xff0c;它们分别是兔子、松鼠、乌龟和蜗牛。每天晚上&#xff0c;村长都会安排一场特殊的比赛&#xff0c;让大家各自按照自己的速度去完成一项任务。有一天&#xff0c;村长决定让他们按…

网络通信(17)-C#TcpClient 和 TcpListener的详解

目录 一、概述 二、TcpClient 三、NetworkStream流处理技术 四、 TcpListener 一、概述 支持Http、Tcp和Udp的类组成了TCP/IP三层模型(请求响应层、应用协议层、传输层)的中间层-应用协议层,该层的类比位于最底层的Socket类提供了更高层次的抽象

【js学习之路】遍历数组api之 `filter `和 `map`的区别

&#x1f449;一、前言 数组是我们在项目中经常使用的数据类型&#xff0c;今天我们主要简述作用于遍历数组的api&#xff0c;filter和map的区别。 &#x1f449; 二、filter和map的共同点 首先&#xff0c;我们主要阐述一下 filter 和 map 的共同点 api的参数都是回调函数…

山体滑坡监测预警系统-gnss位移监测站

GNSS山体滑坡位移监测站是一种利用全球导航卫星系统&#xff08;GNSS&#xff09;进行山体滑坡位移监测的设备。它通过接收和处理GNSS卫星信号&#xff0c;能够实时监测山体的位移变化&#xff0c;并将数据传输到后端系统进行分析和处理。 GNSS山体滑坡位移监测站具有高精度、…

olap/clickhouse keeper 一致性协调服务

在https://www.yuque.com/treblez/qksu6c/ahgvn94c2nh1y34w?singleDoc# 《Redis集群:分布式的less is more》中我提到&#xff0c;无论是啥服务&#xff0c;想要达到操作视角的强一致性&#xff0c;要么使用类似TSO/原子钟的方案&#xff0c;要么有一套一致性协调服务。 click…

Python对Excel文件中不在指定区间内的数据加以去除的方法

本文介绍基于Python语言&#xff0c;读取Excel表格文件&#xff0c;基于我们给定的规则&#xff0c;对其中的数据加以筛选&#xff0c;将不在指定数据范围内的数据剔除&#xff0c;保留符合我们需要的数据的方法。 首先&#xff0c;我们来明确一下本文的具体需求。现有一个Exc…

中国大模型迎来“95后” 百度奖学金发掘百位“未来AI技术领袖”

在人工智能掀起的科技革命和产业变革浪潮下&#xff0c;大模型成为最受关注的研究领域。1月22日&#xff0c;第十一届百度奖学金颁奖典礼在北京举行&#xff0c;来自全球顶尖高校及科研机构的10位“未来AI技术领袖”脱颖而出&#xff0c;他们平均年龄仅27岁&#xff0c;其中8人…

【江科大】STM32:DMA转运

DMA 直接存储器存取&#xff08;协助CPU完成数据转运&#xff0c;可以直接访问32位内部存储器&#xff0c;内存SRAM&#xff0c;程序存储器Flash&#xff0c;寄存器等&#xff09; DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输&#xff0c;无须CPU干预&#…

【C++】入门(二)

前言&#xff1a; c基础语法&#xff08;下&#xff09; 文章目录 五、引用5.1 引用概念5.2 引用使用规则5.3 常引用5.4 引用的使用场景5.5 引用和指针的区别 六、内联函数6.1 概念6.2 内联函数的特性 七、auto关键字&#xff08;C11&#xff09;7.1 概念7.2 使用规则7.3 用于f…

Qt容器QMap(映射)

插入数据 QMap<QString,QString> infoMap; //第一个是key 第二个是valueinfoMap.insert("王祖蓝","163cm");infoMap.insert("Anglebaby","168cm");infoMap["易烊千玺"] "173cm(成长中)";infoMap["姚…

社区分享|百果园选择DataEase搭档蜜蜂微搭实现企业数据应用一体化

百果园&#xff0c;全称为深圳百果园实业&#xff08;集团&#xff09;股份有限公司&#xff0c;2001年12月成立于深圳&#xff0c;2002年开出中国第一家水果专卖店。截至2022年11月&#xff0c;百果园全国门店数量超过5600家&#xff0c;遍布全国140多个城市&#xff0c;消费会…

5118优惠码vip、svip、专业版和旗舰版使用yhm666

5118大数据平台会员优惠码【yhm666】&#xff0c;结算时勾选“使用优惠码”&#xff0c;然后在优惠码窗口中输入yhm666&#xff0c;然后点确定即可享受特价会员价格。阿腾云atengyun.com分享如下图&#xff1a; 5118会员优惠码【yhm666】 5118会员价格和使用优惠码之后的价格对…

Android 9.0 系统禁用截屏和录屏功能

1.前言 在9.0的系统rom产品开发中,在对于一些产品开发需求中,对系统截屏和录屏功能 要求去掉这些功能,不让用户截屏和录屏 保护 一个app的资源,所以就需要在系统中做限制不让截屏录屏,接下来具体实现相关功能 2.系统禁用截屏和录屏功能的核心类 frameworks\native\service…

C++ max和min函数详细使用指南

0. 前言 C 是一种强大而灵活的编程语言&#xff0c;具有丰富的标准库&#xff0c;其中包括了一系列实用的函数。其中&#xff0c;max 和 min 函数是处理数值的时候经常用到的工具。本文将深入探讨这两个函数的使用方法&#xff0c;以及它们在不同情景下的应用。 1. max 函数的…

ubuntu 20.04 使用 webrtc-streamer自动退出,报错GLIBC 问题解决方法

文章目录 前言Ubuntu 20.4中使用webrtc-streamer报错总结 前言 前端vue2 项目需要播放海康的视频流&#xff0c;本地启动起来了&#xff0c;现在需要的服务器上部署&#xff0c;服务器是Ubuntu 20.04&#xff0c;下面是部署时遇到的问题及解决方法&#xff0c;总耗时2天。 不知…

golang学习笔记——面试题 使用 3 个协程顺序打印 cat、dog、fish 各 100 次

文章目录 面试题 使用 3 个协程顺序打印 cat、dog、fish 各 100 次拓展第一种方法第二种方法 参考资料 面试题 使用 3 个协程顺序打印 cat、dog、fish 各 100 次 编程题&#xff1a;3个函数分别打印cat、dog、fish&#xff0c;要求每个函数都要起一个goroutine&#xff0c;按照…

算法训练营Day46(动态规划8之多重背包)

多重背包 关于 多重背包&#xff0c;力扣上没有相关的题目&#xff0c;所以今天的重点就是回顾一波 自己做的背包题目 本题力扣上没有原题&#xff0c;大家可以去卡码网第56题 (opens new window)去练习 简单介绍 有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用&…

【GitHub项目推荐--不错的 Java 开源项目】【转载】

1 基于 Java 的沙盒塔防游戏 Mindustry 是一款用 Java 编写的沙盒塔防游戏。玩家需要建造精密的传送带供应链&#xff0c;提供炮塔弹药&#xff0c;生产建筑材料&#xff0c;保护建筑并抵御敌人。也可以在跨平台多人合作游戏中与朋友一起战斗&#xff0c;或组队进行 PVP 比赛。…

多图合并二维码的制作方法,快速在线生成图片二维码

怎么将多张图合并用二维码展示呢&#xff1f;现在经常会通过扫码的方式来查看图片&#xff0c;选择这种方式不仅可以展现更多地内容&#xff0c;还能够减少图片对个人容量的占用&#xff0c;增加用户的交互性和娱乐性。那么如何使用二维码生成器来快速制作图片二维码呢&#xf…