最终生成格式为:张三-男-23,分辨代表姓名、性别和年龄。
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 爬取网页内容,生成随机男孩女孩姓名
*/
public class WebNameCrawler {
/**
* main方法
* 姓氏 https://zhuanlan.zhihu.com/p/671961620
* 女孩姓名 https://www.shopwang.net/38945345.html
* 男孩姓名 https://www.shopwang.net/93977424.html
*
* @param args
*/
public static void main(String[] args) throws IOException {
String familyNamesURL = "https://zhuanlan.zhihu.com/p/671961620"; // 姓
String girlNamesURL = "https://www.shopwang.net/38945345.html"; // 女孩名字
String boyNamesURL = "https://www.shopwang.net/93977424.html"; // 男孩名字
// 1.获取姓氏
String familyNamesHTML = getHTMLText(familyNamesURL);
ArrayList<String> familyNames = getWords(familyNamesHTML, "([\\u4E00-\\u9FA5]|[\\u4E00-\\u9FA5]{2})(、|。)", 1);
//System.out.println(familyNames.size());
System.out.println(familyNames);
// 2.获取女孩名
String girlHTML = getHTMLText(girlNamesURL);
ArrayList<String> girlList = getWords(girlHTML, "(([\\u4E00-\\u9FA5]{2}、){4}[\\u4E00-\\u9FA5]{2})", 0);
// System.out.println(girlList);
// 模板元素:诗琳、若婉、勤凡、瑾汐、琬兮
ArrayList<String> girlNames = new ArrayList<>();
for (String s : girlList) {
String[] names = s.split("、");
for (String name : names) {
girlNames.add(name);
}
}
System.out.println(girlNames);
// 3.获取男孩名
String boyHTML = getHTMLText(boyNamesURL);
ArrayList<String> boyList = getWords(boyHTML, "(([\\u4E00-\\u9FA5]{2}、){4}[\\u4E00-\\u9FA5]{2})", 0);
// System.out.println(girlList);
// 模板元素:诗琳、若婉、勤凡、瑾汐、琬兮
ArrayList<String> boyNames = new ArrayList<>();
for (String s : boyList) {
String[] names = s.split("、");
for (String name : names) {
boyNames.add(name);
}
}
System.out.println(boyNames);
// 4.生成dummpy姓名
ArrayList<String> dummyNames = getDummyNames(familyNames, boyNames, girlNames, 70, 50);
System.out.println(dummyNames);
// 5.写出
FileWriter fw = new FileWriter(new File("files/dummyNames"+System.currentTimeMillis()+".txt"));
BufferedWriter bw = new BufferedWriter(fw);
for (String dummyName : dummyNames) {
bw.write(dummyName);
bw.newLine();
}
bw.flush();
bw.close();
}
/**
* 生成假名字
* @param familyNameList 姓列表
* @param boyNameList 男孩名列表
* @param girlNameList 女孩名列表
* @param boyCount 要生成几个男孩名
* @param girlCount 要生成几个女孩名
* @return 生成好的姓名列表
*/
public static ArrayList<String> getDummyNames(ArrayList<String> familyNameList,
ArrayList<String> boyNameList, ArrayList<String> girlNameList,
int boyCount, int girlCount){
ArrayList<String> dummyNames = new ArrayList<>();
// 1.生成男孩姓名
while (dummyNames.size() < boyCount){
String name = familyNameList.get(new Random().nextInt(familyNameList.size()))
+ boyNameList.get(new Random().nextInt(boyNameList.size()));
if (!dummyNames.contains(name)){
dummyNames.add(name + "-男-" + (new Random().nextInt(5) + 20));
}
}
// 2.生成女孩姓名
while (dummyNames.size() < (boyCount + girlCount)){
String name = familyNameList.get(new Random().nextInt(familyNameList.size()))
+ girlNameList.get(new Random().nextInt(girlNameList.size()));
if (!dummyNames.contains(name)){
dummyNames.add(name + "-女-" + (new Random().nextInt(15) + 20));
}
}
return dummyNames;
}
/**
* 用正则表达式摘取想要的数据并返回
* @param src 源文本
* @param regex 正则表达式
* @param position 利用Matcher.group(int)获取字符的位置
* @return 正则匹配的文本列表
*/
public static ArrayList<String> getWords(String src, String regex, int position){
// 存放返回字符的列表
ArrayList<String> list = new ArrayList<>();
// 正则匹配
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(src);
// 循环读取
while (m.find()){
String bit = m.group(position);
if (!list.contains(bit)){
list.add(bit);
}
}
// 返回列表
return list;
}
/**
* getHTMLText(URL url)方法的重载
* @param urlStr
* @return
* @throws IOException
*/
public static String getHTMLText(String urlStr) throws IOException {
return getHTMLText(new URL(urlStr));
}
/**
* 获取制定URL的HTML文本
*
* @param url HTML网页的URL
* @return 网页的HTML文本
*/
public static String getHTMLText(URL url) throws IOException {
// 1.打开链接
URLConnection conn = url.openConnection();
// 2.获取输入流Reader读取数据
InputStreamReader isr = new InputStreamReader(conn.getInputStream());
// 3.缓冲区
char[] buffer = new char[1024 * 128];
// 4.读取长度
int len;
// 5.StringBuilder类存放html文本
StringBuilder sb = new StringBuilder();
// 6.循环读取
while ((len = isr.read(buffer)) != -1) {
sb.append(buffer, 0, len);
}
// 7.返回文本
return sb.toString();
}
}