Java网络爬虫,制造虚拟数据

网络爬虫,制造假数据

需求:制造假数据也是开发中的一个能力,在各个网络上爬取数据,是其中一个方法。

package com.iolianxi;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author 戒爱学Java
 * @date 2023/3/27 20:37
 */
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> boyNameStrTempList = getData(boyNameStr,"([\\u4E00-\\u9FA5]{2})(、| 。)",1);
        ArrayList<String> girlNameStrTempList = getData(girlNameStr,"(.. ){4}..",0);

        //4、处理数据
        //姓氏处理方案,把每一个姓氏拆开放到一个新的集合当中
        ArrayList<String> familyNameList = new ArrayList<>();

        for (String str : familyNameTempList) {
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                familyNameList.add(c + "");
            }
        }

        //处理男生名字
        //处理方案,去除其中的重复元素
        ArrayList<String> boyNameList = new ArrayList<>();
        for (String str : boyNameStrTempList) {
            if (!boyNameList.contains(str)){
                boyNameList.add(str);
            }
        }

        //处理女生名字
        ArrayList<String> girlNameList = new ArrayList<>();
        for (String str : girlNameStrTempList) {
            String[] s = str.split(" ");
            for (int i = 0; i < s.length; i++) {
                girlNameList.add(s[i]);
            }
        }

        //5、生成数据
        //姓名(唯一) - 性别 - 年龄
        ArrayList<String> list = getInfos(familyNameList, boyNameList, girlNameList, 20, 30);
        Collections.shuffle(list);

        //6、写出数据
        BufferedWriter bw = new BufferedWriter(new FileWriter("..\\lian_xi\\name.txt"));
        for (String name : list) {
            bw.write(name);
            bw.newLine();
        }
        bw.close();
    }

    /**
     * 作用:获取男生和女生的信息:张三 - 男 - 23
     * @param familyNameList 装着姓氏的集合
     * @param boyNameList    装着男生名字的集合
     * @param girlNameList   装着女生名字的集合
     * @param boyCount       男生的个数
     * @param girlCount      女生的个数
     * @return              信息
     */
    public static ArrayList<String> getInfos( ArrayList<String> familyNameList, ArrayList<String> boyNameList, ArrayList<String> girlNameList,int boyCount, int girlCount){
        //1、生成不重复的名字
        HashSet<String> boyhs = new HashSet<>();
        //2、生成男生的名字
        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();
        for (String boyName : boyhs) {
            int age = r.nextInt(10) + 18;
            list.add(boyName + "-男-" + age);
        }

        //4、创建女生最终的信息

        for (String girlName : girlhs) {
            int age = r.nextInt(8) + 18;
            list.add(girlName + "-女-" + age);
        }

        return list;
    }



    /**
     * @funciton 根据正则表达式获取字符串中的数据
     * @param nameStr   完整的字符串
     * @param regex     正则表达式
     * @return          真正想要的数据
     */
    private static ArrayList<String> getData(String nameStr, String regex,int index) {
        //1、创建集合存放数据
        ArrayList<String> list = new ArrayList<>();
        //2、按照正则表达式的规则,去获取数据
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(nameStr);

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

        }

        return list;

    }

    /**
     *
     * @param net 网址
     * @return 返回爬取到的数据
     */
    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 b;
        while ((b = isr.read()) != -1){
            sb.append((char)b);
        }
        //5、释放资源
        isr.close();
        return sb.toString();

    }
}

posted @ 2023-03-29 13:25  戒爱学Java  阅读(51)  评论(0编辑  收藏  举报