用python计算绩点的代码_使用Python计算研究生学分绩(绩点)
最近看了CSDN上一个专栏《
具体过程专栏作者写得很清楚,详见
根据那篇博文,整个过程分为以下几步:
打开教务系统网站,查看登陆时发送了哪些信息,分析POST和GET信息,并在模拟登陆时使用;
进入网站后,查看如何与网站交互,同步骤一,分析这些信息,在模拟查询时使用;
使用爬虫模拟登陆和查询,得到成绩页面的html代码;
使用正则表达式提取得到的html代码中的所有成绩信息;
通过提取到的成绩信息计算平均学分绩。
具体操作细节可以参考上面那篇博文。此处不再赘述。
这里写一下我遇到的问题。上述博文中,作者登陆成绩查询系统后,直接找到成绩查询页面的URL就可以得到成绩页面的html代码,而在我们学校的教务系统中我却怎么也找不到该URL。经过N多次实验发现,我们学校查询的时候也会发送一个特定格式的POST信息,然后才会返回成绩页面,也就是说得再次模拟发送一次浏览成绩信息。感觉是由于自己对网站相关知识不了解,认为只要模仿就能取得结果,殊不知这里查询方式的不同,浪费了不少时间。
得到网页信息后,就需要写正则表达式来提取成绩信息。关于Python的正则表达式详见:
附上源代码:
1 #-*- coding: utf-8 -*-
2 #author: Kill Console
3 #功能:计算西工大研究生本学期成绩学分绩
4
5 importurllib6 importurllib27 importcookielib8 importre9
10 REQUIRED = '\xe5\xad\xa6\xe4\xbd\x8d\xe5\xbf\x85\xe4\xbf\xae\xe8\xaf\xbe' #必修
11 ELECTIVE = '\xe5\xad\xa6\xe4\xbd\x8d\xe9\x80\x89\xe4\xbf\xae\xe8\xaf\xbe' #选修
12
13 classNPUSpider:14 def __init__(self, stuid, pwd):15 self.login_url = 'http://222.24.211.70/grsadmin/servlet/studentLogin' #登陆url
16 self.query_url = 'http://222.24.211.70/grsadmin/servlet/studentMain' #成绩查询url
17 self.cookie_jar = cookielib.CookieJar() #初始化一个CookieJar来处理Cookie的信息
18 self.post_data_login = urllib.urlencode({'TYPE':'AUTH', 'glhj':'', 'USER':stuid, 'PASSWORD':pwd}) #POST登录数据
19 self.post_data_query = urllib.urlencode({'MAIN_TYPE':'3', 'MAIN_SUB_ACTION':'浏览成绩', 'MAIN_NEXT_ACTION':'LL', 'MAIN_PURPOSE':'/jsp/student_JhBrow.jsp'}) #POST查询数据
20 self.opener =urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie_jar))21 self.course_data = [] #存储一门课的信息,包括课程号、课程名、学分、成绩等
22 self.weights = [] #存储学分
23 self.scores = [] #存储成绩
24 self.GPA = 0.0
25
26 definit_spider(self):27 req_login = urllib2.Request(url = self.login_url, data = self.post_data_login) #自定义一个登录请求
28 result_login = self.opener.open(req_login) #访问登录页面
29 req_query = urllib2.Request(url = self.query_url, data = self.post_data_query) #自定义一个查询请求
30 result_query = self.opener.open(req_query) #访问成绩页面
31 self.process_data(result_query.read().decode('gbk').encode('utf-8')) #由于存在中文,先解码再编码
32 self.calculate_GPA()33
34 defprocess_data(self, res_page):35 self.course_data = re.findall(r'
(.*?).*?(.*?).*?\s+(.*?)\s+.*?(.*?).*?(.*?).*?(.*?).*?(.*?).*?', res_page, re.S)36 for item inself.course_data:37 self.weights.append(item[4])38 self.scores.append(item[5])39
40 defcalculate_GPA(self):41 sum_score = 0.0
42 sum_weight = 0.0
43 for i inrange(len(self.course_data)):44 if self.course_data[i][2] == REQUIRED and self.scores[i].isdigit(): #判断该科目是否是必修且是否有分数,若是则进行计算
45 sum_score += float(self.weights[i]) *float(self.scores[i])46 sum_weight +=float(self.weights[i])47 self.GPA = sum_score /sum_weight48
49 defprint_GPA(self):50 print u'课程代码\t\t类型\t\t学期\t\t学分\t\t成绩\t\t得分日期\t\t课程名称'
51 print '-'*120
52 for item inself.course_data:53 if item[2] ==REQUIRED:54 rqd = '\xe5\xad\xa6\xe4\xbd\x8d\xe5\xbf\x85\xe4\xbf\xae\xe8\xaf\xbe'
55 print '%s\t\t%s\t%s\t\t%s\t\t%s\t\t%s\t\t%s' % (item[0], rqd, item[3], item[4], item[5], item[6], item[1])56 else:57 print '%s\t\t%s\t%s\t\t%s\t\t%s\t\t%s\t\t%s' % (item[0], item[2], item[3], item[4], item[5], item[6], item[1])58 print
59 print 'The GPA is %.4f' %self.GPA60
61
62 defmain():63 stuid = raw_input('student ID:').strip()64 pwd = raw_input('pass word:').strip()65
66 spider =NPUSpider(stuid, pwd)67 spider.init_spider()68 spider.print_GPA()69
70 if __name__ == '__main__':71 main()
以下是一个西工大本科生学分绩计算脚本,由于测试时没有进行教学评估的查询不了,只能查询本学期成绩,所以计算的是本学期成绩学分绩(只计算必修):
1 #-*- coding: utf-8 -*-
2 #author: Kill Console
3 #功能:计算西工大本科生本学期成绩学分绩
4
5 importurllib6 importurllib27 importcookielib8 importre9
10 REQUIRED = '\xe5\xbf\x85\xe4\xbf\xae' #必修
11 ELECTIVE = '\xe4\xbb\xbb\xe9\x80\x89' #选修
12
13 classNPUSpider:14 def __init__(self, stuid, pwd):15 self.login_url = 'http://jw.nwpu.edu.cn/loginAction.do' #登陆url
16 self.result_url = 'http://jw.nwpu.edu.cn/bxqcjcxAction.do' #本学期成绩查询url
17 self.cookie_jar = cookielib.CookieJar() #初始化一个CookieJar来处理Cookie的信息
18 self.post_data = urllib.urlencode({'zjh':stuid, 'mm':pwd}) #POST的数据
19 self.opener =urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie_jar))20 self.course_data = [] #存储一门课的信息,包括课程号、课程名、学分、成绩等
21 self.weights = [] #存储学分
22 self.scores = [] #存储成绩
23 self.GPA = 0.0
24
25 definit_spider(self):26 req = urllib2.Request(url = self.login_url, data = self.post_data) #自定义一个请求
27 result = self.opener.open(req) #访问登录页面
28 result = self.opener.open(self.result_url) #访问成绩页面
29 self.process_data(result.read().decode('gbk').encode('utf-8'))30 self.calculate_GPA()31
32 defprocess_data(self, res_page):33 self.course_data = re.findall(r'
', res_page, re.S)34 for item inself.course_data:35 self.weights.append(item[4])36 self.scores.append(item[6])37
38 defcalculate_GPA(self):39 sum_score = 0.0
40 sum_weight = 0.0
41 for i inrange(len(self.course_data)):42 if self.course_data[i][5] == REQUIRED andself.scores[i].isdigit():43 sum_score += float(self.weights[i]) *float(self.scores[i])44 sum_weight +=float(self.weights[i])45 self.GPA = sum_score /sum_weight46
47 defprint_GPA(self):48 print 'The GPA is %.4f' %self.GPA49
50 defmain():51 stuid = raw_input('student ID:').strip()52 pwd = raw_input('pass word:').strip()53
54 spider =NPUSpider(stuid, pwd)55 spider.init_spider()56 spider.print_GPA()57
58 if __name__ == '__main__':59 main()
View Code
用python计算绩点的代码_使用Python计算研究生学分绩(绩点)相关推荐
- 用python计算绩点的代码_重庆大学GPA计算python程序
GPA计算方法来源于百度文库的方法,<重庆大学学分绩点计算办法(试行)> 运行环境:python 3.x 脚本源码: # 用于重庆大学GPA计算 # author: DYBOY input ...
- python发邮件给女朋友代码_用python讨好女朋友是什么个操作?
原标题:用python讨好女朋友是什么个操作? 文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 转自 |数据团学社(微信搜索metrodata_xue ...
- 用python函数画德国国旗代码_用Python的turtle模块画国旗
最近在学Python,发现Python的海龟绘图非常有趣,就分享一下!话不多说,先来Python turtle的官方文档链接: Python turtle.这里面有turtle的各类指令.turtle ...
- 用python计算绩点的代码_【Python】计算GPA
最近开始我的研究生生涯了,周围都在谈论GPA这种高深的东西,像我这种工科学校背景的孩子一向是个喜欢在键盘上耕耘的人,对考高分没有多大兴趣(其实是没有那个本事).不过我也想知道我自己本科的GPA是多少来 ...
- python定时开关机的代码_用python写一个windows下的定时关机脚本(推荐)
由于本人经常使用笔记本共享WiFi,但是又不想笔记本开机一夜(为了低碳环保嘛 ~_~!),所以每次都要用使用DOS命令关机,感觉好麻烦.正好最近在学习Python,于是决定用python写一个定时关机 ...
- python怎么返回上一行代码_一行Python代码能做出哪些神器的事情
原标题:一行Python代码能做出哪些神器的事情 (1)一行代码启动一个Web服务 python -m SimpleHTTPServer 8080 # python2 python3 -m http. ...
- python实现rsa加密解密代码_使用python实现rsa算法代码
RSA算法是一种非对称加密算法,是现在广泛使用的公钥加密算法,主要应用是加密信息和数字签名. 维基百科给出的RSA算法简介如下: 假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息.她可以 ...
- python贪吃蛇最简单代码_利用python实现简易版的贪吃蛇游戏(面向python小白)
引言 作为python 小白,总是觉得自己要做好百分之二百的准备,才能开始写程序.以至于常常整天在那看各种语法教程,学了几个月还是只会print('hello world'). 这样做效率太低,正确的 ...
- python连接sqlite数据库的代码_【Python 连接SQLite数据库文件】
涉及: Python连接db文件 如何按照列名获取数据 如何传入参数 示例代码如下: # encoding=utf-8 import sqlite3 def get_signal_names(db_f ...
最新文章
- WSAD5技巧之一:访问Oracle9i数据源
- ecshop 首页添加某个分类下面的商品
- Android游戏开发笔记(一)
- zip、gz压缩文件查看命令zless、less
- Linux——vim程序编辑器
- c语言选择排序_冒泡、插入、选择排序(C语言)
- 数组指针 和 指针数组
- java 内部类 单例_确保对象的唯一性——单例模式 (四):一种更好的单例实现方法(静态内部类)...
- LayaAir Sprite 旋转缩放
- 微信接口第三方php原理,微信第三方登录原理
- Value of type java.lang.String cannot be conver...
- github官网访问太慢
- Photoshop简单几步打造酷火焰字特…
- 中专初级计算机专业学什么知识,中专计算机主要学什么内容
- 致远oa读取服务器信息失败,致远OA A8V5常见问题集
- python自学做题记录之大写人民币
- win10任务栏图标显示异常(重启资源管理器无果)解决方法
- 【CODEVS 3287】【NOIP2013】火车运输
- Linux中的文件IO以及JDK中的NIO模型简介
- java网络学习之 jca体系概述(12)
热门文章
- 微星MAG B650M mortar wifi主板设置温度墙
- C语言视频教程免费分享,0基础学C语言
- QT 5.7虚拟键盘(支持中文输入)Windows+Ubuntu
- linux内核声卡管理,浅析linux 2.6.30.4内核中uda134x声卡驱动源码 - audio和bluetooth
- 【树莓派】树莓派使用python、E16 GPRS模块向MQTT服务器传输数据
- 一个可能的visual studio 的 cl.exe可能的地址
- OpenCV-python 用鼠标在图片上标记位置并返回坐标
- 开放式办公环境真是个糟糕的做法
- html5按键声音,HTML5+Tone.js 声音合成按钮
- 社会排斥范式:通过Cyberball游戏来探索其中的机制