前言
在现代教育中,教务系统已经成为了学校管理和教学工作的重要组成部分。然而,由于各种原因,教务系统的成绩单并不能下载的,这给我们带来了很多不必要的麻烦和困扰。因此,采集教务系统成绩单的项目具有非常重要的意义。
目录
前言
环境使用
模块使用
模块介绍
代码实现
发送请求
获取数据
保存数据
总结
环境使用
- python 3.9
- pycharm
模块使用
- requests
模块介绍
- requests
requests是一个很实用的Python HTTP客户端库,爬虫和测试服务器响应数据时经常会用到,requests是Python语言的第三方的库,专门用于发送HTTP请求,使用起来比urllib简洁很多。
- parsel
parsel是一个python的第三方库,相当于css选择器+xpath+re。
parsel由scrapy团队开发,是将scrapy中的parsel独立抽取出来的,可以轻松解析html,xml内容,获取需要的数据。
相比于BeautifulSoup,xpath,parsel效率更高,使用更简单。
- re
re模块是python独有的匹配字符串的模块,该模块中提供的很多功能是基于正则表达式实现的,而正则表达式是对字符串进行模糊匹配,提取自己需要的字符串部分,他对所有的语言都通用。
- os
os 就是 “operating system” 的缩写,顾名思义,os模块提供的就是各种 Python 程序与操作系统进行交互的接口。通过使用 os 模块,一方面可以方便地与操作系统进行交互,另一方面也可以极大增强代码的可移植性。
- csv
它是一种文件格式,一般也被叫做逗号分隔值文件,可以使用 Excel 软件或者文本文档打开 。其中数据字段用半角逗号间隔(也可以使用其它字符),使用 Excel 打开时,逗号会被转换为分隔符。csv 文件是以纯文本形式存储了表格数据,并且在兼容各个操作系统。
模块安装问题:
- 如果安装python第三方模块:
win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车
在pycharm中点击Terminal(终端) 输入安装命令
- 安装失败原因:
- 失败一: pip 不是内部命令
解决方法: 设置环境变量
- 失败二: 出现大量报红 (read time out)
解决方法: 因为是网络链接超时, 需要切换镜像源
清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:https://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 华中理工大学:https://pypi.hustunique.com/ 山东理工大学:https://pypi.sdutlinux.org/ 豆瓣:https://pypi.douban.com/simple/ 例如:pip3 install -i https://pypi.doubanio.com/simple/ 模块名
- 失败三: cmd里面显示已经安装过了, 或者安装成功了, 但是在pycharm里面还是无法导入
解决方法: 可能安装了多个python版本 (anaconda 或者 python 安装一个即可) 卸载一个就好,或者你pycharm里面python解释器没有设置好。
代码实现
我们上一篇介绍了,如何用Python采集情感音频。今天,我们来学习采集教务系统里面的成绩单,把自己的成绩采集下来。大家也可以尝试采集自己学校的教务系统。
发送请求
我们首先确定我们的目标网址,对我们需要获取的数据。
我们要把每一行的数据获取下来,我们接下来用到开发者工具。我们看成绩是在什么位置。是不是在网页源代码中。接下来,我们发送请求,获取网页源代码。
每个学校教务系统不一样,但是,原理都是一样的,我们通过抓包分析,看到,我们学校把成绩放到了一个数据包里面,一个学期一个数据包。
http://jwxt.aqnu.edu.cn/student/for-std/grade/sheet/info/73127?semester={Semester}'
那么,接下来就简单了,我们只需要请求数据,当然,我们肯定要加上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检查,对请求头没有要求。因为cookies涉及到了登录信息,我这里就没有展示了,大家在采集自己学校教务系统的时候,就可以用自己的cookies。
获取数据
id2semesters = res.json()['id2semesters']
semester = id2semesters[f'{Semester}']['nameZh']
semesterId2studentGrades = res.json()['semesterId2studentGrades'][f'{Semester}']
这段代码首先从 JSON 响应中获取了学期和学生的绩点信息,并将其存储在变量 semester
和 semesterId2studentGrades
中。
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)
然后,使用 for
循环遍历 semesterId2studentGrades
中的每个元素,并使用 course
属性获取该学期的课程信息。
这里就是json取值,没有什么难度,只要写好这些,就可以获取到我们想的内容,我们看看效果。
保存数据
保存数据就简单了,我们已经练习了很多次。
f = open('个人成绩单.csv', mode='a', encoding='utf-8_sig', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['学期','课程名称', '课程学分', '课程类型', '成绩', '学分绩点',
'成绩明细'])
我们使用 csv_writer.writerow()
方法写入数据。在这个例子中,我们写入了一个包含学期、课程名称、课程学分、课程类型、成绩、学分绩点和成绩明细的列表。
接下来就是写入字典,保存下来。
dit = {
'学期': semester,
'课程名称': course_nameZh,
'课程学分': credits,
'课程类型': courseProperty_name,
'成绩': gaGrade,
'学分绩点': gp,
'成绩明细': gradeDetail,
}
csv_writer.writerow(dit)
这段代码使用 csv_writer.writerow()
方法将 dit
字典写入 CSV 文件中。fieldnames
参数指定了要写入的列名。在这个例子中,我们指定了 ['学期','课程名称', '课程学分', '课程类型', '成绩', '学分绩点', '成绩明细']
。
总结
总之,采集教务系统成绩单是一个非常有意义的项目实战,它不仅可以采集成绩单,还可以提升我们采集数据的能力。在实现过程中,我们需要注意数据的准确性和完整性,并采取必要的措施来保证项目的安全性和可靠性。