最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 怎么用Python查成绩

    正文概述    2020-09-05   228

    怎么用Python查成绩

    怎么用Python查成绩

    用Python查成绩可以使用requests库,模拟登录教务系统,然后通过正则查询成绩信息即可。

    设计思路:

    设计思路很简单,首先对已有的成绩进行处理,变为list集合,然后定时爬取教务系统查成绩的页面,对爬取的成绩也处理成list集合,如果newList的长度增加了,就找出增加的部分,并通过邮件通知我。

    推荐学习《Python教程》。

    脚本运行效果:

    怎么用Python查成绩

    发送邮件通知:

    怎么用Python查成绩

    代码如下:

    import datetime
    import time
    from email.header import Header
    import requests
    import re
    import smtplib
    from email.mime.text import MIMEText
    from bs4 import BeautifulSoup
    
    def listener():
        #在这里我通过模拟登陆的方式登陆
        #一般来说这里填写的是username跟password
        #但我们学校后台将用户名和密码进行了加密
        #通过观察浏览器的请求数据跟页面源码猜出学校后台的加密方式
        data={
            #出于学校安全考虑,这里就不给出加密方式了
            'encoded':'xxxxxxxxxxxxxxxxxxx'
        }
        session = requests.Session()
        session.post('http://jwc.sgu.edu.cn/jsxsd/xk/LoginToXk',data=data)
        #请求2019-2020-1学期的所有成绩
        r_data = {
            'kksj': '2019-2020-1',
            'kcxz': '',
            'kcmc': '',
            'xsfs': 'all'
        }
        r = session.post('http://jwc.sgu.edu.cn/jsxsd/kscj/cjcx_list', data=r_data)
        #对爬回来数据进行封装
        soup = BeautifulSoup(r.text, 'html.parser')
        #返回已有的成绩列表
        oldList = toList(soup)
        max = len(oldList)
        #这里用死循环定时爬取成绩页面分析是否分布新成绩
        while (True):
            #post跟get方式不能乱用,不然数据会出错
            r = session.post('http://jwc.sgu.edu.cn/jsxsd/kscj/cjcx_list',data=r_data)
            soup = BeautifulSoup(r.text, 'lxml')
            #print(soup.prettify())
            length = len(soup.find_all(string=re.compile('2019-2020-1')))-1
            print("course_length: ",length)
            if (r.status_code == 200 and length != 0):
                if (length > max):
                    #查询新出的成绩列表
                    newlist = toList(soup)
                    #获取两个列表不同之处,不同的就是新成绩
                    diflist = compareTwoList(oldList, newlist)
                    oldList=newlist
                    if diflist=='':
                        send("unkowned Error","unkowned Error")
                    else:
                        #有新成绩了,发送邮件通知我
                        send('you have new course sorce!!', diflist)
                    max = length
                print('last running time was:',datetime.datetime.now())
                #定时作用,500s查一次
                time.sleep(500)
            else:
                # 发送邮件断开连接了 print("had disconnected...")
                send("your server is disconnected!!!","your server is disconnected!!!")
                break
    
    def send(title,msg):
        mail_host = 'smtp.qq.com'
        # 你的qq邮箱名,没有.com
        mail_user = '你的qq邮箱名,没有.com'
        # 密码(部分邮箱为授权码)
        mail_pass = '授权码'
        # 邮件发送方邮箱地址
        sender = '发送方邮箱地址'
        # 邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
        receivers = ['yoletpig@qq.com']
    
        # 设置email信息
        # 邮件内容设置
        message = MIMEText(msg, 'plain', 'utf-8')
        # 邮件主题
        message['Subject'] = Header(title,'utf-8')
        # 发送方信息
        message['From'] = sender
        # 接受方信息
        message['To'] = receivers[0]
    
        # 登录并发送邮件
        try:
            # smtpObj = smtplib.SMTP()
            # # 连接到服务器
            # smtpObj.connect(mail_host, 25)
            smtpObj = smtplib.SMTP_SSL(mail_host)
            # 登录到服务器
            smtpObj.login(mail_user, mail_pass)
            # 发送
            smtpObj.sendmail(
                sender,receivers,message.as_string())
            # 退出
            smtpObj.quit()
            print('success')
        except smtplib.SMTPException as e:
            print('error', e)  # 打印错误
    
    def toList(soup):
        flag = True
        list = []
        strs = ''
        #对tr标签下的td进行遍历并取值
        for tr in soup.find_all('tr'):
            if flag:
                flag = False;
                continue
            i = 1
            for td in tr.stripped_strings:
                if (i == 1 or i == 2):
                    i += 1
                    continue
                strs += "_" + td
                i += 1
            list.append(strs)
            strs = ''
        return list
    
    def compareTwoList(oldList,newList):
        diflist=''
        for sub in newList:
            #判断是否唯一
            if(oldList.count(sub)==0):
                diflist = sub
                break
        return diflist
    
    if __name__ == '__main__':
        listener()

    起源地下载网 » 怎么用Python查成绩

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元