java随机姓名 根据网络爬虫爬取百家姓和名字

简介: java随机姓名 根据网络爬虫爬取百家姓和名字

思路讲解:


1.获取百家姓和男生名字以及女生名字的资源链接,资源在网上随便找一个都可以


 String firstNameStr="https://hanyu.baidu.com/shici/detail?from=kg1&highlight=&pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&srcid=51369";


2.爬取网站的所有数据,以字符串储存数据


String boyName=webcrawling(boynameStr);


3.利用正则表达式获取数据中所需的中文姓氏和名字,根据网站汉字的格式编写正则


ArrayList<String>  boyData = getData(boyName, "([\\u4e00-\\u9fa5]{2})[、]", 1);


4.正则表达式获取的数据是四个一组,重新切割获取每一个中文字符



5. 将姓氏和姓名进行拼接,利用HashSet确保拼接的名字唯一


ArrayList<String>  data=getName(firstData,boyData,girlData,10,10);


效果图:



全部代码:


import java.io.IOException;
import java.io.InputStreamReader;
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 text01 {
    public static void main(String[] args) throws IOException {
       String firstNameStr="https://hanyu.baidu.com/shici/detail?from=kg1&highlight=&pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&srcid=51369";
       String boynameStr="https://m.pcbaby.com.cn/mip/baike/qzbd/180747.html";
       String girlnameStr="https://zhuanlan.zhihu.com/p/522400912";
        String firstName=webcrawling(firstNameStr);
        ArrayList<String>  firstTempData = getData(firstName, "(.{4})[,。]", 1);
        String boyName=webcrawling(boynameStr);
        ArrayList<String>  boyData = getData(boyName, "([\\u4e00-\\u9fa5]{2})[、]", 1);
        String girlName=webcrawling(girlnameStr);
        ArrayList<String>  girlData = getData(girlName, "([\\u4e00-\\u9fa5]{1,2})(、)", 1);
        //因为姓氏是4个字一组获取到的,所以要重新切割获取每一个字
        ArrayList<String> firstData=new ArrayList<>();
        for (String str : firstTempData) {
            for (int i = 0; i < str.length(); i++) {
                char c=str.charAt(i);
                firstData.add(c+"");
            }
        }
        ArrayList<String>  data=getName(firstData,boyData,girlData,10,10);
        Collections.shuffle(data);
        System.out.println(data);
    }
    public static ArrayList<String> getName( ArrayList<String> firstData,ArrayList<String>  boyData,ArrayList<String>  girlData,int boycount,int girlcount){
        ArrayList<String> arr=new ArrayList<>();
        HashSet<String> hs=new HashSet<>();
        while (boycount-->0){
            Collections.shuffle(firstData);
            Collections.shuffle(boyData);
            hs.add(firstData.get(0)+boyData.get(0));
        }
        while (girlcount-->0){
            Collections.shuffle(firstData);
            Collections.shuffle(girlData);
            hs.add(firstData.get(0)+girlData.get(0));
        }
        for (String s : hs) {
            arr.add(s);
        }
        return arr;
    }
    public static String webcrawling(String net) throws IOException {
        //使用sb拼接爬取到的字符串
        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();
    }
    public static ArrayList<String> getData(String str,String regex,int index){
        //利用list数组存取最后的数据
       ArrayList<String> arr=new ArrayList<>();
       //获取正则表达式的规则
        Pattern pattern = Pattern.compile(regex);
        //按照pattern的规则到str中获取数据
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()){
            //index是获取正则表达是的第几组,如果是0则是完整数据
            String group = matcher.group(index);
            arr.add(group);
        }
        return arr;
    }
}


相关文章
|
4天前
|
Java
java网络编程 UDP通信协议实现局域网内文件的发送和接收
java网络编程 UDP通信协议实现局域网内文件的发送和接收
java网络编程 UDP通信协议实现局域网内文件的发送和接收
|
5天前
|
数据采集 机器学习/深度学习 前端开发
Java爬虫中的数据清洗:去除无效信息的技巧
Java爬虫中的数据清洗:去除无效信息的技巧
|
10天前
|
数据采集 Java API
java接口防爬虫
8月更文挑战第9天
|
11天前
|
网络协议 Java 关系型数据库
16 Java网络编程(计算机网络+网络模型OSI/TCP/IP+通信协议等)
16 Java网络编程(计算机网络+网络模型OSI/TCP/IP+通信协议等)
40 2
|
19天前
|
缓存 网络协议 算法
(二)Java网络编程之爆肝HTTP、HTTPS、TLS协议及对称与非对称加密原理!
作为一名程序员,尤其是Java程序员,那必须得了解并掌握HTTP/HTTPS相关知识。因为在如今计算机网络通信中,HTTP协议的作用功不可没,无论是日常上网追剧、冲���、亦或是接口开发、调用等,必然存在HTTP的“影子”在内。尤其对于WEB开发者而言,HTTP几乎是每天会打交道的东西。
45 10
|
18天前
|
Java 应用服务中间件 Linux
(九)Java网络编程无冕之王-这回把大名鼎鼎的Netty框架一网打尽!
现如今的开发环境中,分布式/微服务架构大行其道,而分布式/微服务的根基在于网络编程,而Netty恰恰是Java网络编程领域的无冕之王。Netty这个框架相信大家定然听说过,其在Java网络编程中的地位,好比JavaEE中的Spring。
|
19天前
|
安全 Java Linux
(七)Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析!
IO(Input/Output)方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的IO教学大多数是停留在最基本的BIO,而并未对于NIO、AIO、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本文则准备围绕着IO知识进行展开。
|
1月前
|
数据采集 Java API
java接口防爬虫
7月更文挑战第4天
52 13
|
1月前
|
数据采集 Web App开发 Java
Java爬虫安全策略:防止TikTok音频抓取过程中的请求被拦截
Java爬虫安全策略:防止TikTok音频抓取过程中的请求被拦截
|
19天前
|
存储 Java Unix
(八)Java网络编程之IO模型篇-内核Select、Poll、Epoll多路复用函数源码深度历险!
select/poll、epoll这些词汇相信诸位都不陌生,因为在Redis/Nginx/Netty等一些高性能技术栈的底层原理中,大家应该都见过它们的身影,接下来重点讲解这块内容。