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

Java—— 网络爬虫

案例要求 

https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0
http://www.haoming8.cn/baobao/10881.html
http://www.haoming8.cn/baobao/7641.html

 上面三个网址分别表示百家姓,男生名字,女生名字,如图:

           

要求:

获取上述网址中的内容,利用正则表达式爬取姓氏和名字信息,并生成不重复的10个男生的姓名和10个女生的姓名 ,将生成的姓名保存到本模块下的a.txt文件中。

关于网络的方法

URL网址对象

构造方法说明
public URL(String spec)利用记录网址的字符串创建一个网址的对象
成员方法说明
public URLConnection openConnection()网址对象调用该方法让程序连接网址,返回程序和URL之间的通信链接对象

URLConnection通信链接对象

成员方法说明
public InputStream getInputStream()得到连接网址的字节输入流

关于爬虫的方法

Pattern正则表达式对象

构造方法说明
public static Pattern compile(String regex)获取正则表达式的对象,传递的是表示正则表达式的字符串
成员方法说明
public Matcher matcher(String str)正则表达式对象调用该方法获取文本匹配器的对象,传递的是需要进行查找的大串

Matcher文本匹配器对象

成员方法说明
public boolean find()让文本匹配器从头开始读取大串,寻找是否有满足正则表达式的子串。如果没有,方法返回false,如果有,返回true。在底层记录子串的起始索引和结束索引+1
public String group()方法底层会根据find()方法记录的索引进行字符串的截取,返回截取的小串,该小串就是符合正则表达式要求的子串

代码实现

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Test1 {public static void main(String[] args) throws IOException {//记录网址String familyNameWeb = "https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0";String boyNameweb = "http://www.haoming8.cn/baobao/10881.html";String girlNameweb = "http://www.haoming8.cn/baobao/7641.html";//调用方法网络爬取网址内容并以字符串形式返回String familyNameStr = webCrawler(familyNameWeb);String boyNameStr = webCrawler(boyNameweb);String girlNamewebStr = webCrawler(girlNameweb);//利用正则表达式获取网址中的姓氏和名字//按照所需数据在网址内容中的布局不同设置不同的正则表达式//百家姓网址中所需的百家姓数据都是4个中文一组后面跟逗号或句号,且只获取符合前的内容//中文的正则表达式为[\u4E00-\u9FA5]ArrayList<String> familyNameTempList = getData(familyNameStr, "([\\u4E00-\\u9FA5]){4}(?=,|。)");//男生名字网址中所需的名字数据都是2个中文一组后面跟顿号或句号,且只获取符合前的内容ArrayList<String> boyNameTempList = getData(boyNameStr, "([\\u4E00-\\u9FA5]){2}(?=、|。)");//女生名字网址中所需的名字数据都是2个中文加1个空格4组后面跟2个中文,都获取ArrayList<String> girlNameTempList = getData(girlNamewebStr,"(([\\u4E00-\\u9FA5]){2} ){4}[\\u4E00-\\u9FA5]{2}");//得到了初始数据集合,将其优化方便使用//System.out.println(familyNameTempList);//[赵钱孙李, 周吴郑王, 冯陈褚卫, 蒋沈韩杨,......//修改百家姓集合为:只保留前410个单姓,并且每一个姓氏占一个索引ArrayList<String> familyNameTemp2List = new ArrayList<>();ArrayList<String> familyNameList = new ArrayList<>();for (String s : familyNameTempList) {for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);familyNameTemp2List.add(c + "");}}//只保留前410个单姓for (int i = 0; i < 410; i++) {familyNameList.add(familyNameTemp2List.get(i));}//System.out.println(familyNameList);//[赵, 钱, 孙, 李, 周, 吴, 郑, 王,......//System.out.println(boyNameTempList);//[大气, 美好, 特色, 大气, 美好, 特色, 月星, 弘城, 雨国, 思明,.....//修改男生名字集合为:去除重复,每一个名字占一个索引ArrayList<String> boyNameList = new ArrayList<>();for (String s : boyNameTempList) {if (!boyNameList.contains(s)) {boyNameList.add(s);}}//System.out.println(boyNameList);//[大气, 美好, 特色, 月星, 弘城, 雨国, 思明, ......//System.out.println(girlNameTempList);//[彤舞 芊静 艾丝 惠蕙 语月, 依莹 瑶馨 曼珍 逸云 微婉,.....//修改女生名字集合为:去除重复,每一个名字占一个索引ArrayList<String> girlNameList = new ArrayList<>();for (String s : girlNameTempList) {String[] arr = s.split(" ");for (int i = 0; i < arr.length; i++) {girlNameList.add(arr[i]);}}//System.out.println(girlNameList);//[彤舞, 芊静, 艾丝, 惠蕙, 语月, 依莹, ......//调用方法根据准备好的数据分别获取不重复的10个男生名字和女生名字//参数为坐标的数据和男女要生成名字的数量ArrayList<String> nameList = getName(familyNameList, boyNameList, girlNameList, 10, 10);//利用缓冲字符输出流写到本模块下的a.txt文件中BufferedWriter bw = new BufferedWriter(new FileWriter("day05\\a.txt"));for (String s : nameList) {bw.write(s);bw.newLine();}bw.close();}private static ArrayList<String> getName(ArrayList<String> familyNameList, ArrayList<String> boyNameList,ArrayList<String> girlNameList, int bCount, int gCount) {//定义集合存储生成的不重复的男生名字HashSet<String> boyList = new HashSet<>();//生成男生名字while (true) {//存够数量跳出if (boyList.size() == bCount) {break;}//打乱集合中的内容Collections.shuffle(familyNameList);Collections.shuffle(boyNameList);//将打乱后的集合的0索引位置的姓和名拼接并标注男生,添加到男生名字集合中boyList.add(familyNameList.get(0) + boyNameList.get(0) + "-男");}//定义集合存储生成的不重复的女生名字HashSet<String> girlList = new HashSet<>();while (true) {//存够数量跳出if (girlList.size() == gCount) {break;}//打乱集合中的内容Collections.shuffle(familyNameList);Collections.shuffle(girlNameList);//将打乱后的集合的0索引位置的姓和名拼接并标注女生,添加到女生名字集合中girlList.add(familyNameList.get(0) + girlNameList.get(0) + "-女");}//定义集合存储生成的名字ArrayList<String> nameList = new ArrayList<>();//将男女名字集合中的数据放到一个集合中,方便返回for (String s : boyList) {nameList.add(s);}for (String s : girlList) {nameList.add(s);}return nameList;}//正则表达式private static ArrayList<String> getData(String str, String regex) {//定义集合存储符合正则表达式的数据ArrayList<String> list = new ArrayList<>();Pattern p = Pattern.compile(regex);Matcher m = p.matcher(str);while (m.find()) {String s = m.group();list.add(s);}return list;}//网络爬取private static String webCrawler(String web) throws IOException {//获取网址对象URL url = new URL(web);//让程序连接网址URLConnection uc = url.openConnection();//读取网址内的数据://得到得到连接网址的字节输入流InputStream is = uc.getInputStream();//利用转换流将字节流转换为字符流方便读中文InputStreamReader isr = new InputStreamReader(is);//定义StringBuilder用于拼接读到的数据StringBuilder sb = new StringBuilder();//开始读int b;while ((b = isr.read()) != -1) {sb.append((char) b);}//读完关流isr.close();//返回读到的数据return sb.toString();}
}

相关文章:

Java—— 网络爬虫

案例要求 https://hanyu.baidu.com/shici/detail?pid0b2f26d4c0ddb3ee693fdb1137ee1b0d&fromkg0 http://www.haoming8.cn/baobao/10881.html http://www.haoming8.cn/baobao/7641.html上面三个网址分别表示百家姓&#xff0c;男生名字&#xff0c;女生名字&#xff0c;如…...

Baklib内容中台的主要构成是什么?

Baklib内容中台核心架构 Baklib作为一站式知识管理平台的核心载体&#xff0c;其架构设计围绕智能搜索引擎优化技术与多终端适配响应系统展开。通过模块化内容组件的灵活配置&#xff0c;企业可快速搭建知识库、FAQ页面及帮助中心等标准化场景&#xff0c;同时借助可视化数据看…...

深度解析 Java 中介者模式:重构复杂交互场景的优雅方案

一、中介者模式的核心思想与设计哲学 在软件开发的历史长河中&#xff0c;对象间的交互管理一直是架构设计的核心难题。当多个对象形成复杂的网状交互时&#xff0c;系统会陷入 "牵一发而动全身" 的困境。中介者模式&#xff08;Mediator Pattern&#xff09;作为行…...

家用和类似用途电器的安全 第1部分:通用要求 与2005版差异(7)

文未有本标准免费下载链接。 ——增加了“对峰值电压大于15kV的&#xff0c;其放电电能应不超过350mJ”的要求&#xff08;见8.1.4&#xff09; 1. GB/T4706.1-2024&#xff1a; 8.1.4 如果易触及部件为下述情况,则不认为其是带电的。 ——该部件由安全特低电压供电,且: 对…...

HTTP Digest 认证:原理剖析与服务端实现详解

HTTP Digest 认证&#xff1a;原理剖析与服务端实现详解 HTTP 协议中的 Digest 认证&#xff08;摘要认证&#xff09;是一种比 Basic 认证更安全的身份验证机制&#xff0c;其核心设计是避免密码明文传输&#xff0c;并通过动态随机数&#xff08;Nonce&#xff09;防范重放攻…...

untiy实现汽车漫游

实现效果 汽车漫游 1.创建汽车模型 导入汽车模型(FBX格式或其他3D格式),确保模型包含车轮、车身等部件。 为汽车添加碰撞体(如 Box Collider 或 Mesh Collider),避免穿透场景物体。 添加 Rigidbody 组件,启用重力并调整质量(Mass)以模拟物理效果。 2.编写汽车控制脚本…...

PID项目---硬件设计

该项目是立创训练营项目&#xff0c;这些是我个人学习的记录&#xff0c;记得比较潦草 1.硬件-电路原理电赛-TI-基于MSPM0的简易PID项目_哔哩哔哩_bilibili 这个地方接地是静电的考量 这个保护二极管是为了在电源接反的时候保护电脑等设备 大电容的作用&#xff1a;当电机工作…...

Pluto实验报告——基于FM的音频信号传输并解调恢复

目录 一、实验目的 ................................ ................................ ................................ .................. 3 二、实验内容 ................................ ................................ ................................ ......…...

【Redis】AOF日志

目录 1、背景2、工作原理3、核心配置参数4、优缺点5、AOF文件内容 1、背景 AOF&#xff08;Append Only File&#xff09;是redis提供的持久化机制之一&#xff0c;它通过记录所有修改数据库状态的写命令来实现数据库持久化。与RDB&#xff08;快照&#xff09;方式不同&#…...

Leetcode 2792. 计算足够大的节点数

1.题目基本信息 1.1.题目描述 给定一棵二叉树的根节点 root 和一个整数 k 。如果一个节点满足以下条件&#xff0c;则称其为 足够大 &#xff1a; 它的子树中 至少 有 k 个节点。 它的值 大于 其子树中 至少 k 个节点的值。返回足够大的节点数。 如果 u v 或者 v 是 u 的…...

《关于浔川社团退出DevPress社区及内容撤回的声明》

《关于浔川社团退出DevPress社区及内容撤回的声明》 尊敬的DevPress社区及读者&#xff1a; 经浔川社团内部决议&#xff0c;我社决定自**2025年5月26日**起正式退出DevPress社区&#xff0c;并撤回所有由我社成员在该平台发布的原创文章。相关事项声明如下&#xff1a; …...

Windows逆向工程提升之IMAGE_RESOURCE_DIRECTORY

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 资源目录概述 什么是资源目录&#xff1f; 资源目录的作用 资源目录的位置 资源目录核心结构 IMAGE_RESOURCE_DIRECTORY IMAGE_RESOURCE_DIRECTORY_ENTRY IMAGE_RESOURCE_DATA_EN…...

使用ps为图片添加水印

打开图片 找到文字工具 输入想要添加的水印 使用移动工具移动到合适的位置 选中文字图层 设置不透明度 快捷键ctrlt可以旋转 另存为png格式图片...

x64_ubuntu22.04.5安装:cuda driver + cuda toolkit

引言 本文操作均已实践验证&#xff0c;安装流程来自nvidia官方文档&#xff0c;验证平台显卡&#xff1a;RTX4070。 验证日期&#xff1a;2025.5.24. 1.安装cuda driver 1.1.安装方式有2种&#xff0c;这里选择方式1&#xff1a; 从apt安装最省事&#x1f496;&#xff0c…...

开盘啦 APP 抓包 逆向分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 抓包 这是一个记录贴。 这个APP是数…...

vs2022 Qt Visual Studio Tools插件设置

安装之后&#xff0c;需要指定QT中msvc编译器的位置&#xff0c;点击下图Location右边的按钮即可 选择msvc2022_64\bin目录下的 qmake.exe 另一个问题,双击UI文件不能打开设计界面 设置打开方式 选择msvc2022_64\bin目录下的designer.exe 确定即可 然后设置为默认值即可 确定…...

Python包__init__.py标识文件解析

在 Python 中&#xff0c;__init__.py 文件是包&#xff08;Package&#xff09;的核心标识文件&#xff0c;它的存在使一个目录被 Python 解释器识别为「包」。这个文件有以下核心作用&#xff1a; 核心作用 标识包的存在 任何包含 __init__.py 的目录都会被 Python 视为一个包…...

【MySQL】第8节|Innodb底层原理与Mysql日志机制深入剖析(一)

MySQL 的 redo log&#xff08;重做日志&#xff09; redo log 是 MySQL 中 InnoDB 存储引擎实现事务持久性的关键机制&#xff0c;用于记录数据库数据的变更&#xff0c;确保事务提交后数据不丢失&#xff0c;即使发生宕机也能通过日志恢复数据。 核心作用 1. 实现事务的持…...

电商ERP管理系统,Java+Vue,含源码与文档,统筹订单、库存等,助力电商企业高效运营

前言&#xff1a; 在当今数字化飞速发展的电商时代&#xff0c;电商企业面临着日益激烈的市场竞争和复杂的业务运营环境。为了提升运营效率、降低成本、优化客户体验&#xff0c;一套高效、全面的电商ERP管理系统显得尤为重要。电商ERP管理系统整合了企业内部的各项业务流程&a…...

Spring Boot微服务架构(四):微服务的划分原则

微服务划分原则&#xff08;CRM系统案例说明&#xff09; 一、微服务划分的核心原则 单一职责原则&#xff08;SRP&#xff09; 每个微服务只负责一个明确的业务功能服务边界清晰&#xff0c;避免功能混杂便于独立开发、测试和部署 业务领域驱动设计&#xff08;DDD&#xff0…...

【打卡】树状数组的操作

#define MAXN 1000 int n; // 数组实际长度 int array[MAXN]; // 原始数组&#xff08;下标从0开始&#xff09; int tree[MAXN]; // 树状数组&#xff08;下标从1开始&#xff09; int p[MAXN]; // 前缀和数组&#xff08;下标从1…...

OpenLayers 加载动画控件

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图控件是一些用来与地图进行简单交互的工具&#xff0c;地图库预先封装好&#xff0c;可以供开发者直接使用。OpenLayers具有大部分常用的控件&#x…...

Oracle 基础知识作业的使用

对于DBA来说&#xff0c;数据库Job再熟悉不过了&#xff0c;因为经常要数据库定时的自动执行一些脚本&#xff0c;或做数据库备份&#xff0c;或做数据的提炼&#xff0c;或做数据库的性能优化&#xff0c;包括重建索引等等的工作。 Oracle 视图 User_Jobs 是Oracle数据库中的一…...

HTTP协议初认识、速了解

目录 1. 什么是HTTP协议 2. HTTP协议特点 3. HTTP协议发展和版本 3.1. HTTP1.0 3.2. HTTP1.1 3.3. HTTP2.0 3.4. http1.1和http2.0区别 4. HTTP协议中URI、URL、URN 4.1. URI 4.2. URL 4.3. URN 5. HTTP协议的请求 5.1. HTTP协议中的请求信息 5. 总结 前言 本文讲…...

C#:多线程Task使用

一.Task与Thread Task是架构在Thread之上的&#xff0c;也就是说任务最终还是要抛给线程去执行。Task跟Thread不是一对一的关系&#xff0c;比如开10个任务并不是说会开10个线程&#xff0c;这一点任务有点类似线程池&#xff0c;但是任务相比线程池有很小的开销和精确的控制。…...

模拟电子技术基础----绪论

一、电子技术的发展 1.电子技术的发展&#xff0c;推动计算机技术的发展&#xff0c;使之“无孔不入”&#xff0c;应用广泛&#xff01; •广播通信&#xff1a;发射机、接收机、扩音、录音、程控交换机、电话、手机 •网络&#xff1a;路由器、ATM交换机、收发器、调制解调…...

从零基础到最佳实践:Vue.js 系列(2/10):《模板语法与数据绑定》

Vue.js 模板语法与数据绑定&#xff1a;从基础到实践 关键点 Vue.js 的模板语法使用 HTML 结合特殊指令&#xff08;如 v-bind、v-on&#xff09;&#xff0c;实现动态界面。插值&#xff08;{{ }}&#xff09;显示数据&#xff0c;指令控制 DOM 行为&#xff0c;双向绑定简化…...

iOS 使用 - 设置 来电震动/关闭震动

来电震动是一个很直观的老功能。但到了iOS 18&#xff0c;苹果却把震动功能的开关藏得越来越深&#xff0c;甚至分散在不同的菜单里&#xff0c;让用户难以找到。这里记录分享设置方法&#xff1a; 1. 震动开关的路径 设置 → 通用 → 辅助功能 → 触控 → 震动 2. 来电震动…...

anaconda、miniconda、conda的关系及miniconda安装

anaconda、miniconda、conda的关系及miniconda安装 文章目录 前言正文定义关系Linux安装miniconda新建一个python3.8环境 参考 前言 本文用于记录关于Anaconda、conda和Miniconda的定义及其关系的总结123&#xff1a; 正文 定义 conda 一个跨平台的开源包管理和环境管理工具…...

[C语言初阶]扫雷小游戏

目录 一、原理及问题分析二、代码实现2.1 分文件结构设计2.2 棋盘初始化与打印2.3 布置雷与排查雷2.4 游戏主流程实现 三、后期优化方向 在上一篇文章中&#xff0c;我们实现了我们的第二个游戏——三子棋小游戏。这次我们继续结合我们之前所学的所有内容&#xff0c;制作出我们…...