java网络爬虫

前言

单一个项目的功能需要测试的时候,就需要使用大量的假数据做测试,但是这些数据又不能太假,必须合乎常理。于是我们需要爬虫爬取一些网站的一些允许爬取的数据,来做项目功能测试。

一.确认爬取目标 

 现在爬取下面三个网站的数据

二.爬取代码 

public class Test1 {public static void main(String[] args) throws IOException {/*制造假数据:获取姓氏:https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0获取男生名字:http://www.haoming8.cn/baobao/10881.html获取女生名字:http://www.haoming8.cn/baobao/7641.html*///1.定义变量记录网址String familyNameNet = "https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0";String boyNameNet = "http://www.haoming8.cn/baobao/10881.html";String girlNameNet = "http://www.haoming8.cn/baobao/7641.html";//2.爬取数据,把网址上所有的数据拼接成一个字符串String familyNameStr = webCrawler(familyNameNet);String boyNameStr = webCrawler(boyNameNet);String girlNameStr = webCrawler(girlNameNet);//3.通过正则表达式,把其中符合要求的数据获取出来ArrayList<String> familyNameTempList = getData(familyNameStr,"(.{4})(,|。)",1);ArrayList<String> boyNameTempList = getData(boyNameStr,"([\\u4E00-\\u9FA5]{2})(、|。)",1);ArrayList<String> girlNameTempList = getData(girlNameStr,"(.. ){4}..",0);//4.处理数据//familyNameTempList(姓氏)//处理方案:把每一个姓氏拆开并添加到一个新的集合当中ArrayList<String> familyNameList = new ArrayList<>();for (String str : familyNameTempList) {//str 赵钱孙李  周吴郑王   冯陈褚卫   蒋沈韩杨for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);familyNameList.add(c + "");}}//boyNameTempList(男生的名字)//处理方案:去除其中的重复元素ArrayList<String> boyNameList = new ArrayList<>();for (String str : boyNameTempList) {if(!boyNameList.contains(str)){boyNameList.add(str);}}//girlNameTempList(女生的名字)//处理方案:把里面的每一个元素用空格进行切割,得到每一个女生的名字ArrayList<String> girlNameList = new ArrayList<>();for (String str : girlNameTempList) {String[] arr = str.split(" ");for (int i = 0; i < arr.length; i++) {girlNameList.add(arr[i]);}}//5.生成数据//姓名(唯一)-性别-年龄ArrayList<String> list = getInfos(familyNameList, boyNameList, girlNameList, 70, 50);Collections.shuffle(list);//6.写出数据BufferedWriter bw = new BufferedWriter(new FileWriter("myiotest\\names.txt"));for (String str : list) {bw.write(str);bw.newLine();}bw.close();}/** 作用:*      获取男生和女生的信息:张三-男-23** 形参:*      参数一:装着姓氏的集合*      参数二:装着男生名字的集合*      参数三:装着女生名字的集合*      参数四:男生的个数*      参数五:女生的个数* */public static ArrayList<String> getInfos(ArrayList<String> familyNameList,ArrayList<String> boyNameList,ArrayList<String> girlNameList, int boyCount,int girlCount){//1.生成男生不重复的名字HashSet<String> boyhs = new HashSet<>();while (true){if(boyhs.size() == boyCount){break;}//随机Collections.shuffle(familyNameList);Collections.shuffle(boyNameList);boyhs.add(familyNameList.get(0) + boyNameList.get(0));}//2.生成女生不重复的名字HashSet<String> girlhs = new HashSet<>();while (true){if(girlhs.size() == girlCount){break;}//随机Collections.shuffle(familyNameList);Collections.shuffle(girlNameList);girlhs.add(familyNameList.get(0) + girlNameList.get(0));}//3.生成男生的信息并添加到集合当中ArrayList<String> list = new ArrayList<>();Random r = new Random();//【18 ~ 27】for (String boyName : boyhs) {//boyName依次表示每一个男生的名字int age = r.nextInt(10) + 18;list.add(boyName + "-男-" + age);}//4.生成女生的信息并添加到集合当中//【18 ~ 25】for (String girlName : girlhs) {//girlName依次表示每一个女生的名字int age = r.nextInt(8) + 18;list.add(girlName + "-女-" + age);}return list;}/** 作用:根据正则表达式获取字符串中的数据* 参数一:*       完整的字符串* 参数二:*       正则表达式* 参数三:*      获取数据*       0:获取符合正则表达式所有的内容*       1:获取正则表达式中第一组数据*       2:获取正则表达式中第二组数据*       ...以此类推** 返回值:*       真正想要的数据** */private static ArrayList<String> getData(String str, String regex,int index) {//1.创建集合存放数据ArrayList<String> list = new ArrayList<>();//2.按照正则表达式的规则,去获取数据Pattern pattern = Pattern.compile(regex);//按照pattern的规则,到str当中获取数据Matcher matcher = pattern.matcher(str);while (matcher.find()){list.add(matcher.group(index));}return list;}/** 作用:*   从网络中爬取数据,把数据拼接成字符串返回* 形参:*   网址* 返回值:*   爬取到的所有数据* */public static String webCrawler(String net) throws IOException {//1.定义StringBuilder拼接爬取到的数据StringBuilder sb = new StringBuilder();//2.创建一个URL对象URL url = new URL(net);//3.链接上这个网址//细节:保证网络是畅通的,而且这个网址是可以链接上的。URLConnection conn = url.openConnection();//4.读取数据InputStreamReader isr = new InputStreamReader(conn.getInputStream());int ch;while ((ch = isr.read()) != -1){sb.append((char)ch);}//5.释放资源isr.close();//6.把读取到的数据返回return sb.toString();}
}

注意:正则表达式的创建是要根据一个网页的内容中,目标数据和其他数据做对比的。 

 三.idea获取正则表达式的插件

(1)idea插件商店搜索any-rule

(2)下载完成后右击选择AnyRule或快捷键alt+A

(3)出现搜索框搜索想要的正则表达式

四、使用第三方工具包Hutool爬取代码

public class Test2 {public static void main(String[] args){//利用糊涂包生成假数据,并写到文件当中//1. 定义网址String familyNameNet = "https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0";String boyNameNet = "http://www.haoming8.cn/baobao/10881.html";String girlNameNet = "http://www.haoming8.cn/baobao/7641.html";//2.爬取数据String familyNameStr = HttpUtil.get(familyNameNet);String boyNameStr = HttpUtil.get(boyNameNet);String girlNameStr = HttpUtil.get(girlNameNet);//3.利用正则表达式获取数据//通过正则表达式,把其中符合要求的数据获取出来List<String> familyNameTempList = ReUtil.findAll("(.{4})(,|。)", familyNameStr, 1);List<String> boyNameTempList = ReUtil.findAll("([\\u4E00-\\u9FA5]{2})(、|。)", boyNameStr, 1);List<String> girlNameTempList = ReUtil.findAll("(.. ){4}..", girlNameStr, 0);System.out.println(familyNameTempList);System.out.println(boyNameTempList);System.out.println(girlNameTempList);//4.处理数据//familyNameTempList(姓氏)//处理方案:把每一个姓氏拆开并添加到一个新的集合当中ArrayList<String> familyNameList = new ArrayList<>();for (String str : familyNameTempList) {//str 赵钱孙李  周吴郑王   冯陈褚卫   蒋沈韩杨for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);familyNameList.add(c + "");}}//boyNameTempList(男生的名字)//处理方案:去除其中的重复元素ArrayList<String> boyNameList = new ArrayList<>();for (String str : boyNameTempList) {if(!boyNameList.contains(str)){boyNameList.add(str);}}//girlNameTempList(女生的名字)//处理方案:把里面的每一个元素用空格进行切割,得到每一个女生的名字ArrayList<String> girlNameList = new ArrayList<>();for (String str : girlNameTempList) {String[] arr = str.split(" ");for (int i = 0; i < arr.length; i++) {girlNameList.add(arr[i]);}}//5.生成数据//姓名(唯一)-性别-年龄ArrayList<String> list = getInfos(familyNameList, boyNameList, girlNameList, 70, 50);Collections.shuffle(list);//6.写出数据//细节://糊涂包的相对路径,不是相对于当前项目而言的,而是相对class文件而言的FileUtil.writeLines(list,"D:\\names.txt","UTF-8");}/** 作用:*      获取男生和女生的信息:张三-男-23** 形参:*      参数一:装着姓氏的集合*      参数二:装着男生名字的集合*      参数三:装着女生名字的集合*      参数四:男生的个数*      参数五:女生的个数* */public static ArrayList<String> getInfos(ArrayList<String> familyNameList,ArrayList<String> boyNameList,ArrayList<String> girlNameList, int boyCount,int girlCount){//1.生成男生不重复的名字HashSet<String> boyhs = new HashSet<>();while (true){if(boyhs.size() == boyCount){break;}//随机Collections.shuffle(familyNameList);Collections.shuffle(boyNameList);boyhs.add(familyNameList.get(0) + boyNameList.get(0));}//2.生成女生不重复的名字HashSet<String> girlhs = new HashSet<>();while (true){if(girlhs.size() == girlCount){break;}//随机Collections.shuffle(familyNameList);Collections.shuffle(girlNameList);girlhs.add(familyNameList.get(0) + girlNameList.get(0));}//3.生成男生的信息并添加到集合当中ArrayList<String> list = new ArrayList<>();Random r = new Random();//【18 ~ 27】for (String boyName : boyhs) {//boyName依次表示每一个男生的名字int age = r.nextInt(10) + 18;list.add(boyName + "-男-" + age);}//4.生成女生的信息并添加到集合当中//【18 ~ 25】for (String girlName : girlhs) {//girlName依次表示每一个女生的名字int age = r.nextInt(8) + 18;list.add(girlName + "-女-" + age);}return list;}
}

 

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

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

相关文章

常用的GPIO的配置(基于STM32F103C8xx)

绿色&#xff1a;注释 紫色&#xff1a;实际使用代码 //开启GPIOB的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); ①可选输入值&#xff1a;RCC_APB2Periph_GPIOA 或者 RCC_APB2Periph_GPIOB 或者 RCC_APB2Periph_ALL ②可选输入值&a…

【云原生】恰当运用kubernetes中三种探针,确保应用程序在Kubernetes集群中保持健康、可用和可靠

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

电脑录屏软件免费版,分享4款,轻松录制精彩瞬间

电脑录屏已成为创作、教学和分享的热门方式。然而&#xff0c;对于一些用户来说&#xff0c;购买专业的录屏软件可能会增加负担。幸运的是&#xff0c;市场上存在许多电脑录屏软件免费版的选择。它们提供了丰富的功能&#xff0c;让您可以尽情展现您的创意&#xff0c;无须为此…

蝙蝠避障:盲人出行的守护者,让每一步都安心

在这个多彩的世界里&#xff0c;作为一位盲人&#xff0c;我时常感受着出行的种种挑战。每一次踏出家门&#xff0c;都是一场未知的探险&#xff0c;心里难免有些忐忑。街道上的车流声、人群的喧闹&#xff0c;这些对我而言只是模糊的背景音&#xff0c;真正让我担忧的是那些突…

Python对腾讯课程视频链接自动化抓取

近期看到腾讯课堂停服的通知&#xff0c;心痛之余&#xff0c;想到啊&#xff0c;我还有很多课程没看完&#xff0c;就剩下两个月的事件&#xff0c;我也来不及看完了。怎么办&#xff1f; 索性&#xff0c;我研究下&#xff0c;怎么把视频保存下来。 接下来请听我分析。 所…

KMZ格式详解,javascript写入读取KMZ示例

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

SAP中检质操作原因导致的WM和MM库存状态不一致实例分析处理

近期遇到一个问题描述如下&#xff1a; 某个物料通过MM的库存查询MMBE&#xff0c;结果是没有质检库存的。但通过WM的库存查询事务LS24&#xff0c;结果是有Q状态&#xff08;即质检库存&#xff09;的。 不明原因的用户可能会认为这是系统的BUG&#xff0c;但作为一个多年经验…

浅谈 Mybatis 框架

文章目录 一、什么是MyBatis?1.2、JDBC 二、使用Mybatis2.1、配置MyBatis开发环境2.1.1、配置连接字符串2.1.2、配置MyBatis中的XML路径 2.2、使用MyBatis模式和语法操作数据库 三、使用 Mybatis 进行增删改查操作的要点3.1、ResultMap的用法 四、Mybatis操作难点4.1、#{ } 和…

JavaWeb基础1:HTML/CSS/JS/HTTP

JavaWeb基础1&#xff1a;HTML/CSS/JS/HTTP (qq.com)

FPGA知识基础之--clocking wizard ip核的使用以及modelsim与vivado联合仿真

目录 前言一、ip核是什么&#xff1f;1.1 定义1.2 分类 二、为什么使用ip核2.1 ip核的优点2.2 ip核的缺点 三、如何使用ip核&#xff08;vivado&#xff09;四、举例&#xff08;clocking wizard ip核&#xff09;4.1 简介4.2 实验任务4.3 程序设计4.3.1 系统模块4.3.2 波形绘制…

连接数据库报错bad handshake

堡垒机账号没有授权访问权限

2024最新最全面的Selenium 3.0 + Python自动化测试框架

文档说明 Selenium是一个用于Web应用程序自动化测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 Selenium测试的主要功能包括&#xff1a; 测试与浏览器的兼容性&#xff1a;测试应用程序是否能很好的工作在不同的浏览器和操作系统之上。…

云计算学习——5G网络技术

系列文章目录 提示&#xff1a;仅用于个人学习&#xff0c;进行查漏补缺使用。 Day1 网络参考模型 Day2 网络综合布线与应用 Day3 IP地址 Day4 华为eNSP网络设备模拟器的基础安装及简单使用 Day5 交换机的基本原理与配置 Day6 路由器的原理与配置 Day7 网络层协议介绍一 Day8 …

Jpa-多表关联-OneToOne

Jpa-多表关联-OneToOne 准备JoinColumnOneToOne属性targetEntitycascade*PERSISTMERGEREMOVEREFRESH orphanRemovalfetchoptionalMappedBy* OneToOne在 hibernate中用于对表与表之间进行维护关联 准备 import com.alibaba.fastjson.JSON; import jakarta.persistence.*; impor…

AI8-文本检测

文本检测任务是找出图像或视频中的文字位置。不同于目标检测任务,目标检测不仅要解决定位问题,还要 解决目标分类问题。 文本在图像中的表现形式可以视为一种‘目标‘,通用的目标检测的方法也适用于文本检测,从任务本身上来 看: • 目标检测:给定图像或者视频,找出目…

本地部署 faster-whisper

本地部署 faster-whisper 1. 创建虚拟环境2. 安装依赖模块3. 创建 Web UI4. 启动 Web UI5. 访问 Web UI 1. 创建虚拟环境 conda create -n faster-whisper python3.11 -y conda activate faster-whisper2. 安装依赖模块 pip install torch2.2.2 torchvision0.17.2 torchaudio…

bilibili实习生一面0625

OSI七层模型 物理层&#xff1a;将帧中的比特传送到下一个节点&#xff08;比特&#xff09; 数据链路层&#xff1a;将数据包装成帧并传送到路径上下一个节点&#xff0c;将相邻节点间不可靠的物理链路变成可靠的逻辑链路&#xff08;帧&#xff09; 网络层&#xff1a;路由寻…

Qt 5.14安装(配置MSVC 2017)

Qt 5.14安装&#xff08;配置MSVC 2017&#xff09; 记录一下自己安装配置Qt的步骤。 我需要安装Qt&#xff0c;并使用MSVC编译&#xff0c;所以才写了这篇文章。 一、环境 操作系统&#xff1a;windows 11 &#xff08;64位&#xff09; Qt&#xff1a;Qt 5.14.2 vs&…

怎么读取FRM、MYD、MYI数据文件

一、介绍frm、MYD、MYI文件 在MySQL中&#xff0c;使用MyISAM存储引擎时&#xff0c;数据库表会被分割成几个不同的文件文件描述功能扩展名FRM 文件表结构定义文件存储表的结构信息&#xff0c;字段、索引等.FRMMYD 文件数据文件包含表的实际数据.MYD&#xff08;MYData&#x…

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-04 IP层程序设计

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…