本文主要是介绍详解教务系统模拟登录与爬取二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
版权声明:本文为博主原创文章,转载 请注明出处: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)
这里查询的是我的知识产权法成绩:
说明:查询结果依次为:课程名,课程属性,学分,成绩。
需要注意的是:这里的学科必须和数据库中的学科完全匹配才能查询成功,如果有时间,我再优化一哈,根据部分字符即可查询成绩。
-结语
后边有时间,还可以实现更多功能,比如教学评估自动填写,查询空教室,查询某一老师开课信息等等。
这篇关于详解教务系统模拟登录与爬取二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!