本文小编为大家详细介绍“Python怎么采集大学教务系统成绩单”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python怎么采集大学教务系统成绩单”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
采集数据
发送请求
我们首先确定我们的目标网址,对我们需要获取的数据。
我们要把每一行的数据获取下来,我们接下来用到开发者工具。我们看成绩是在什么位置。是不是在网页源代码中。接下来,我们发送请求,获取网页源代码。
每个学校教务系统不一样,但是,原理都是一样的,我们通过抓包分析,看到,我们学校把成绩放到了一个数据包里面,一个学期一个数据包。
那么,接下来就简单了,我们只需要请求数据,当然,我们肯定要加上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)
我们这里直接多页遍历,我们学校只做了cookies检查,对请求头没有要求。
这段代码首先定义了一个包含多个元素的列表
semesters,其中每个元素表示一个学期的信息。然后,使用
for循环遍历列表中的每个元素,并使用
requests.get()函数向指定的 URL 发送 GET 请求。在请求中,我们设置了一些请求头信息,以确保我们能够正确地解析 URL 并获取正确的响应。最后,我们打印了 URL、响应和响应中的内容。
获取数据
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'] # 课程学分 try: courseProperty = semesterId2studentGrade['courseProperty'] courseProperty_name = courseProperty['name'] except TypeError: courseProperty_name = "NOLL" gp = semesterId2studentGrade['gp'] # 绩点 gaGrade = semesterId2studentGrade['gaGrade'] # 成绩 gradeDetails = semesterId2studentGrade['gradeDetail'] # 明细原文 gradeDetail = re.findall('data-typeid=.*?>(.*?)</span>', gradeDetails)
这段代码首先从 JSON 响应中获取了学期和学生的绩点信息,并将其存储在变量
semester和
semesterId2studentGrades中。然后,使用
for循环遍历
semesterId2studentGrades中的每个元素,并使用
course属性获取该学期的课程信息。接着,使用
course_nameZh属性获取课程名称,使用
credits属性获取课程学分,使用
courseProperty_name属性获取课程属性名称,如果不存在则返回 "NOLL"。最后,使用
gp属性获取绩点,使用
gaGrade属性获取成绩,使用
gradeDetail属性获取明细原文,使用
gradeDetail属性获取明细原文中的数据类型标识符。
这里就是json取值,没有什么难度,只要写好这些,就可以获取到我们想的内容,我们看看效果。
保存数据
保存数据就简单了,我们已经练习了很多次。
f = open('个人成绩单.csv', mode='a', encoding='utf-8_sig', newline='') csv_writer = csv.DictWriter(f, fieldnames=['学期','课程名称', '课程学分', '课程类型', '成绩', '学分绩点', '成绩明细'])
这段代码首先打开一个名为
personal_scores.csv的文件,并指定使用
a模式打开文件。然后,使用
csv.DictWriter()函数创建一个 CSV 写入器,并指定要写入的列名。在这个例子中,我们指定了
fieldnames参数,它包含了我们要写入的列名。
接下来,我们使用
csv_writer.writeheader()方法写入列名。这个方法会将列名写入文件的第一行。
最后,我们使用
csv_writer.writerow()方法写入数据。在这个例子中,我们写入了一个包含学期、课程名称、课程学分、课程类型、成绩、学分绩点和成绩明细的列表。
接下来就是写入字典,保存下来。
dit = { '学期': semester, '课程名称': course_nameZh, '课程学分': credits, '课程类型': courseProperty_name, '成绩': gaGrade, '学分绩点': gp, '成绩明细': gradeDetail, } csv_writer.writerow(dit)
这段代码使用
csv_writer.writerow()方法将
dit字典写入 CSV 文件中。
fieldnames参数指定了要写入的列名。在这个例子中,我们指定了 ['学期','课程名称', '课程学分', '课程类型', '成绩', '学分绩点', '成绩明细']。