详解教务系统模拟登录与爬取二

2023-11-02 01:08

本文主要是介绍详解教务系统模拟登录与爬取二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

版权声明:本文为博主原创文章,转载 请注明出处:https://blog.csdn.net/sc2079/article/details/82564284

- 写在前面


  上篇博客教务系统模拟登录与成绩爬取对教务处成绩成功爬取并将数据保存在JSON,这篇博客就实现查询成绩的功能。
  我先将数据存入到mysql数据库中,再根据查询字段得到相应信息

- 环境配置


  运行环境:Python3.6、Spyder
  依赖的模块:pymysql,JSON等

-开始工作


1. 存入数据库

  首先,读入JSON数据。

'''导入JSON文件'''
with open('mygrades.json', encoding='utf-8') as f:lines = f.readline()  # 使用逐行读取的方法data = json.loads(lines)  # 解析每一行数据

  观察JSON数据,找到需要的信息并提取。

'''数据提取并以学期存入数据库'''
terms_name=['term1','term2','term3','term4','term5','term6']  #表名
for i in range(len(data['lnList'])):term=data['lnList'][i]infos=[]for sub in term['cjList']:courseNumber=sub['id']['courseNumber']   #课程号coureSequenceNumber=sub['id']['coureSequenceNumber']  #课序号courseName=sub['courseName']    #课程名courseAttributeName=sub['courseAttributeName']  #课程属性credit=float(sub['credit'])   #学分cj=float(sub['cj'])   #成绩gradePointScore=float(sub['gradePointScore'])   #绩点成绩gradeName=sub['gradeName']     #成绩评价englishCourseName=sub['englishCourseName']   #英文课程名examTime=sub['examTime']   #录入时间info=[courseNumber,coureSequenceNumber,courseName,courseAttributeName,credit,cj,gradePointScore,gradeName,englishCourseName,examTime]infos.append(info)save_mysql(terms_name[i],infos)

  将某一学期数据存入数据库,以学期编号为表名

'''将指定学期各科信息存入数据库'''
def save_mysql(term,info):  db = pymysql.connect  #连接数据库(host='localhost',user='root',passwd='root',db='mygrades',charset='utf8')cur = db.cursor()try:cur.execute("select * from %s"% term)  results=cur.fetchall()ori_len=len(results)  #表中已有数据行数except:sql = "create table %s"% term+"(\  #建立新表num int(2) not null,\courseNumber varchar(9) not null,\coureSequenceNumber varchar(3),\courseName varchar(20),\courseAttributeName varchar(4),\credit dec(2,1) unsigned,\cj dec(3,1) unsigned,\gradePointScore dec(2,1) unsigned,\gradeName  varchar(4),\englishCourseName varchar(66),\examTime varchar(8),\primary key(courseNumber)\)"cur.execute(sql)  #建立新表db.commit() #提交事务ori_len=0   #初始表中数据为0print('已在mooc_course数据库中建立新表'+term)for i in range(len(info[0])):cur = db.cursor()   # 使用 cursor() 方法创建一个游标对象 cursorsql = "insert into %s"% term+"(num,courseNumber,coureSequenceNumber,courseName,\courseAttributeName,credit,cj,gradePointScore,gradeName,englishCourseName,examTime)\VALUES ('%d','%s','%s','%s','%s','%d','%d','%d','%s','%s','%s')" %\(ori_len+i,info[i][0],info[i][1],info[i][2],info[i][3],info[i][4],info[i][5],info[i][6],info[i][7],info[i][8],info[i][9])#执行数据库插入操作try:                            cur.execute(sql)  except Exception as e:db.rollback()   # 发生错误时回滚print('第'+str(i+1)+'数据存入数据库失败!'+str(e))else:db.commit()  # 事务提交print('第'+str(i+1)+'数据已存入数据库')db.close()

  执行结果:

  打开某一学期成绩如下:

  需要说明的是最后一个字段值,我以为是考试时间,实际上应该是录入成绩时间,因此这个数据实际意义不大,可忽略。

2. 每学期总体情况

  每学期总体情况我没有导入数据库,直接JSON读取即可。

'''每学期总体情况'''
term_infos=[]
for i in range(len(data['lnList'])):term=data['lnList'][i]zxf=float(term['zxf'])    #总学分zxs=float(term['zxs'])    #总学时tgms=float(term['tgms'])    #已修读课程门数zms=float(term['zms'])    #通过课程门数yxxf=float(term['yxxf'])    #学分完成率term_info=[terms_name[i],zxf,zxs,tgms,zms,yxxf]term_infos.append(term_info)

  运行结果:


  说明:数据依次为:学期序号,总学分,总学时,通过课程门数,已修读课程门数,学分完成率。鉴于时间原因,这里没有漂亮地打印出来。

3. 查询指定学期成绩

  这个很类似于微信公共号上的快速查成绩功能,可以得到某个学期的成绩。

'''查询指定学期成绩''' 
def mysql_term_grade(term):db = pymysql.connect(host='localhost',user='root',passwd='root',db='mygrades',charset='utf8')    cur = db.cursor() try:cur.execute("select courseName,cj from %s"% term)results=cur.fetchall()results=[(i[0],float(i[1])) for i in results]  #成绩数据类型转化except:print('获取失败!')results=[]return results 
term='term2'  #第二学期      
result=mysql_term_grade(term)   

  第二学期查询结果:


4. 查询指定科目成绩

  查询指定科目的成绩

'''查询指定科目成绩'''
def mysql_term_grade(sub):db = pymysql.connect(host='localhost',user='root',passwd='root',db='mygrades',charset='utf8')    cur = db.cursor() sql = 'SHOW TABLES'cur.execute(sql)tables= cur.fetchall()for table in tables:try:cur.execute("select * from %s"% table+" where courseName='%s'"% sub)results=cur.fetchall()[0]results=[results[3],results[4],float(results[5]),float(results[6])]except:results=[]if results==[]: print('获取失败!')        return results 
sub='知识产权法'  
result=mysql_term_grade(sub)  
print(result)  

  这里查询的是我的知识产权法成绩:


  说明:查询结果依次为:课程名,课程属性,学分,成绩。
  需要注意的是:这里的学科必须和数据库中的学科完全匹配才能查询成功,如果有时间,我再优化一哈,根据部分字符即可查询成绩。

-结语


  后边有时间,还可以实现更多功能,比如教学评估自动填写,查询空教室,查询某一老师开课信息等等。

这篇关于详解教务系统模拟登录与爬取二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/327043

相关文章

MySQL 8 中的一个强大功能 JSON_TABLE示例详解

《MySQL8中的一个强大功能JSON_TABLE示例详解》JSON_TABLE是MySQL8中引入的一个强大功能,它允许用户将JSON数据转换为关系表格式,从而可以更方便地在SQL查询中处理J... 目录基本语法示例示例查询解释应用场景不适用场景1. ‌jsON 数据结构过于复杂或动态变化‌2. ‌性能要

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

Python 字典 (Dictionary)使用详解

《Python字典(Dictionary)使用详解》字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力,:本文主要介绍Python字典(Dictionary)... 目录字典1.基本特性2.创建字典3.访问元素4.修改字典5.删除元素6.字典遍历7.字典的高级特性默认字典

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更