Python采集大學(xué)教務(wù)系統(tǒng)成績(jī)單實(shí)戰(zhàn)示例
前言
采集教務(wù)系統(tǒng)成績(jī)單是一個(gè)非常有意義的項(xiàng)目。在現(xiàn)代教育中,教務(wù)系統(tǒng)已經(jīng)成為了學(xué)校管理和教學(xué)工作的重要組成部分。然而,由于各種原因,教務(wù)系統(tǒng)的成績(jī)單并不能下載的,這給我們帶來(lái)了很多不必要的麻煩和困擾。因此,采集教務(wù)系統(tǒng)成績(jī)單的項(xiàng)目具有非常重要的意義。
在本文中,我們將詳細(xì)介紹采集教務(wù)系統(tǒng)成績(jī)單的背景和目的,并闡述該項(xiàng)目實(shí)戰(zhàn)所涉及的相關(guān)知識(shí)點(diǎn)和技術(shù)細(xì)節(jié)。
采集數(shù)據(jù)
我們上一篇介紹了,如何采集大家熟悉的百度貼吧的排行榜。今天,我們來(lái)學(xué)習(xí)采集教務(wù)系統(tǒng)里面的成績(jī)單,把自己的成績(jī)采集下來(lái)。
發(fā)送請(qǐng)求
我們首先確定我們的目標(biāo)網(wǎng)址,對(duì)我們需要獲取的數(shù)據(jù)。
我們要把每一行的數(shù)據(jù)獲取下來(lái),我們接下來(lái)用到開(kāi)發(fā)者工具。我們看成績(jī)是在什么位置。是不是在網(wǎng)頁(yè)源代碼中。接下來(lái),我們發(fā)送請(qǐng)求,獲取網(wǎng)頁(yè)源代碼。
每個(gè)學(xué)校教務(wù)系統(tǒng)不一樣,但是,原理都是一樣的,我們通過(guò)抓包分析,看到,我們學(xué)校把成績(jī)放到了一個(gè)數(shù)據(jù)包里面,一個(gè)學(xué)期一個(gè)數(shù)據(jù)包。
那么,接下來(lái)就簡(jiǎn)單了,我們只需要請(qǐng)求數(shù)據(jù),當(dāng)然,我們肯定要加上cookies,畢竟里面包含了我們的登錄信息。
我們看看前面代碼是怎么寫的。
semesters = ["44", "45", "46", "66", "126", ] for Semester in semesters: url = f'http://jwxt.aqnu.edu.cn/student/for-std/grade/sheet/info/73127?semester={Semester}' headers = { 'Cookie': 'cookies', } res = requests.get(url, headers=headers) print(url, res)
我們這里直接多頁(yè)遍歷,我們學(xué)校只做了cookies檢查,對(duì)請(qǐng)求頭沒(méi)有要求。
這段代碼首先定義了一個(gè)包含多個(gè)元素的列表 semesters
,其中每個(gè)元素表示一個(gè)學(xué)期的信息。然后,使用 for
循環(huán)遍歷列表中的每個(gè)元素,并使用 requests.get()
函數(shù)向指定的 URL 發(fā)送 GET 請(qǐng)求。在請(qǐng)求中,我們?cè)O(shè)置了一些請(qǐng)求頭信息,以確保我們能夠正確地解析 URL 并獲取正確的響應(yīng)。最后,我們打印了 URL、響應(yīng)和響應(yīng)中的內(nèi)容。
獲取數(shù)據(jù)
id2semesters = res.json()['id2semesters'] semester = id2semesters[f'{Semester}']['nameZh'] semesterId2studentGrades = res.json()['semesterId2studentGrades'][f'{Semester}'] for semesterId2studentGrade in semesterId2studentGrades: course = semesterId2studentGrade['course'] # 課程 course_nameZh = course['nameZh'] # 課程名稱 credits = course['credits'] # 課程學(xué)分 try: courseProperty = semesterId2studentGrade['courseProperty'] courseProperty_name = courseProperty['name'] except TypeError: courseProperty_name = "NOLL" gp = semesterId2studentGrade['gp'] # 績(jī)點(diǎn) gaGrade = semesterId2studentGrade['gaGrade'] # 成績(jī) gradeDetails = semesterId2studentGrade['gradeDetail'] # 明細(xì)原文 gradeDetail = re.findall('data-typeid=.*?>(.*?)</span>', gradeDetails)
這段代碼首先從 JSON 響應(yīng)中獲取了學(xué)期和學(xué)生的績(jī)點(diǎn)信息,并將其存儲(chǔ)在變量 semester
和 semesterId2studentGrades
中。然后,使用 for
循環(huán)遍歷 semesterId2studentGrades
中的每個(gè)元素,并使用 course
屬性獲取該學(xué)期的課程信息。接著,使用 course_nameZh
屬性獲取課程名稱,使用 credits
屬性獲取課程學(xué)分,使用 courseProperty_name
屬性獲取課程屬性名稱,如果不存在則返回 "NOLL"。最后,使用 gp
屬性獲取績(jī)點(diǎn),使用 gaGrade
屬性獲取成績(jī),使用 gradeDetail
屬性獲取明細(xì)原文,使用 gradeDetail
屬性獲取明細(xì)原文中的數(shù)據(jù)類型標(biāo)識(shí)符。
這里就是json取值,沒(méi)有什么難度,只要寫好這些,就可以獲取到我們想的內(nèi)容,我們看看效果。
保存數(shù)據(jù)
保存數(shù)據(jù)就簡(jiǎn)單了,我們已經(jīng)練習(xí)了很多次。
f = open('個(gè)人成績(jī)單.csv', mode='a', encoding='utf-8_sig', newline='') csv_writer = csv.DictWriter(f, fieldnames=['學(xué)期','課程名稱', '課程學(xué)分', '課程類型', '成績(jī)', '學(xué)分績(jī)點(diǎn)', '成績(jī)明細(xì)'])
這段代碼首先打開(kāi)一個(gè)名為 personal_scores.csv
的文件,并指定使用 a
模式打開(kāi)文件。然后,使用 csv.DictWriter()
函數(shù)創(chuàng)建一個(gè) CSV 寫入器,并指定要寫入的列名。在這個(gè)例子中,我們指定了 fieldnames
參數(shù),它包含了我們要寫入的列名。
接下來(lái),我們使用 csv_writer.writeheader()
方法寫入列名。這個(gè)方法會(huì)將列名寫入文件的第一行。
最后,我們使用 csv_writer.writerow()
方法寫入數(shù)據(jù)。在這個(gè)例子中,我們寫入了一個(gè)包含學(xué)期、課程名稱、課程學(xué)分、課程類型、成績(jī)、學(xué)分績(jī)點(diǎn)和成績(jī)明細(xì)的列表。
接下來(lái)就是寫入字典,保存下來(lái)。
dit = { '學(xué)期': semester, '課程名稱': course_nameZh, '課程學(xué)分': credits, '課程類型': courseProperty_name, '成績(jī)': gaGrade, '學(xué)分績(jī)點(diǎn)': gp, '成績(jī)明細(xì)': gradeDetail, } csv_writer.writerow(dit)
這段代碼使用 csv_writer.writerow()
方法將 dit
字典寫入 CSV 文件中。fieldnames
參數(shù)指定了要寫入的列名。在這個(gè)例子中,我們指定了 ['學(xué)期','課程名稱', '課程學(xué)分', '課程類型', '成績(jī)', '學(xué)分績(jī)點(diǎn)', '成績(jī)明細(xì)']。
總結(jié)
總之,采集教務(wù)系統(tǒng)成績(jī)單是一個(gè)非常有意義的項(xiàng)目實(shí)戰(zhàn),它不僅可以采集成績(jī)單,還可以提升我們采集數(shù)據(jù)的能力。在實(shí)現(xiàn)過(guò)程中,我們需要注意數(shù)據(jù)的準(zhǔn)確性和完整性,并采取必要的措施來(lái)保證項(xiàng)目的安全性和可靠性。
以上就是Python采集大學(xué)教務(wù)系統(tǒng)成績(jī)單實(shí)戰(zhàn)示例的詳細(xì)內(nèi)容,更多關(guān)于Python采集教務(wù)系統(tǒng)成績(jī)單的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python?ArcPy實(shí)現(xiàn)批量拼接長(zhǎng)時(shí)間序列柵格圖像
這篇文章主要介紹了如何基于Python中ArcPy模塊,對(duì)大量不同時(shí)相的柵格遙感影像按照其成像時(shí)間依次執(zhí)行批量拼接的方法,感興趣的可以了解一下2023-03-03在python tkinter中Canvas實(shí)現(xiàn)進(jìn)度條顯示的方法
今天小編就為大家分享一篇在python tkinter中Canvas實(shí)現(xiàn)進(jìn)度條顯示的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06OpenCV搞定騰訊滑塊驗(yàn)證碼的實(shí)現(xiàn)代碼
這篇文章主要介紹了OpenCV搞定騰訊滑塊驗(yàn)證碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Python時(shí)間戳使用和相互轉(zhuǎn)換詳解
這篇文章主要為大家詳細(xì)介紹了Python時(shí)間戳使用和相互轉(zhuǎn)換的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12python語(yǔ)言中print中加號(hào)、減號(hào)、乘號(hào)的應(yīng)用方式
這篇文章主要介紹了python語(yǔ)言中print中加號(hào)、減號(hào)、乘號(hào)的應(yīng)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02離線狀態(tài)下在jupyter notebook中使用plotly實(shí)例
這篇文章主要介紹了離線狀態(tài)下在jupyter notebook中使用plotly實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04