
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();
}
}
