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

版权声明:本文为博主原创文章,转载 请注明出处: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   #初始表中数据为0
        print('已在mooc_course数据库中建立新表'+term)
    for i in range(len(info[0])):
        cur = db.cursor()   # 使用 cursor() 方法创建一个游标对象 cursor
        sql = "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)  

  这里查询的是我的知识产权法成绩:


  说明:查询结果依次为:课程名,课程属性,学分,成绩。
  需要注意的是:这里的学科必须和数据库中的学科完全匹配才能查询成功,如果有时间,我再优化一哈,根据部分字符即可查询成绩。

-结语


  后边有时间,还可以实现更多功能,比如教学评估自动填写,查询空教室,查询某一老师开课信息等等。

猜你喜欢

转载自blog.csdn.net/sc2079/article/details/82564284