最近看了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计算研究生学分绩(绩点)相关推荐

  1. 用python计算绩点的代码_重庆大学GPA计算python程序

    GPA计算方法来源于百度文库的方法,<重庆大学学分绩点计算办法(试行)> 运行环境:python 3.x 脚本源码: # 用于重庆大学GPA计算 # author: DYBOY input ...

  2. python发邮件给女朋友代码_用python讨好女朋友是什么个操作?

    原标题:用python讨好女朋友是什么个操作? 文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 转自 |数据团学社(微信搜索metrodata_xue ...

  3. 用python函数画德国国旗代码_用Python的turtle模块画国旗

    最近在学Python,发现Python的海龟绘图非常有趣,就分享一下!话不多说,先来Python turtle的官方文档链接: Python turtle.这里面有turtle的各类指令.turtle ...

  4. 用python计算绩点的代码_【Python】计算GPA

    最近开始我的研究生生涯了,周围都在谈论GPA这种高深的东西,像我这种工科学校背景的孩子一向是个喜欢在键盘上耕耘的人,对考高分没有多大兴趣(其实是没有那个本事).不过我也想知道我自己本科的GPA是多少来 ...

  5. python定时开关机的代码_用python写一个windows下的定时关机脚本(推荐)

    由于本人经常使用笔记本共享WiFi,但是又不想笔记本开机一夜(为了低碳环保嘛 ~_~!),所以每次都要用使用DOS命令关机,感觉好麻烦.正好最近在学习Python,于是决定用python写一个定时关机 ...

  6. python怎么返回上一行代码_一行Python代码能做出哪些神器的事情

    原标题:一行Python代码能做出哪些神器的事情 (1)一行代码启动一个Web服务 python -m SimpleHTTPServer 8080 # python2 python3 -m http. ...

  7. python实现rsa加密解密代码_使用python实现rsa算法代码

    RSA算法是一种非对称加密算法,是现在广泛使用的公钥加密算法,主要应用是加密信息和数字签名. 维基百科给出的RSA算法简介如下: 假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息.她可以 ...

  8. python贪吃蛇最简单代码_利用python实现简易版的贪吃蛇游戏(面向python小白)

    引言 作为python 小白,总是觉得自己要做好百分之二百的准备,才能开始写程序.以至于常常整天在那看各种语法教程,学了几个月还是只会print('hello world'). 这样做效率太低,正确的 ...

  9. python连接sqlite数据库的代码_【Python 连接SQLite数据库文件】

    涉及: Python连接db文件 如何按照列名获取数据 如何传入参数 示例代码如下: # encoding=utf-8 import sqlite3 def get_signal_names(db_f ...

最新文章

  1. WSAD5技巧之一:访问Oracle9i数据源
  2. ecshop 首页添加某个分类下面的商品
  3. Android游戏开发笔记(一)
  4. zip、gz压缩文件查看命令zless、less
  5. Linux——vim程序编辑器
  6. c语言选择排序_冒泡、插入、选择排序(C语言)
  7. 数组指针 和 指针数组
  8. java 内部类 单例_确保对象的唯一性——单例模式 (四):一种更好的单例实现方法(静态内部类)...
  9. LayaAir Sprite 旋转缩放
  10. 微信接口第三方php原理,微信第三方登录原理
  11. Value of type java.lang.String cannot be conver...
  12. github官网访问太慢
  13. Photoshop简单几步打造酷火焰字特…
  14. 中专初级计算机专业学什么知识,中专计算机主要学什么内容
  15. 致远oa读取服务器信息失败,致远OA A8V5常见问题集
  16. python自学做题记录之大写人民币
  17. win10任务栏图标显示异常(重启资源管理器无果)解决方法
  18. 【CODEVS 3287】【NOIP2013】火车运输
  19. Linux中的文件IO以及JDK中的NIO模型简介
  20. java网络学习之 jca体系概述(12)

热门文章

  1. 微星MAG B650M mortar wifi主板设置温度墙
  2. C语言视频教程免费分享,0基础学C语言
  3. QT 5.7虚拟键盘(支持中文输入)Windows+Ubuntu
  4. linux内核声卡管理,浅析linux 2.6.30.4内核中uda134x声卡驱动源码 - audio和bluetooth
  5. 【树莓派】树莓派使用python、E16 GPRS模块向MQTT服务器传输数据
  6. 一个可能的visual studio 的 cl.exe可能的地址
  7. OpenCV-python 用鼠标在图片上标记位置并返回坐标
  8. 开放式办公环境真是个糟糕的做法
  9. html5按键声音,HTML5+Tone.js 声音合成按钮
  10. 社会排斥范式:通过Cyberball游戏来探索其中的机制