Python3中级玩家:爬虫-广东财经大学成绩查询小工具
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3中级玩家:爬虫-广东财经大学成绩查询小工具相关的知识,希望对你有一定的参考价值。
2016.6.28软件重新迁移到 http://yun.baidu.com/s/1pL2BAfL#path=%252F 源码Github:https://github.com/hunterhug/gdufesearch
代码讲解待写。。。
# GDUFE绩点/考试查询工具
一个广东财经大学查询成绩/考试信息的自助系统。
支持导出Excel和计算绩点。
# How to use
1.运行run.bat即可或者exe中后缀为exe的可执行文件
2.隐藏功能:在exe文件夹中jinhan.pyd每行写一个学号可以查别人的成绩
author:一只尼玛
contact:569929309
2015/10
代码如下:
# -*- coding:utf-8 -*- import json import base64 import xlsxwriter as wx import urllib.request import urllib.parse import urllib.request, urllib.parse, http.cookiejar import os import time gloalurl=‘http://kw.gdufe.edu.cn:8080/‘ indexurl=gloalurl+‘service.do?request=‘ def write(content,col,path=‘成绩生成表.xlsx‘): workbook = wx.Workbook(path) top = workbook.add_format({‘border‘:1,‘align‘:‘center‘,‘bg_color‘:‘white‘,‘font_size‘:11,‘font_name‘: ‘微软雅黑‘}) red = workbook.add_format({‘font_color‘:‘white‘,‘border‘:1,‘align‘:‘center‘,‘bg_color‘:‘800000‘,‘font_size‘:11,‘font_name‘: ‘微软雅黑‘,‘bold‘:True}) format=top format.set_align(‘vcenter‘) #设置单元格垂直对齐 worksheet = workbook.add_worksheet() #创建一个工作表对象 worksheet.set_column(0,col,15) #设定列的宽度为22像素 for i in range(0,len(content)): if i==0: format=red else: format=top for j in range(0,len(content[i])): worksheet.write(i,j,content[i][j],format) workbook.close() def gethtml(url): """ 伪装头部并得到网页内容 """ filename = ‘pyspider.pyd‘ if os.path.exists(filename): #声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件 cj = http.cookiejar.MozillaCookieJar(filename) #从文件中读取cookie内容到变量 cj.load(filename, ignore_discard=True, ignore_expires=True) else: open(filename,‘w‘).close() cj = http.cookiejar.MozillaCookieJar(filename) opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) opener.addheaders = [(‘User-Agent‘, ‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0‘), (‘Referer‘,‘http://kw.gdufe.edu.cn:8080/index.html‘)] urllib.request.install_opener(opener) html_bytes = urllib.request.urlopen(url).read() cj.save(ignore_discard=True, ignore_expires=True) return html_bytes # 登陆 def login(strLoginID, strPassword): user ={"className":"SendTend.DataService.JWGL.Login","methodName":"login(strLoginID,strPassword,iType)","returnType":"bool","enableCache":False,"parameters":{"strLoginID":strLoginID,"strPassword":strPassword,"iType":"0"}} usertojson = json.dumps(user,sort_keys=True) # 转json # print(‘ ‘*10,usertojson) usertobs=base64.encodebytes(usertojson.encode()) # json base64加密 bstouser=base64.decodebytes(usertobs) # print(‘ ‘*10,"发送密文:"+usertobs.decode()) # print(‘ ‘*10,"解密:"+bstouser.decode()) loginurl = indexurl+usertobs.decode().replace(‘\\n‘,‘‘) # print(‘ ‘*10,"构造地址:"+loginurl) info1file=getHtml(loginurl) info1=base64.decodebytes(info1file) xinfo1=json.loads(info1.decode()) print(‘ ‘*10,xinfo1[‘message‘]) if xinfo1[‘message‘]==‘登录成功。‘: studentinfo=xinfo1[‘data‘] return [studentinfo[‘strDepartment‘],studentinfo[‘strClass‘],studentinfo[‘strUserName‘]] else: os.remove(‘pyspider.pyd‘) return [] # 成绩查询 def score(strLoginID): cjcx={"className":"SendTend.DataService.JWGL.CJCX","methodName":"GetCJByXH(strXH)","returnType":"string","enableCache":False,"parameters":{"strXH":strLoginID}} cjcxtojson = json.dumps(cjcx,sort_keys=True) # 转json cjcxtobs=base64.encodebytes(cjcxtojson.encode()) # json base64加密 cjcxurl = indexurl+cjcxtobs.decode().replace(‘\\n‘,‘‘) # print(‘ ‘*10,cjcxurl) info1file=getHtml(cjcxurl) # print(‘ ‘*10,info1file) info1=base64.decodebytes(info1file) xinfo1=json.loads(info1.decode()) # print(‘ ‘*10,xinfo1[‘data‘]) return xinfo1[‘data‘] # 考试查询 def exam(times=‘‘,terms=‘‘,lei=‘‘): cjcx={"className":"SendTend.DataService.GSKW.PKGL.PKResult","methodName":"GetKaoShiList(strXN,strXQ,strKSLX)","returnType":"string","enableCache":False,"parameters":{"strXN":times,"strXQ":terms,"strKSLX":lei}} cjcxtojson = json.dumps(cjcx,sort_keys=True) # 转json cjcxtobs=base64.encodebytes(cjcxtojson.encode()) # json base64加密 cjcxurl = indexurl+cjcxtobs.decode().replace(‘\\n‘,‘‘) # print(‘ ‘*10,cjcxurl) info1file=getHtml(cjcxurl) # print(‘ ‘*10,info1file) info1=base64.decodebytes(info1file) xinfo1=json.loads(info1.decode()) # print(‘ ‘*10,xinfo1) return xinfo1[‘data‘] def step1(): strLoginID = input(‘ ‘*11+‘请输入学号:‘) strPassword = input(‘ ‘*11+‘请输入密码:‘) loginok = login(strLoginID,strPassword) # 登陆 # loginok=[‘信息学院‘, ‘2012计算机科学与技术(实验)1班‘, ‘陈锦瀚‘] date = time.strftime(‘%Y-%m-%d %H:%M:%S‘,time.localtime()) if loginok: print(‘ ‘*10,‘登录时间:‘,date) print(‘ ‘*10,‘您的状态:‘,‘|‘.join(loginok)) #print(strLoginID,loginok[2]) return strLoginID,loginok[2] else: return step1() def step2(strLoginID): """ [{ ‘XM‘: ‘陈‘,姓名 ‘BZ‘: None,备注 ‘QZCJ‘: ‘‘,期中成绩 ‘SYCJ‘: ‘‘,实验成绩 ‘XQ‘: 2,学期 ‘KCDM‘: ‘052092‘,课程代码 ‘JD‘: 3.5,绩点 ‘XN‘: ‘2014-2015‘,学年 ‘XH‘: ‘12251003102‘,学号 ‘BKCJ‘: ‘‘,补考成绩 ‘QMCJ‘: ‘61‘,期末成绩 ‘XF‘: ‘2.0‘,学分 ‘CXCJ‘: ‘‘,清考成绩 ‘CJ‘: ‘85‘,成绩 ‘KCXZ‘: ‘限选‘,课程性质 ‘KCMC‘: ‘金融学‘,课程名称 ‘PSCJ‘: ‘81‘,平时成绩 ‘XKKH‘: ‘(2014-2015-2)-052092-20021230-1‘选课课号""" content=score(strLoginID) scores=[] a=[‘学年‘,‘学期‘,‘课程名称‘,‘选课课号‘,‘课程性质‘,‘课程代码‘,‘期中成绩‘,‘实验成绩‘,‘平时成绩‘,‘期末成绩‘,‘成绩‘,‘补考成绩‘,‘清考成绩‘,‘学分‘,‘绩点‘,‘备注‘] jidian=[] #求绩点 格式为 学年 学期 学分 平均学分绩点 XN1=content[0][‘XN‘]#学期 XQ1=content[0][‘XQ‘]#学年 scores.append(a) bkcj=0 # 补考次数 txf=0 # 总学分 tjd=0 # 学期学分*绩点累加 for o in range(0,len(content)): course = content[o] XM=course[‘XM‘] # 姓名 XH=course[‘XH‘] # 学号 KCMC=course[‘KCMC‘] XKKH=course[‘XKKH‘] KCXZ=course[‘KCXZ‘] KCDM=course[‘KCDM‘] QZCJ=course[‘QZCJ‘] SYCJ=course[‘SYCJ‘] PSCJ=course[‘PSCJ‘] QMCJ=course[‘QMCJ‘] BKCJ=course[‘BKCJ‘] CJ=course[‘CJ‘] CXCJ=course[‘CXCJ‘] XN=course[‘XN‘]#学期 XQ=course[‘XQ‘]#学年 try: XF=float(course[‘XF‘]) JD=float(course[‘JD‘]) if XQ!=XQ1 or XN!=XN1: jidian.append([XN1,XQ1,txf,tjd/txf]) txf=0 tjd=0 XQ1=XQ XN1=XN txf=txf+XF tjd=tjd+XF*JD except: XF=course[‘XF‘] JD=course[‘JD‘] BZ=course[‘BZ‘] if BKCJ.replace(‘ ‘,‘‘): bkcj=bkcj+1 b=[XN,XQ,KCMC,XKKH,KCXZ,KCDM,QZCJ,SYCJ,PSCJ,QMCJ,CJ,BKCJ,CXCJ,XF,JD,BZ] scores.append(b) jidian.append([XN1,XQ1,txf,tjd/txf]) # 求每年绩点 years=[] for i in range(0,len(jidian)): years.append(jidian[i][0]) years=list(set(years)) jidian2=jidian[:] for j in years: ytf=0 #年度总学分 yjd=0# 年度绩点*学分 for jj in jidian: if jj[0]==j: ytf=ytf+jj[2] yjd=yjd+jj[2]*jj[3] jidian2.append([j,‘‘,ytf,yjd/ytf]) # print(‘ ‘*10,jidian2) return scores,bkcj,jidian2,XM # print(‘ ‘*10,scores) def step3(): content=exam() exams=[] a=[‘学年‘,‘学期‘,‘姓名‘,‘年级‘,‘学号‘,‘学院‘,‘专业‘,‘专业代码‘,‘班级‘,‘班级代码‘,‘课程名称‘,‘课程代号‘,‘开课学院‘,‘授课老师‘,‘考试校区‘,‘考试地点‘,‘教室座位数‘,‘考试人数‘,‘考试座位号‘,‘考试日期‘,‘开始时间‘,‘结束时间‘,‘备注‘] exams.append(a) for course in content: XY=course[‘XY‘] # 学院 KCDM=course[‘KCDM‘] # 课程代号 ZYMC=course[‘ZYMC‘] # 专业名称 RKLSMC=course[‘RKLSMC‘]# 授课老师 KSRQ=course[‘KSRQ‘]# 考试日期 KSMC=course[‘KSMC‘]# 考试地点 KSBH=course[‘KSBH‘]# s考试地点 KSLX=course[‘KSLX‘]# 考试类型 XN=course[‘XN‘]# 学年 BJMC=course[‘BJMC‘]# 班级 KCMC=course[‘KCMC‘]# 课程名称 XSBM=course[‘XSBM‘]# 学号 SSXQMC=course[‘SSXQMC‘]# 考试校区 KKXYMC=course[‘KKXYMC‘]# 开课学院 XQ=course[‘XQ‘]# 学期 KSSJ=course[‘KSSJ‘]# 开始时间 JSSJ=course[‘JSSJ‘]# 结束时间 XSMC=course[‘XSMC‘]# 学生姓名‘XSMC‘: ‘陈锦瀚‘ KSZWS=course[‘KSZWS‘]# 考试座位数‘KSZWS‘: 47, KSRS=course[‘KSRS‘]# 考试人数:‘KSRS‘: 43, XH=course[‘XH‘]# 学号: ‘XH‘: ‘12251003102‘, BJDM=course[‘BJDM‘]# 班级代码‘BJDM‘: ‘122511061‘, ZYDM=course[‘ZYDM‘]# 专业代码‘ZYDM‘: ‘1106‘, ZWH=course[‘ZWH‘]# 座位号:‘ZWH‘: 12, XKKH=course[‘XKKH‘]# 选课课号:‘XKKH‘: ‘(2012-2013-2)-121542-12078-9‘, SZNJ=course[‘SZNJ‘]# 年级 ‘SZNJ‘: 2012, b=[XN,XQ,XSMC,SZNJ,XH,XY,ZYMC,ZYDM,BJMC,BJDM,KCMC,KCDM,KKXYMC,RKLSMC,SSXQMC,KSMC,KSZWS,KSRS,ZWH,KSRQ,KSSJ,JSSJ,KSLX] exams.append(b) return exams def examhelp(content,times,terms,lei): returnexam=[] returnexam.append(content[0]) for i in range(1,len(content)): one=content[i] if one[0]==times and one[1]==terms and one[-1]==lei: returnexam.append(one) return returnexam def author(): sangjin = ‘‘‘ ----------------------------------------- | 一只尼玛: | | | | 似乎是程序员,可惜现在还不是 | | 来了广商后广商就改名财大GDUFE | | 每天写写程序,发发呆,看看书 | | | | C,JAVA,C++,LINUX,PYTHON,HTML | | CSS,JS,php,mysql,Servlet/jsp | | ThinkPHP,Hibernate,Spring,Git | | Maven,Nodejs... | | | | 记录了我的自学之路.... | | | | 虽然做过90天职业程序员 | | 可惜走后老板却没发工资(5~5~) | | | | 大三为学校做了网站(¥450) | | 唯一一次靠敲代码赚的~~~~ | | | | 索要源代码方式: | | Weibo:http://weibo.com/hunterhug | | Time :2015.12.19 18:26 Dor | ----------------------------------------- ‘‘‘ print(sangjin) def start(): sangjin = ‘‘‘ ----------------------------------------- | 欢迎使用 "广东财经大学" 自助查询系统 | | | |功能介绍: | | 1.查询成绩 | | 2.计算绩点 | | 3.查询考试信息 | | 包括考试地点,考试所在校区,任课老师 | | 考点座位数,考生人数,是否补考等 | | | |使用方法: | | 1.进入运行目录运行后缀为exe的文件 | | 2.根据提示操作,最终生成成绩和考试表 | | | |声明: | | 此小软件方便同学查询成绩,绝无窃取 | | 个人信息行为,不同于APP某表 | | | | 方便 快捷 Power by 一只尼玛 | ----------------------------------------- ‘‘‘ print(sangjin) def step4(jidian): s=‘‘ for k in reversed(range(0,len(jidian))): if jidian[k][1]!=‘‘: s=s+"{0}学年 第{1}学期 所修学分:{2} 平均学分绩点:{3:.3}\\n".format(jidian[k][0],jidian[k][1],jidian[k][2],jidian[k][3]) for k in reversed(range(0,len(jidian))): if jidian[k][1]==‘‘: s=s+"{0}学年 所修学分:{1} 平均学分绩点:{2:.3}\\n".format(jidian[k][0],jidian[k][2],jidian[k][3]) return s def hide(): file = open(‘jinhan.pyd‘,‘r‘) stus = file.read().split(‘\\n‘) file.close() for stuid in stus: try: scores,bkt,jidian,XM = step2(stuid) s=step4(jidian) scores.append([s]) open(‘../‘+stuid+XM+‘绩点.txt‘,‘w‘).write(s) write(scores,len(scores[0]),‘../‘+stuid+XM+str(len(scores)-2)+‘挂‘+str(bkt)+‘.xlsx‘) except: pass if __name__ == ‘__main__‘: start() try: strLoginID, name=step1() except: print(‘网络异常!!!‘) input(‘请关闭窗口‘) os.remove(‘pyspider.pyd‘) exit() try: hide() except: pass scores,bkt,jidian,XM = step2(strLoginID) # 提前查好成绩 examinfo = step3() # 提前查好考试 etype={‘1‘:‘考试‘,‘2‘:‘补考‘,‘3‘:‘清考‘} s=step4(jidian) scores.append([s]) try: open(‘../‘+strLoginID+XM+‘绩点.txt‘,‘w‘).write(s) write(scores,len(scores[0]),‘../‘+strLoginID+name+str(len(scores)-2)+‘挂‘+str(bkt)+‘.xlsx‘) write(examinfo,len(examinfo[0]),‘../‘+strLoginID+name+‘考试表.xlsx‘) except: print(‘ ‘*10,‘请把打开的文件关掉!!!‘) input(‘请关闭窗口‘) os.remove(‘pyspider.pyd‘) exit() while True: print(‘ ‘*10,‘-‘*40) choice=input(‘ ‘*11+‘选项:查看成绩(按1),查看考试(按2),结束(按3)‘) print(‘ ‘*10,‘-‘*40) if choice==‘1‘: try: for i in range(1,len(scores)-1): for j in range(0,len(scores[i])): if scores[i][j]!=‘ ‘ and scores[i][j]!=None: print(‘ ‘*10,scores[0][j]+‘:‘+str(scores[i][j])) print(‘ ‘*10,‘-‘*40) print(‘ ‘*10,‘请查看生成的Excel文件‘) except: print(‘ ‘*10,‘不知道发生什么错误!!!‘) finally: print(‘‘) print(‘ ‘*10,‘绩点如下:‘) print(‘‘) print(s) elif choice==‘2‘: while True: times=input(‘ ‘*11+‘请输入学年(格式:2014-2015)‘) terms=input(‘ ‘*11+‘请输入学期(格式:1 2)‘) lei=input(‘ ‘*11+‘请输入考试类型(考试:1,补考:2,清考:3)‘) print(‘ ‘*10,‘-‘*40) try: lei1=etype[lei] except: print(‘ ‘*10,‘请输入正确指令‘) print(‘ ‘*10,‘-‘*40) continue result=examhelp(examinfo,times,terms,lei1) if len(result)==1: print(‘ ‘*10,‘找不到考试信息‘) print(‘ ‘*10,‘-‘*40) continue for i in range(1,len(result)): for j in range(0,len(result[i])): if result[i][j]!=‘ ‘ and result[i][j]!=None: print(‘ ‘*10,result[0][j]+‘:‘+str(result[i][j])) print(‘ ‘*10,‘-‘*40) ends=input(‘ ‘*11+"返回上一级(按1),查看作者介绍(按2),继续查询(任意键)") print(‘ ‘*10,‘-‘*40) if ends==‘1‘: break elif ends==‘2‘: author() break else
以上是关于Python3中级玩家:爬虫-广东财经大学成绩查询小工具的主要内容,如果未能解决你的问题,请参考以下文章
深圳市中级人民法院判决:利用网络爬虫技术抓取他人数据构成不正当竞争
第十六届全国大学生智能车竞赛线上比赛(广东+西南科技大学)成绩排名与获奖信息