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

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

相关文章

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

MySQL8 密码强度评估与配置详解

《MySQL8密码强度评估与配置详解》MySQL8默认启用密码强度插件,实施MEDIUM策略(长度8、含数字/字母/特殊字符),支持动态调整与配置文件设置,推荐使用STRONG策略并定期更新密码以提... 目录一、mysql 8 密码强度评估机制1.核心插件:validate_password2.密码策略级

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

详解python pycharm与cmd中制表符不一样

《详解pythonpycharm与cmd中制表符不一样》本文主要介绍了pythonpycharm与cmd中制表符不一样,这个问题通常是因为PyCharm和命令行(CMD)使用的制表符(tab)的宽... 这个问题通常是因为PyCharm和命令行(CMD)使用的制表符(tab)的宽度不同导致的。在PyChar

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队