全国专业分类及专业代码爬取
因业务的需求在网上找了半天的大学专业数据,好不容易找到一个完整的sql文件保存下来后还发现层级关关系是乱的 最后发现了这个网页:全国本科专业分类目录及专业代码查询 决定自己手动抓取数据
数据结构分析
查看页面发现分为基本专业和特设专业两块 但是我大致看了一些基本上差不多 所以就选中了基本专业
在浏览器页面按F12键后发现页面数据结构是一个表格 table 里面都是tr td标签
<table>
<tbody>
<tr class="firstRow">
<!-- 标题-->
<td><strong>专业代码</strong></td>
<td><strong>专业名称</strong></td>
</tr>
<tr>
<!-- 专业名称-->
<td>
<a name="b_zx"></a><strong>01</strong></td>
<td><strong>学科门类:哲学</strong></td>
</tr>
<tr><!-- 一级专业-->
<td><strong>0101</strong></td>
<td><strong>哲学类</strong></td>
</tr>
<tr>
<!-- 二级专业-->
<td>010101</td>
<td>哲学</td>
</tr>
..........
</tbody>
</table>
数据抓取
本来准备使用java的jsoup抓取数据顺便保存到数据库的 但是想到了JavaScript应为天生就是操作HTML的所以用起来方便一些
创建一个HTML文件拷贝页面的table表格 粘贴到body标签里面 复制方法如见下
爬取数据js代码
// 默认获取的是第一个table表
var zhuanye = document.querySelector("tbody");
//选中第二个表
//var zhuanye = document.querySelectorAll("tbody")[1];
var list = zhuanye.children;
var zhuanyeList = []; //json对象集合
var index = -1; // 生成json对象时当前专的下标
var nodeindex = -1; // 生成json时当前一级专业的下标
var index1 = 0; //生成sql语句时当前专业的id
var index2 = 0; //生成专业时当前一级专业的id
var sqlList =[]; //sql集合
for (var i = 1; i <list.length; i++) {
var item = list[i].children;
if(item[0].children.length> 0){
var zhuanyeindex = item[0].innerText;
// 如果当前元素是专业名
if(zhuanyeindex.length ==2){
// 专业名
zhuanyeList.push({
//创建一个对象 用于生成json
id: item[0].innerText ,
name:item[1].innerText,
nodes:[]// 用于存放专业下的一级专业
})
index++;
nodeindex = -1;
//生成sql语句
sqlList.push(getSQL(i,item[0].innerText,item[1].innerText,0));
index1 = i;
}else{
// 一级专业
zhuanyeList[index].nodes.push({
//创建一个对象 用于生成json
id: item[0].innerText ,
name:item[1].innerText,
nodes:[]// 用于存放一级专业下的二级专业
});
nodeindex++;
//生成sql语句
sqlList.push(getSQL(i,item[0].innerText,item[1].innerText,index1));
index2 = i;
}
}else{
//如果是二级专业
zhuanyeList[index].nodes[nodeindex].nodes.push({
//创建一个对象 用于生成json
id: item[0].innerText ,
name:item[1].innerText,
})
//生成sql语句
sqlList.push(getSQL(i,item[0].innerText,item[1].innerText,index2));
}
}
// 生成sql函数(方法)
function getSQL(id,code,name,parentId){
/**
* 数据库表结构
CREATE TABLE `major` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '专业id',
`code` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '专业代码',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '专业名称',
`parentId` int(11) NULL DEFAULT NULL COMMENT '上级di',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 457 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '专业表' ROW_FORMAT = Dynamic;
*/
var sql = "insert major(id,code,name,parentId) values("+id+",'"+code+"','"+name+"',"+parentId+")"
return sql;
}
console.log(JSON.stringify(zhuanyeList)) // 吧集合转换成json字符串
console.log("\n")
//console.log(JSON.stringify(sqlList)) //吧集合转换成sql字符串 是个数组不能直接当SQL执行
// 输出带格式的sql
sqlList.forEach(function(data){
console.log(data+";\n")
})
刚开始是直接生成的json字符串 准备再用java解析后保存到数据库 想着想着发现为啥不直接生成SQL语句简单省事 最后决定直接生成SQL语句
最后打开页面F12键选择Console就可以看见如下数据 点击Copy就可以复制啦
在数据库里面执行SQL语句之前记得先建表
CREATE TABLE `major` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '专业id',
`code` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '专业代码',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '专业名称',
`parentId` int(11) NULL DEFAULT NULL COMMENT '上级di',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 457 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '专业表' ROW_FORMAT = Dynamic;
建完表后执行生成的SQL就完事啦
直接在浏览器执行js代码生成SQL语句
直接在浏览器里面打开:全国本科专业分类目录及专业代码查询 按F12键选择Console 复制我上面的js代码 粘贴到里面 按回车键就可以得到生成sql语句了
这是我已经做好的完整SQL文件SQL文件
来源:CSDN
作者:nesrpk
链接:https://blog.csdn.net/nesrpk/article/details/103463714