绩点是什么怎么算?

有人讨论一下大学绩点怎么算吗?
8回复 472浏览
不知虎扑各位大神知不知道大学绩点怎么算& 今天成绩出来了 然后是不是应该有一个总的绩点啊?9科绩点加起来取平均是不是总绩点??求大神随便几张福利吧
我们学校是有条固定公式,辅导员会说的,你可以问问
(科目1*该科目学分+科目2*该科目学分+。。。+科目n*该科目学分)/总学分
我们是这么算。
我们学校还有哥们儿专门做了个绩点计算器,输入学号什么的就能查,还会建议你哪些重修发自手机虎扑
加权平均数吧
60分1.070分2.0
加权的这么简单理解不了?
试试坚持的力量、
绩点是ls那样,还有个学分绩点总和是绩点乘以该科学分
G点的话~~ 呃
大学的 那个~~
老板永远是SB
您需要登录后才可以回复,请
& 允许多选
25人参加识货团购548.00元34人参加识货团购228.00元188人参加识货团购1048.00元261人参加识货团购99.00元58人参加识货团购169.00元131人参加识货团购199.00元35人参加识货团购239.00元273人参加识货团购529.00元190人参加识货团购328.00元139人参加识货团购608.00元281人参加识货团购289.00元187人参加识货团购949.00元您好,欢迎光临崔庆才的博客,欢迎来稿,质量优秀我会主动与您联系并升级为专栏作者,让您的文章被更多人看到,谢谢。
> Python爬虫实战七之计算大学本学期绩点
大家好,本次为大家带来的项目是计算大学本学期绩点。首先说明的是,博主来自山东大学,有属于个人的学生成绩管理系统,需要学号密码才可以登录,不过可能广大读者没有这个学号密码,不能实际进行操作,所以最主要的还是获取它的原理。最主要的是了解cookie的相关操作。
1.模拟登录学生成绩管理系统
2.抓取本学期成绩界面
3.计算打印本学期成绩
1.URL的获取
恩,博主来自山东大学~
先贴一个URL,让大家知道我们学校学生信息系统的网站构架,主页是 ,山东大学学生个人信息系统,进去之后,Oh不,他竟然用了frame,一个多么古老的而又任性的写法,真是惊出一身冷汗~
算了,就算他是frame又能拿我怎么样?我们点到登录界面,审查一下元素,先看看登录界面的URL是怎样的?
恩,看到了右侧的frame名称,src=”xk_login.html”,可以分析出完整的登录界面的网址为 ,点进去看看,真是棒棒哒,他喵的竟然是清华大学选课系统,醉了,你说你抄袭就抄袭吧,改改名字也不错啊~
算了,就不和他计较了。现在,我们登录一下,用浏览器***网络。
我用的是猎豹浏览器,审查元素时会有一个网络的选项,如果大家用的Chrome,也有相对应的功能,Firefox需要装插件HttpFox,同样可以实现。
这个网络***功能可以***表单的传送以及请求头,响应头等等的信息。截个图看一下,恩,我偷偷把密码隐藏了,你看不到~
大家看到的是登录之后出现的信息以及NetWork***,显示了hearders的详细信息。
最主要的内容,我们可以发现有一个表单提交的过程,提交方式为POST,两个参数分别为stuid和pwd。
请求的URL为 ,没错,找到表单数据和目标地址就是这么简单。
在这里注意,刚才的
只是登录界面的地址,刚刚得到的这个地址才是登录索要提交到的真正的URL。希望大家这里不要混淆。
不知道山大这个系统有没有做headers的检查,我们先不管这么多,先尝试一下模拟登录并保存Cookie。
2.模拟登录
好,通过以上信息,我们已经找到了登录的目标地址为
有一个表单提交到这个URL,表单的两个内容分别为stuid和pwd,学号和密码,没有其他的隐藏信息,提交方式为POST。
好,现在我们首先构造以下代码来完成登录。看看会不会获取到登录之后的提示页面。
__author__ = 'CQC'
# -*- coding:utf-8 -*-
import urllib
import urllib2
import cookielib
#山东大学绩点运算
class SDU:
def __init__(self):
self.loginUrl = 'http://jwxt.:7890/pls/wwwbks/bks_login2.login'
self.cookies = cookielib.CookieJar()
self.postdata = urllib.urlencode({
'stuid':'',
'pwd':'xxxxxx'
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookies))
def getPage(self):
= urllib2.Request(
url = self.loginUrl,
data = self.postdata)
result = self.opener.open(request)
#打印登录内容
print result.read().decode('gbk')
sdu = SDU()
sdu.getPage()
&td bgcolor="#EAE2F3"&&p align="center"&&/p&&/td&
&td bgcolor="#EAE2F3"&&p align="center"&面向对象技术&/p&&/td&
&td bgcolor="#EAE2F3"&&p align="center"&1&/p&&/td&
&td bgcolor="#EAE2F3"&&p align="center"&2.5&/p&&/td&
&td bgcolor="#EAE2F3"&&p align="center"&&/p&&/td&
&td bgcolor="#EAE2F3"&&p align="center"&94&/p&&/td&
&td bgcolor="#EAE2F3"&&p align="center"&必修&/p&&/td&
我们用下面的正则表达式进行提取即可,部分代码如下
page = self.getPage()
myItems = re.findall('&TR&.*?&p.*?&p.*?&p.*?&p.*?&p.*?&(.*?)&/p&.*?&p.*?&p.*?&(.*?)&/p&.*?&/TR&',page,re.S)
for item in myItems:
self.credit.append(item[0].encode('gbk'))
self.grades.append(item[1].encode('gbk'))
sdu = SDU()
sdu.getGrades()
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
# -*- coding: utf-8 -*-&&&import urllibimport urllib2import cookielibimport reimport string&#绩点运算class SDU:&& && #类的初始化&& def __init__(self):&&&&&&#登录URL&&&&&&self.loginUrl = 'http://jwxt.:7890/pls/wwwbks/bks_login2.login'&&&&&&#成绩URL&&&&&&self.gradeUrl = 'http://jwxt.:7890/pls/wwwbks/bkscjcx.curscopre'&&&&&&#CookieJar对象&&&&&&self.cookies = cookielib.CookieJar()&&&&&&#表单数据&&&&&&self.postdata = urllib.urlencode({&&&&&&&&&&&&'stuid':'',&&&&&&&&&&&&'pwd':'xxxxx'&&&&&&&& })&&&&&&#构建opener&&&&&&self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookies))&&&&&&#学分list&&&&&&self.credit = []&&&&&&#成绩list&&&&&&self.grades = []&&&&&&&& def getPage(self):&&&&&&req&&= urllib2.Request(&&&&&&&&&&&&url = self.loginUrl,&&&&&&&&&&&&data = self.postdata)&&&&&&result = self.opener.open(req)&&&&&&result = self.opener.open(self.gradeUrl)&&&&&&#返回本学期成绩页面&&&&&&return result.read().decode('gbk')&& && def getGrades(self):&&&&&&#获得本学期成绩页面&&&&&&page = self.getPage()&&&&&&#正则匹配&&&&&&myItems = re.findall('&TR&.*?&p.*?&p.*?&p.*?&p.*?&p.*?&(.*?)&/p&.*?&p.*?&p.*?&(.*?)&/p&.*?&/TR&',page,re.S) &&&&&&for item in myItems:&&&&&&&& self.credit.append(item[0].encode('gbk'))&&&&&&&& self.grades.append(item[1].encode('gbk'))&&&&&&self.getGrade()&&&&&&&& def getGrade(self):&&&&&&#计算总绩点&&&&&&sum = 0.0&&&&&&weight = 0.0&&&&&&for i in range(len(self.credit)):&&&&&&&& if(self.grades[i].isdigit()):&&&&&&&&&&&&sum += string.atof(self.credit[i])*string.atof(self.grades[i])&&&&&&&&&&&&weight += string.atof(self.credit[i])&&&&&&&&&&&&print u"本学期绩点为:",sum/weight&&&&&&sdu = SDU()sdu.getGrades()
好,最后就会打印输出本学期绩点是多少,小伙伴们最主要的了解上面的编程思路就好。
最主要的内容就是Cookie的使用,模拟登录的功能。
本文思路参考来源:
希望小伙伴们加油,加深一下理解。
转载请注明: &
or分享 (0)
您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击下面的最近看了CSDN上一个专栏《》,其中最后一篇作者写了个例子,用爬虫计算山东大学绩点,顿时想到前一阵子搞测评的时候还得拿计算器一点点算自己的平均学分绩,也想写一个自己学校的计算学分绩的爬虫。(吐槽:这么简单的功能学校网站居然不实现以下!)
具体过程专栏作者写得很清楚,详见&。作者使用了Firefox的HTTPFox插件来进行POST和GET消息分析,并通过查看源代码来查找到模拟登陆和查询成绩时的URL(其实这里使用Firefox的FireBug插件更简单)。使用这两个插件使我这个对网站编程一窍不通的人都能搞出个模拟登陆来。
根据那篇博文,整个过程分为以下几步:
打开教务系统网站,查看登陆时发送了哪些信息,分析POST和GET信息,并在模拟登陆时使用;
进入网站后,查看如何与网站交互,同步骤一,分析这些信息,在模拟查询时使用;
使用爬虫模拟登陆和查询,得到成绩页面的html代码;
使用正则表达式提取得到的html代码中的所有成绩信息;
通过提取到的成绩信息计算平均学分绩。
具体操作细节可以参考上面那篇博文。此处不再赘述。
这里写一下我遇到的问题。上述博文中,作者登陆成绩查询系统后,直接找到成绩查询页面的URL就可以得到成绩页面的html代码,而在我们学校的教务系统中我却怎么也找不到该URL。经过N多次实验发现,我们学校查询的时候也会发送一个特定格式的POST信息,然后才会返回成绩页面,也就是说得再次模拟发送一次浏览成绩信息。感觉是由于自己对网站相关知识不了解,认为只要模仿就能取得结果,殊不知这里查询方式的不同,浪费了不少时间。
得到网页信息后,就需要写正则表达式来提取成绩信息。关于Python的正则表达式详见:。对于正则表达式不熟的人推荐一个在线测试的网站: ,这个网站可以测试写的正则表达式能不能正确匹配要提取的信息。
附上源代码:
1 # -*- coding: utf-8 -*-
2 # author: Kill Console
3 # 功能:计算西工大研究生本学期成绩学分绩
5 import urllib
6 import urllib2
7 import cookielib
8 import re
10 REQUIRED = '&font color=red &\xe5\xad\xa6\xe4\xbd\x8d\xe5\xbf\x85\xe4\xbf\xae\xe8\xaf\xbe&/font&'
11 ELECTIVE = '\xe5\xad\xa6\xe4\xbd\x8d\xe9\x80\x89\xe4\xbf\xae\xe8\xaf\xbe'
13 class NPUSpider:
def __init__(self, stuid, pwd):
self.login_url = 'http://222.24.211.70/grsadmin/servlet/studentLogin'
self.query_url = 'http://222.24.211.70/grsadmin/servlet/studentMain'
# 成绩查询url
self.cookie_jar = cookielib.CookieJar()
# 初始化一个CookieJar来处理Cookie的信息
self.post_data_login = urllib.urlencode({'TYPE':'AUTH', 'glhj':'', 'USER':stuid, 'PASSWORD':pwd})
# POST登录数据
self.post_data_query = urllib.urlencode({'MAIN_TYPE':'3', 'MAIN_SUB_ACTION':'浏览成绩', 'MAIN_NEXT_ACTION':'LL', 'MAIN_PURPOSE':'/jsp/student_JhBrow.jsp'})
# POST查询数据
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie_jar))
self.course_data = []
# 存储一门课的信息,包括课程号、课程名、学分、成绩等
self.weights = []
# 存储学分
self.scores = []
# 存储成绩
self.GPA = 0.0
def init_spider(self):
req_login = urllib2.Request(url = self.login_url, data = self.post_data_login)
# 自定义一个登录请求
result_login = self.opener.open(req_login)
# 访问登录页面
req_query = urllib2.Request(url = self.query_url, data = self.post_data_query)
# 自定义一个查询请求
result_query = self.opener.open(req_query)
# 访问成绩页面
self.process_data(result_query.read().decode('gbk').encode('utf-8'))
# 由于存在中文,先解码再编码
self.calculate_GPA()
def process_data(self, res_page):
self.course_data = re.findall(r'&TR&\s+&TD width=60 class=style2&&div.*?&(.*?)&/div&.*?&div.*?&(.*?)&/div&.*?&div.*?&\s+(.*?)\s+&/div&.*?&div.*?&(.*?)&/div&.*?&div.*?&(.*?)&/div&.*?&div.*?&(.*?)&/div&.*?&div.*?&(.*?)&/div&.*?&/TR&', res_page, re.S)
for item in self.course_data:
self.weights.append(item[4])
self.scores.append(item[5])
def calculate_GPA(self):
sum_score = 0.0
sum_weight = 0.0
for i in range(len(self.course_data)):
if self.course_data[i][2] == REQUIRED and self.scores[i].isdigit():
# 判断该科目是否是必修且是否有分数,若是则进行计算
sum_score += float(self.weights[i]) * float(self.scores[i])
sum_weight += float(self.weights[i])
self.GPA = sum_score / sum_weight
def print_GPA(self):
print u'课程代码\t\t类型\t\t学期\t\t学分\t\t成绩\t\t得分日期\t\t课程名称'
print '-'*120
for item in self.course_data:
if item[2] == REQUIRED:
rqd = '\xe5\xad\xa6\xe4\xbd\x8d\xe5\xbf\x85\xe4\xbf\xae\xe8\xaf\xbe'
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])
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])
print 'The GPA is %.4f' % self.GPA
62 def main():
stuid = raw_input('student ID: ').strip()
pwd = raw_input('pass word: ').strip()
spider = NPUSpider(stuid, pwd)
spider.init_spider()
spider.print_GPA()
70 if __name__ == '__main__':
以下是一个西工大本科生学分绩计算脚本,由于测试时没有进行教学评估的查询不了,只能查询本学期成绩,所以计算的是本学期成绩学分绩(只计算必修):
1 # -*- coding: utf-8 -*-
2 # author: Kill Console
3 # 功能:计算西工大本科生本学期成绩学分绩
5 import urllib
6 import urllib2
7 import cookielib
8 import re
10 REQUIRED = '\xe5\xbf\x85\xe4\xbf\xae'
11 ELECTIVE = '\xe4\xbb\xbb\xe9\x80\x89'
13 class NPUSpider:
def __init__(self, stuid, pwd):
self.login_url = 'http://jw./loginAction.do'
self.result_url = 'http://jw./bxqcjcxAction.do'
# 本学期成绩查询url
self.cookie_jar = cookielib.CookieJar()
# 初始化一个CookieJar来处理Cookie的信息
self.post_data = urllib.urlencode({'zjh':stuid, 'mm':pwd})
# POST的数据
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie_jar))
self.course_data = []
# 存储一门课的信息,包括课程号、课程名、学分、成绩等
self.weights = []
# 存储学分
self.scores = []
# 存储成绩
self.GPA = 0.0
def init_spider(self):
req = urllib2.Request(url = self.login_url, data = self.post_data)
# 自定义一个请求
result = self.opener.open(req)
# 访问登录页面
result = self.opener.open(self.result_url)
# 访问成绩页面
self.process_data(result.read().decode('gbk').encode('utf-8'))
self.calculate_GPA()
def process_data(self, res_page):
self.course_data = re.findall(r'&tr class=.*?&td.*?&\s+(.*?)\s+&/td&.*?&td.*?&\s+(.*?)\s+&/td&.*?&td.*?&\s+(.*?)\s+&/td&.*?&td.*?&\s+(.*?)\s+&/td&.*?&td.*?&\s+(.*?)\s+&/td&.*?&td.*?&\s+(.*?)\s+&/td&.*?&td.*?&\s+(.*?)\s+&/td&.*?&/tr&', res_page, re.S)
for item in self.course_data:
self.weights.append(item[4])
self.scores.append(item[6])
def calculate_GPA(self):
sum_score = 0.0
sum_weight = 0.0
for i in range(len(self.course_data)):
if self.course_data[i][5] == REQUIRED and self.scores[i].isdigit():
sum_score += float(self.weights[i]) * float(self.scores[i])
sum_weight += float(self.weights[i])
self.GPA = sum_score / sum_weight
def print_GPA(self):
print 'The GPA is %.4f' % self.GPA
50 def main():
stuid = raw_input('student ID: ').strip()
pwd = raw_input('pass word: ').strip()
spider = NPUSpider(stuid, pwd)
spider.init_spider()
spider.print_GPA()
58 if __name__ == '__main__':
阅读(...) 评论()

参考资料

 

随机推荐