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中级玩家:爬虫-广东财经大学成绩查询小工具的主要内容,如果未能解决你的问题,请参考以下文章

深圳市中级人民法院判决:利用网络爬虫技术抓取他人数据构成不正当竞争

人工智能如何打造智慧城市大脑

第十六届全国大学生智能车竞赛线上比赛(广东+西南科技大学)成绩排名与获奖信息

运维学python之爬虫中级篇MongoDB

广东海洋大学 电子1151 孔yanfei python语言程序设计 第一周

运维学python之爬虫中级篇Sqlite3