大学专业分类及专业代码爬取

冷暖自知 提交于 2019-12-15 03:27:31

因业务的需求在网上找了半天的大学专业数据,好不容易找到一个完整的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文件

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!