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

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++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

JAVA transient 关键字作用详解

《JAVAtransient关键字作用详解》Java的transient关键字用于修饰成员变量,使其不参与序列化过程,通过自定义序列化方法,可以手动控制transient变量的序列化行为,本文给大... 目录一、transient关键字作用二、原理详解三、典型使用场景四、代码示例五、注意事项六、与 stat