IO练习——网络爬虫(爬取数据)

java 复制代码
package com.lkbhua.Test2;

import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.concurrent.Callable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class test0 {
    public static void main(String[] args) throws IOException {
        /*
            1.获取姓氏: https://hanyu.baidu.com/shichi/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0
            2.获取男生名字: http://www.haoming8.cn/baobao/10881.htm1
            3.获取女生名字: http://www.haoming8.cn/baobao/7641.htm1
        */

        // 1、定义变量记录网址
        String familyNameNet = "https://hanyu.baidu.com/shichi/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0";
        String boyNameNet = "http://www.haoming8.cn/baobao/10881.htm1";
        String girlNameNet = "http://www.haoming8.cn/baobao/7641.htm1";

        // 2、爬取数据,把网上的数据拼接成一个完整的字符串
        String familyName = webCrawler(familyNameNet);
        String boyName = webCrawler(boyNameNet);
        String girlName = webCrawler(girlNameNet);

        // 3、通过正则表达式把其中符合要求的数据获取出来
        ArrayList<String> familyNameTempList = getData(familyName,".({4})(,|。)",1 );
        System.out.println(familyNameTempList);

        // [\u4E00-\u9FA5]: 中文的范围
        ArrayList<String> boyNameTempList = getData(boyName,"([\\u4E00-\\u9FA5]{2})(、|。)",1 );
        System.out.println(boyNameTempList);

        ArrayList<String> girlNameTempList = getData(girlName,"(.. ){4}..",0 );
        System.out.println(girlNameTempList);

        // 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 : boyNameTempList){
            if(!boyNameList.contains(str)){
                boyNameList.add(str);
            }
        }

        // 关于女生 名
        // 把里面的每一个元素用空格进行切割
        ArrayList<String> girlNameList = new ArrayList<>();
        for(String str : girlNameTempList){
            String[] arr = str.split(" ");
            for(String name : arr){
                girlNameList.add(name);
            }
        }

        // 5、把数据进行组合生成一个真正的名字信息
        // 姓 + 名 + 年龄
        ArrayList<String> dataList = getData(familyNameList, boyNameList, girlNameList, 10, 10);
        System.out.println(dataList);

        // 6、输出数据
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\name.txt"));
        for(String data : dataList){
            bw.write(data);
            bw.newLine();
        }
        bw.close();
        System.out.println("数据爬取完毕");

    }

    /*
    * 作用:
    *     获取男生和女生的信息: 张三-男-25
    * 参数1:
    *     装着姓氏的集合
    * 参数2:
    *     装着男生名字的集合
    * 参数3:
    *     装着女生名字的集合
    * 参数4:
    *     男生的个数
    * 参数5:
    *     女生的个数
    * */
    public static ArrayList<String> getData(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() == boyCount){
                break;
            }
            // 随机
            Collections.shuffle(familyNameList);
            Collections.shuffle(girlNameList);
            girlHs.add(familyNameList.get(0) + girlNameList.get(0));
        }

        // 生成最终男生的信息
        ArrayList<String> list = new ArrayList<>();
        for(String boyName : boyHs){
            int age = (int)(Math.random() * 100);
            list.add(boyName + "-男-" + age);
        }

        // 生成最终女生的信息
        for(String girlName : girlHs){
            int age = (int)(Math.random() * 100);
            list.add(girlName + "-女-" + age);
        }

        return list;
    }



    /*
    *    作用:
    *        通过正则表达式把数据获取出来
    *    参数:
    *        完整的字符串
    *        正则表达式
    *        ???
    *    返回值:
     *        获取到的数据
    * */
    public 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()){
            // 3、获取数据
            String data = matcher.group(index);
            // 4、把数据添加到集合中
            list.add(data);
        }
        return list;
    }


    /*
    * 作用:
    *    从网络上爬取数据,把数据拼接成字符串返回
    * 参数:
    *     url: 爬取数据的网址
    * 返回值:
    *     爬取到的所有数据
    * */
    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();
    }
}
相关推荐
喇一渡渡5 小时前
Java力扣---滑动窗口(1)
java·算法·排序算法
一水鉴天5 小时前
整体设计 之28 整体设计 架构表表述总表的 完整程序(之27 的Q268 )(codebuddy)
java·前端·javascript
net3m335 小时前
雅特力单片机用串口USART_INT_TDE中断比用USART_INT_TRAC的 发送效率要高
java·开发语言·算法
雪碧聊技术6 小时前
深入解析:Java中int类型转换为String类型的多种方法
java·整数转为字符串
爱打代码的小林6 小时前
python基础(逻辑回归例题)
开发语言·python·逻辑回归
BD_Marathon6 小时前
【JavaWeb】启动tomcat报错:启动子级时出错
java·tomcat
while(1){yan}6 小时前
网络协议TCP
java·网络·网络协议·tcp/ip·青少年编程·电脑常识
一过菜只因6 小时前
JavaWeb后端(spring--boot)
java·开发语言