Java网络爬虫拼接姓氏,名字并写出到txt文件(实现随机取名)

news/2024/7/19 10:23:41 标签: java, 爬虫, python

目录

  • 1.爬取百家姓
    • 1.爬取代码
    • 2.爬取效果
  • 2.爬取名字
    • 1.筛选男生名字
    • 2.筛选女生名字
  • 3.数据处理(去除重复)
  • 4.拼接数据
  • 5.将数据写出到文件中

1.爬取百家姓

目标网站,仅作为实验目的。

①爬取姓氏网站: https://hanyu.baidu.com/shici/detail?from=aladdin&pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&showPinyin=1
②爬取男生名字网站:https://baijiahao.baidu.com/s?id=1744863812577130101&wfr=spider&for=pc
③爬取女生名字网站:https://baijiahao.baidu.com/s?id=1743833274577209720&wfr=spider&for=pc

1.爬取代码

1.爬虫函数(使用转换流,输入输出流)

java">    /**
     *从网络中爬取数据,将数据拼接成字符串
     * @param net 网址
     * @return 爬取的数据
     */
    public static String webCrawler(String net) throws IOException {
        //拼接爬取到的数据
        StringBuilder sb = new StringBuilder();
        //创建一个url对象
        URL url = new URL(net);
        //网络连接
        URLConnection conn = url.openConnection();
        //读取数据
        InputStreamReader isr = new InputStreamReader(conn.getInputStream());//转换流
        int ch;
        while ((ch = isr.read()) != -1){
            sb.append((char) ch);
        }
        //释放资源
        isr.close();
        //将读取的数据进行返回
        return sb.toString();
    }
}

2.数据筛选函数(正则表达式

java">   /**
     *根据正则表达式获取数据
     * @param str 完整的字符串
     * @param rule 正则表达式
     * @return 姓氏
     */
    private static ArrayList<String> getData(String str, String rule,int index) {
        //存放数据
        ArrayList<String> list = new ArrayList<>();
        //获取编译器
        Pattern compile = Pattern.compile(rule);
        //使用编译器匹配字符串
        Matcher matcher = compile.matcher(str);

        while (matcher.find()){
            String group = matcher.group(index);
            list.add(group);
        }

        return list;
    }

3.主函数main

java">public class Test1 {
    public static void main(String[] args) throws IOException {
        //定义变量记录爬取目标的网址
        String familyNameNet = "https://hanyu.baidu.com/shici/detail?from=aladdin&pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&showPinyin=1";
        String boyName = "https://baijiahao.baidu.com/s?id=1744863812577130101&wfr=spider&for=pc";
        String girlName = "https://baijiahao.baidu.com/s?id=1743833274577209720&wfr=spider&for=pc";

        //爬取数据,把网址上所有的数据拼接成一个字符串
        String family = webCrawler(familyNameNet);
        String boy = webCrawler(boyName);
        String girl = webCrawler(girlName);

        //使用正则表达式,筛选数据
        ArrayList<String> familyNameTemp = getData(family, "(.{4})(,|。)", 1);

        System.out.println(familyNameTemp);
    }

2.爬取效果

使用集合(ArrayList)存储

在这里插入图片描述

2.爬取名字

1.筛选男生名字

使用正则表达式匹配汉字

java">        ArrayList<String> boyNameTemp = getData(boy, "([\\u4E00-\\u9FA5]{2})(、|。)", 1);
        System.out.println(boyNameTemp);

效果:
在这里插入图片描述

2.筛选女生名字

java">        ArrayList<String> girlNameTemp = getData(girl, "([\\u4E00-\\u9FA5]{2})(、|。)", 1);
        System.out.println(girlNameTemp);

效果:
在这里插入图片描述

3.数据处理(去除重复)

java">        //处理男生名字
        //去除重复元素
        ArrayList<String> boyList = new ArrayList<>();
        for (String str : boyNameTemp) {
            if (!boyList.contains(str)){
                boyList.add(str);
            }
        }
        System.out.println(boyList);

        //处理男生名字
        //去除重复元素
        ArrayList<String> girlList = new ArrayList<>();
        for (String str : girlNameTemp) {
            if (!girlList.contains(str)){
                girlList.add(str);
            }
        }
        System.out.println(girlList);

4.拼接数据

拼接成指定集合元素的格式:“张三-性别-年龄

java">    /**
     * 作用:
     * 获取男生和女生的信息:张三-男-23
     *
     * @param familyList 参数一:装着姓氏的集合
     * @param boyList    参数二:装着男生名字的集合
     * @param girlList   参数三:装着女生名字的集合
     * @param boyCnt     参数四:男生的个数
     * @param girlCnt    参数五:女生的个数
     * @return
     */
    public static ArrayList<String> getInfos(ArrayList<String> familyList, ArrayList<String> boyList, ArrayList<String> girlList, int boyCnt, int girlCnt) {
        //生成不重复的名字
        //男生
        HashSet<String> boyhs = new HashSet<>();
        while (true) {
            if (boyhs.size() == boyCnt) {
                break;
            }
            //随机生成
            Collections.shuffle(familyList);
            Collections.shuffle(boyList);
            boyhs.add(familyList.get(0) + boyList.get(0));

        }
        //生成女生
        HashSet<String> girlhs = new HashSet<>();
        while (true) {
            if (girlhs.size() == girlCnt) {
                break;
            }
            //随机生成
            Collections.shuffle(familyList);
            Collections.shuffle(girlList);
            girlhs.add(familyList.get(0) + girlList.get(0));

        }

        //最终格式;张三-男-21
        ArrayList<String> list = new ArrayList<>();
        Random random = new Random();
        //添加男生:年龄要求在18到27岁
        for (String boyName : boyhs) {
            int age = random.nextInt(10) + 18;
            list.add(boyName + "-男-" + age);
        }
        //添加女生:年龄要求在18到25岁
        for (String girlName : girlhs) {
            int age = random.nextInt(8) + 18;
            list.add(girlName + "-女-" + age);
        }
        return list;
    }

主函数添加代码:

java">        ArrayList<String> infos = getInfos(familyList, boyList, girlList, 10, 10);
        //打乱集合顺序
        Collections.shuffle(infos);
        System.out.println(infos);

效果:

在这里插入图片描述

5.将数据写出到文件中

java">        //写出数据
        BufferedWriter bw = new BufferedWriter(new FileWriter("G:\\JavaReview\\day33\\names.txt"));
        for (String info : infos) {
            bw.write(info);
            bw.newLine();
        }

        bw.close();

查看效果:
在这里插入图片描述


http://www.niftyadmin.cn/n/5285445.html

相关文章

C语言用两个函数求最大公约数和最小公倍数

目录 1【c语言】(函数)写两个函数,分别求两个整数的最大公约数和最小公倍数。在主函数中输入两个数&#xff0c;分别调用这两个函数&#xff0c;并输出结果 2代码: 3运行代码: 4总结: 1【c语言】(函数)写两个函数,分别求两个整数的最大公约数和最小公倍数。在主函数中输入两…

Python入门学习篇(七)——列表切片字符串切片

1 列表切片 1.1 语法结构 列表的变量名[start:end:step] """ start表示截取的开始位置(下标从0 开始)&#xff0c;不填是默认是0 end截取的最后一个元素位置1, 不填是截取到最后一个元素 step 每隔几个(step-1)去获取值,默认没填时,step值为1 因而 取值范围为…

Service详解【六】

文章目录 6. Service详解6.1 Service介绍6.2 Service类型6.3 Service使用6.3.1 实验环境准备6.3.2 ClusterIP类型的Service6.3.3 HeadLiness类型的Service6.3.4 NodePort类型的Service6.3.5 LoadBalancer类型的Service6.3.6 ExternalName类型的Service 6.4 Ingress介绍6.5 Ingr…

【低照度图像增强系列(1)】传统方法(直方图、图像变换)算法详解与代码实现

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标检…

外贸建站域名在哪个平台买?域名购买方式?

外贸建站购买域名可以在哪些平台&#xff1f;海洋建站域名如何&#xff1f; 随着全球化的不断发展&#xff0c;越来越多的企业开始涉足外贸领域。而要建立一个成功的外贸网站&#xff0c;选择一个适合的域名是至关重要的。那么&#xff0c;在哪里可以购买到优质的外贸建站域名…

SQL实践篇(一):使用WebSQL在H5中存储一个本地数据库

文章目录 简介本地存储都有哪些&#xff1f;如何使用WebSQL打开数据库事务操作SQL执行 在浏览器端做一个英雄的查询页面如何删除本地存储参考文献 简介 WebSQL是一种操作本地数据库的网页API接口&#xff0c;通过它&#xff0c;我们可以操作客户端的本地存储。 WebSQL曾经是H…

《面试专题-----经典高频面试题收集三》解锁 Java 面试的关键:深度解析并发编程基础篇高频经典面试题(第三篇)

目录 并发编程面试题1.什么是进程、线程、协程&#xff0c;他们之间的关系是怎样的2.协程对于多线程有什么优缺点吗 并发编程面试题 1.什么是进程、线程、协程&#xff0c;他们之间的关系是怎样的 进程: 本质上是⼀个独⽴执⾏的程序&#xff0c;进程是操作系统进⾏资源分配和…

7.3电话号码的字母组合(LC17-M)

算法&#xff1a; 数字到字母要映射&#xff0c;可以用map&#xff0c;也可以用二维数组&#xff0c;或者直接用一个字符串 这里用字符串&#xff0c;键入的数字对应字符串的索引 String[] numString {"", "", "abc", "def", &quo…