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

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管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ