学校的数据库实验中有 student
,course
和 grade
三张表,后面的题目需要向这三张表中填入大量数据,同时老师要求使用 JDBC 向数据库插入数据。所以我在这次实验中一并使用 Java 来产生随机数据
1. 随机生成姓名
中文名是由姓 + 名组成的,而且一般为 2 ~ 3 个字。我们维护 3 个数组分别保存姓,男名和女名:
static private final List<String> first_name = Arrays.asList(
"王", "李", "张", "刘", "陈", "杨", "黄", "赵", "吴", "周", "徐",
"孙", "马", "朱", "胡", "郭", "何", "高", "林", "郑", "谢", "罗",
"梁", "宋", "唐", "许", "韩", "冯", "邓", "曹", "彭", "曾", "萧",
"田", "董", "袁", "潘", "于", "蒋", "蔡", "余", "杜", "叶", "程",
"苏", "魏", "吕", "丁", "任", "沈", "姚", "卢", "姜", "崔", "钟",
"谭", "陆", "汪", "范", "金", "石", "廖", "贾", "夏", "韦", "付",
"方", "白", "邹", "孟", "熊", "秦", "邱", "江", "尹", "薛", "闫",
"段", "雷", "侯", "龙", "史", "陶", "黎", "贺", "顾", "毛", "郝",
"龚", "邵", "万", "钱", "严", "覃", "武", "戴", "莫", "孔", "向",
"汤"
);
static private final List<String> girl_name = Arrays.asList(
"秀英", "桂英", "玉兰", "桂兰", "秀珍", "凤英", "玉珍", "玉英", "兰英",
"秀英", "桂英", "英", "玉兰", "萍", "秀兰", "玉梅", "红", "敏", "丽",
"艳", "敏", "芳", "霞", "红梅", "燕", "红", "英", "静", "丽", "娟", "艳",
"燕", "敏", "娜", "芳", "丹", "玲", "婷", "婷婷", "丹", "倩", "婷", "欣怡",
"婷婷", "悦", "敏", "佳怡", "雪", "颖", "雨欣", "欣怡", "梓涵", "诗涵",
"梓宣", "子涵", "紫涵", "佳怡", "雨涵", "雨欣", "一诺"
);
static private final List<String> boy_name = Arrays.asList(
"建国", "建华", "国华", "和平", "明", "建平", "军", "平", "志明", "徳明",
"军", "勇", "强", "斌", "军", "伟", "强", "刚", "建军", "斌", "波", "辉",
"伟", "磊", "勇", "超", "强", "鹏", "军", "波", "杰", "超", "涛", "杰",
"鹏", "磊", "强", "鑫", "涛", "浩", "杰", "鑫", "俊杰", "磊", "帅", "宇",
"鹏", "浩宇", "浩然", "宇轩", "子轩", "宇航", "皓轩", "子豪", "浩轩",
"俊杰", "子涵"
);
创建好这些数组后使用 Random
产生随机下标选取姓和名进行拼接即可,在拼接的同时还可以得到性别信息
2. 抓取课程名
如果使用上面产生随机姓名的方法来生成课程名,最终得到的结果并不好,谁知道会拼出啥课程名所以我使用爬虫的方法爬出1000门课程。
首先要选择数据来源。自家教务处的课程数据当然可以爬,课也多,学分课时之类的信息也比较全,但是可能需要登陆比较麻烦。所以我选择从中国大学 MOOC上爬,具体的课程列表来自大学-国家精品,这里有 1300 多门课,够用了
当然,自己写爬虫程序挺麻烦的,我使用 curlconverter 来辅助生成代码。详细步如下:
- 在 MOOC 网站上通过 F12 找到课程列表所在的请求报文
在“全部课程”里随便选一页后会抓到下面 xhr
类型的报文
- 复制 cURL 内容,右键选择复制即可(如下图)
- 到 curlconverter 中将复制的内容粘贴后就能够生成对应的代码了,这个网站支持的语言还是蛮多的
生成出来的 Java 代码是被放在 Main
函数里面的,我们将它改成函数并将 response
作为返回值即可得到抓取的 json 数据,后面就可以使用 fastjson
等 json 库对其处理,这里不再详述。
一次抓到更多课程
你可能会注意到,上面的程序一次只能抓到 20 门课程的数据,那可不可以一次就把 1000 门课程都抓到吗?其实是可以的,我们会注意到代码中有如下片段:
httpConn.setDoOutput(true);
OutputStreamWriter writer = new OutputStreamWriter(httpConn.getOutputStream());
writer.write("mocCourseQueryVo=%7B%22categoryId%22%3A-1%2C%22categoryChannelId%22%3A2001%2C%22orderBy%22%3A0%2C%22stats%22%3A30%2C%22pageIndex%22%3A2%2C%22pageSize%22%3A20%7D");
writer.flush();
writer.close();
尤其注意 write.write()
里面出现了 pageIndex%22%3A2%2C%22pageSize%22%3A20
这个字样,显然,修改这两处的值就可以控制一次抓取的课程数量了。这串内容是这么分解的:
"pageIndex%22%3A" + "2" + "%2C%22pageSize%22%3A" + "20"
这个 2 和 20 的意思就是选择第 2 页,每页有 20 门课。将其改为 1,1000 就可以一次抓出 1000 门课了(总共就只有 1300 个课程别超了,而且这里选择第几页的第 0 页和第 1 页经过测试都一样)