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

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

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

Java中八大包装类举例详解(通俗易懂)

《Java中八大包装类举例详解(通俗易懂)》:本文主要介绍Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,... 目录一、包装类(Wrapper Class)1、简要介绍2、包装类特点3、包装类用途二、装箱和拆箱1、装