利用python进行哈工程教务系统中的绩点计算
来源:互联网 发布:excel07建立数据透视表 编辑:程序博客网 时间:2024/06/10 08:55
作为学生党,计算每个学期的平均成绩是头等大事,但是多数教务系统并没有提供这项功能,东学西读网站虽然有一个在线的GPA计算器,但是最近也不能登录哈工程的教务获取成绩了,所以我就借助刚刚学习了一点的简单的爬虫,来完成这项任务。
首先,分析哈工程教务处成绩查询页面,与大多数教务系统页面相同,都是通过POST提交账号、密码等信息,不过哈工程有验证码,我们现在暂时不集成自动识别验证码的功能,于是整体思路就是认证cookie,然后获取验证码图片并显示,手工输入学号、密码、验证码,最后下载页面并分析html。
验证码的显示我利用了PIL库,需要额外进行下载安装,其余的库应该都是python自带的,使用了最原始的正则进行匹配,尤其是在匹配成绩时,由于成绩是一个表格,所以匹配略显复杂,主要思路就是先匹配出成绩表格的全部,然后逐行匹配,拿到所有成绩信息,最重要的信息无非就是学分和成绩了,这两个信息都出现在固定的位置,因此不难获得,另外学校存在考查课,考查课的成绩对应关系也已经集成在了一个字典当中,方便调用。
哈工程的教务成绩是按照学期计算的,在URL上没有显示,而是利用POST的方式做请求返回数据,因此当我们需要选择不同的学期时,还需要POST一个对应的学期代码,这个代码我已经集成在了一个字典的数据结构中。
代码如下:
#encoding=utf-8import urllib2,cookielib,urllibimport cStringIO,stringimport reimport Imageclass Tool: #去除img标签,7位长空格 removeImg = re.compile('<img.*?>| {7}| ') #删除超链接标签 removeAddr = re.compile('<a.*?>|</a>') #把换行的标签换为\n replaceLine = re.compile('<tr>|<div>|</div>|</p>') #将表格制表<td>替换为\t replaceTD= re.compile('<td>') #把段落开头换为\n加空两格 replacePara = re.compile('<p.*?>') #将换行符或双换行符替换为\n replaceBR = re.compile('<br><br>|<br>') #将其余标签剔除 removeExtraTag = re.compile('<.*?>') def replace(self,x): x = re.sub(self.removeImg,"",x) x = re.sub(self.removeAddr,"",x) x = re.sub(self.replaceLine,"\n",x) x = re.sub(self.replaceTD,"\t",x) x = re.sub(self.replacePara,"\n ",x) x = re.sub(self.replaceBR,"\n",x) x = re.sub(self.removeExtraTag,"",x) #strip()将前后多余内容删除 return x.strip()class HEU_Score(object): def __init__(self,baseURL): self.baseURL = baseURL self.cookie = cookielib.CookieJar() self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie)) self.opener.addheaders.append(('User-Agent','Mozilla/5.0 (Windows NT 5.1; rv:25.0) Gecko/20100101 Firefox/25.0')) self.tool = Tool() # 字符串处理工具 self.scoreDict = {u'优秀':95,u'良好':85,u'中等':75,u'及格':65} # 考查课成绩换算字典 # 学期对应POST代码 self.semster = {'09-10-1':1,'09-10-2':2,'10-11-1':3,'10-11-2':4,'11-12-1':5,'11-12-2':6,'12-13-1':7,'12-13-2':8, '13-14-1':9,'13-14-2':10,'14-15-1':11,'14-15-2':12,'15-16-1':13,'15-16-2':21} def register(self,URL): self.opener.open(URL) imgsrc = "http://jw.hrbeu.edu.cn/ACTIONVALIDATERANDOMPICTURE.APPPROCESS" # 验证码URL userid = raw_input("学号:") pwd = raw_input("密码:") # 显示验证码图片并人工输入 res = self.opener.open(urllib2.Request(imgsrc)) tempIm = cStringIO.StringIO(res.read()) im = Image.open(tempIm) im.show() agnomen = raw_input("验证码:") #构建要POST的数据 postdata = urllib.urlencode({ 'WebUserNO': userid, 'Password': pwd, 'Agnomen': agnomen, 'submit.x': '20', 'submit.y': '11', 'applicant':'ACTIONQUERYSTUDENTSCORE', }) req = urllib2.Request(url = self.baseURL,data = postdata) try: response = self.opener.open(req) return response.url except urllib2.URLError,e: if hasattr(e,'reason'): print e.reason def getScore(self,semsterCode): scoreurl = self.register(self.baseURL) postdata = urllib.urlencode({'YearTermNO':self.semster[semsterCode]}) req = urllib2.Request(scoreurl,postdata) try: response = self.opener.open(req) #在整个页面中匹配成绩表格 html = response.read().decode("gbk") pattern = re.compile('<table width="100%" border="1" bordercolor="#666666" style="BORDER-COLLAPSE:collapse" cellspacing="0" class=tableborder>(.*?)<\/table>',re.S) course = re.findall(pattern,html) table = course[0] # 在成绩表格内匹配所有的项目,同时计算平均成绩 p2 = re.compile('<tr class="color-row">(.*?)</tr>',re.S) row = re.findall(p2,table) scoreInfo = [] sumScore = 0.0 creditNum = 0.0 print len(row) for item in row: singleInfo = [] p3 = re.compile('<td nowrap>(.*?)</td>',re.S) singleInfo.append(self.tool.replace(re.findall(p3,item)[0])) print self.tool.replace(re.findall(p3,item)[0]) p4 = re.compile('<td align="center" nowrap>(.*?)</td>',re.S) infos = re.findall(p4,item) # print infos[3] # print infos[5] for info in infos: print info singleInfo.append(info) #记录条目信息 # 计算平均成绩 if infos[1] == u'考查': sumScore += float(infos[3])*self.scoreDict[infos[5]] else: sumScore += float(infos[5])*float(infos[3]) creditNum += float(infos[3]) scoreInfo.append(singleInfo) print sumScore/creditNum print scoreInfo return scoreInfo,sumScore/creditNum except urllib2.URLError,e: if hasattr(e,'reason'): print e.reasonurl = "http://jw.hrbeu.edu.cn/ACTIONLOGON.APPPROCESS"myscore = HEU_Score(url)#myscore.register()myscore.getScore('14-15-2')
0 0
- 利用python进行哈工程教务系统中的绩点计算
- 【Java爬虫】爬取南通大学教务系统成绩计算绩点
- 利用python爬取教务系统中成绩
- 利用Python requests库模拟登陆学校教务系统
- python爬虫正方教务系统
- python爬虫正方教务系统
- 使用Python进行科学和工程计算
- 《利用python进行数据计算》第六章
- [Python]北京交通大学研究生教务系统爬虫
- Python 模拟登陆教务选课系统
- python 爬虫登陆学校教务系统
- Python爬取川农大教务系统获取课表
- 哈工大(深圳)教务系统Python爬虫1.2
- 哈工大(深圳)教务系统Python爬虫1.3
- Python学习第十日:教务管理系统
- 使用Python访问方正教务系统框架
- 使用python开发的教务管理系统
- 【利用Python进行数据分析——经验篇2】计算微博转发/评论/点赞h指数的Python代码
- 段式管理的几个相关寄存器
- String MVC (王成委)
- 深入理解Spring4框架(三)——Bean
- 二叉树相关题
- git和svn的区别
- 利用python进行哈工程教务系统中的绩点计算
- 两张图看懂GDT、GDTR、LDT、LDTR的关系
- LeetCode-144:Binary Tree Preorder Traversal
- java 运算符学习笔记 面试题
- Activity 启动模式及任务栈管理
- 写给刚选择软件工程的你
- 算法——洗洗脑子吧
- Java源码-简单手绘程序
- python核心编程第九章练习