Python实现新版正方教务系统爬虫(二)

前言

哎对不起 我可能是silly boy 我想在学校里把去年的坑填了 但是发现新版的教务系统代码没传到git上 我现在就成了个对着空ide发呆的憨憨(代码在家里啦 所以填坑就再过会吧

那就稍微闲聊一下吧 打算填坑前逛了一下csdn上面有关新版正方教务系统的帖子 我去年留下的rsa加密的坑其实都被填掉了 也有用flask框架完善整个项目的
其实挺好的 写博客就是为了帮助更多的志同道合之人在这条路上进步 告诉你们我是怎么走到这里的 走了多少的坑
为中华崛起而奋斗~~

正文哈

国庆之后终于是想起来要把代码拷走这回事情,现在基本是填完了啦。
给刚学习爬虫的小白们做了封装 希望能够帮助你们理解

新版的方正教务系统唯一的难点也就是在登陆加密的地方了,这里感谢@qq_14926447 使用了他代码中的轮子 于是我也能快乐的跑起来啦~

实现的原理贴在上个教程里面了 就直接上干货吧

github项目链接:https://github.com/welsonsxc/NewZFScoreSpider

讲解一下

整个流程我封装成一个类了,方便后续api或者多线程调用
wechat_robot文件夹里是当时做测试公众号用的 学校方面没法申请下来经费就逐渐废弃了 如果你们学校可以的话 不妨研究一下 填填坑

哝 知道你们最喜欢这个了 再次感谢@qq_14926447

    # 加密密码
    def process_public(self):
        weibo_rsa_e = 65537
        message = str(self.password).encode()
        rsa_n = binascii.b2a_hex(binascii.a2b_base64(self.modules))
        key = rsa.PublicKey(int(rsa_n, 16), weibo_rsa_e)
        encropy_pwd = rsa.encrypt(message, key)
        self.password = binascii.b2a_base64(encropy_pwd)

我知道有人懒得点进github

# -*- coding: utf-8 -*-
import binascii
import requests
from bs4 import BeautifulSoup
import re
import time
import sys
import rsa


class Student:
    sessions = requests.Session()
    time = int(time.time())

    def __init__(self, name, password, login_url, key_url, grade_url):
        self.pub = None
        self.year = None
        self.term = None
        self.token = None
        self.header = None
        self.cookie = None
        self.modules = None
        self.request = None

        self.name = str(name).encode("utf8").decode("utf8")
        self.password = str(password).encode("utf8").decode("utf8")
        self.url = login_url
        self.KeyUrl = key_url
        self.gradeUrl = grade_url
        self.get_public_key()
        self.get_csrf_token()
        self.process_public()
        self.login()

    # 获取公钥密码
    def get_public_key(self):
        result = self.sessions.get(self.KeyUrl + str(self.time)).json()
        self.modules = result["modulus"]
        # 说实话 这也太那啥了 这居然是没用的 怪不得去年栽在这里
        # self.exponent = result["exponent"]

    # 获取CsrfToken
    def get_csrf_token(self):
        r = self.sessions.get(self.url + str(self.time))
        r.encoding = r.apparent_encoding
        soup = BeautifulSoup(r.text, 'html.parser')
        self.token = soup.find('input', attrs={'id': 'csrftoken'}).attrs['value']

    # 加密密码
    def process_public(self):
        weibo_rsa_e = 65537
        message = str(self.password).encode()
        rsa_n = binascii.b2a_hex(binascii.a2b_base64(self.modules))
        key = rsa.PublicKey(int(rsa_n, 16), weibo_rsa_e)
        encropy_pwd = rsa.encrypt(message, key)
        self.password = binascii.b2a_base64(encropy_pwd)

    def login(self):
        try:
            self.header = {
                'Accept': 'text/html, */*; q=0.01',
                'Accept-Encoding': 'gzip, deflate',
                'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0',
                'Connection': 'keep-alive',
                'Referer': self.url + str(self.time),
                'Upgrade-Insecure-Requests': '1',
            }
            data = {
                'csrftoken': self.token,
                'mm': self.password,
                'mm': self.password,
                'yhm': self.name
            }
            self.request = self.sessions.post(self.url, headers=self.header, data=data)
            self.cookie = self.request.request.headers['cookie']
            key_word = r'用户名或密码不正确'
            if re.findall(key_word, self.request.text):
                print('用户名或密码错误,请查验..')
                sys.exit()
            else:
                print("登陆成功")
        except Exception as e:
            print(str(e))
            sys.exit()

    def post_grade_data(self):
        try:
            data = {'_search': 'false',
                    'nd': int(time.time()),
                    'queryModel.currentPage': '1',
                    'queryModel.showCount': '15',
                    'queryModel.sortName': '',
                    'queryModel.sortOrder': 'asc',
                    'time': '0',
                    'xnm': self.year,
                    'xqm': self.term
                    }
            self.request = self.sessions.post(self.gradeUrl, data=data, headers=self.header).json()
        except Exception as e:
            print(str(e))
            sys.exit()

    def welcome(self):
        try:
            # 姓名
            name = self.request['items'][0]['xm']
            # 学历
            sch_stu = self.request['items'][0]['xslb']
            # 学院
            institute = self.request['items'][0]['jgmc']
            # 班级
            stu_class = self.request['items'][0]['bj']
            print('姓名:{}\t学历:{}\t\t学院:{}\t班级:{}'.format(name, sch_stu, institute, stu_class))
        except Exception as e:
            print(str(e))

    def print_grades(self):
        try:
            plt = '{0:<20}{1:<5}{2:<5}{3:<5}'
            print(plt.format('课程', '成绩', '绩点', '教师'))
            for i in self.request['items']:
                print(plt.format(i['kcmc'], i['bfzcj'], i['jd'], i['jsxm']))
        except Exception as e:
            print("[Error]" + str(e))


if __name__ == '__main__':
    # 输入学号密码
    # stu_name = input('请输入学号:').strip()
    stu_name = "你的学号"
    # stu_password = getpass.getpass('请输入密码(密码不回显,输入完回车即可):') .strip()
    stu_password = "你的密码"

    # 教务系统登录路径
    url = "http://你的学校域名或者ip地址/jwglxt/xtgl/login_slogin.html?language=zh_CN&_t="
    # 请求PublicKey的URL
    key_url = "http://你的学校域名或者ip地址/jwglxt/xtgl/login_getPublicKey.html?time="
    # 获取成绩路径
    grade_url = "http://你的学校域名或者ip地址/jwglxt/cjcx/cjcx_cxDgXscj.html?doType=query&gnmkdm=N305005"

    # 登陆~
    temp = Student(stu_name, stu_password, url, key_url, grade_url)
    # 设定学年
    temp.year = "2018"
    # 第一学期为3 第二学期为12
    temp.term = "3"
    # 选择成绩查询
    temp.post_grade_data()
    # 输出个人信息
    temp.welcome()
    # 输出成绩信息
    temp.print_grades()

运行结果

在这里插入图片描述

感觉没啥好讲的 都是干货 git大学一定要学会呀 公司里都在用~
如果帮助到你了 烦请star!
最后留个工作邮箱 lilousc@dingtalk.com

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-离娄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值