詳解教務系統模擬登入與爬取二
阿新 • • 發佈:2018-11-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 #初始表中資料為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)
這裡查詢的是我的智慧財產權法成績:
說明:查詢結果依次為:課程名,課程屬性,學分,成績。
需要注意的是:這裡的學科必須和資料庫中的學科完全匹配才能查詢成功,如果有時間,我再優化一哈,根據部分字元即可查詢成績。
-結語
後邊有時間,還可以實現更多功能,比如教學評估自動填寫,查詢空教室,查詢某一老師開課資訊等等。