Python实现新版正方教务系统爬虫(二)
前言
哎對(duì)不起 我可能是silly boy 我想在學(xué)校里把去年的坑填了 但是發(fā)現(xiàn)新版的教務(wù)系統(tǒng)代碼沒傳到git上 我現(xiàn)在就成了個(gè)對(duì)著空ide發(fā)呆的憨憨(代碼在家里啦 所以填坑就再過會(huì)吧
那就稍微閑聊一下吧 打算填坑前逛了一下csdn上面有關(guān)新版正方教務(wù)系統(tǒng)的帖子 我去年留下的rsa加密的坑其實(shí)都被填掉了 也有用flask框架完善整個(gè)項(xiàng)目的
其實(shí)挺好的 寫博客就是為了幫助更多的志同道合之人在這條路上進(jìn)步 告訴你們我是怎么走到這里的 走了多少的坑
為中華崛起而奮斗~~
正文哈
國慶之后終于是想起來要把代碼拷走這回事情,現(xiàn)在基本是填完了啦。
給剛學(xué)習(xí)爬蟲的小白們做了封裝 希望能夠幫助你們理解
新版的方正教務(wù)系統(tǒng)唯一的難點(diǎn)也就是在登陸加密的地方了,這里感謝@qq_14926447 使用了他代碼中的輪子 于是我也能快樂的跑起來啦~
實(shí)現(xiàn)的原理貼在上個(gè)教程里面了 就直接上干貨吧
github項(xiàng)目鏈接:https://github.com/welsonsxc/NewZFScoreSpider
講解一下
整個(gè)流程我封裝成一個(gè)類了,方便后續(xù)api或者多線程調(diào)用
wechat_robot文件夾里是當(dāng)時(shí)做測(cè)試公眾號(hào)用的 學(xué)校方面沒法申請(qǐng)下來經(jīng)費(fèi)就逐漸廢棄了 如果你們學(xué)校可以的話 不妨研究一下 填填坑
噥 知道你們最喜歡這個(gè)了 再次感謝@qq_14926447
# 加密密碼def process_public(self):weibo_rsa_e = 65537message = 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)我知道有人懶得點(diǎn)進(jìn)github
# -*- coding: utf-8 -*- import binascii import requests from bs4 import BeautifulSoup import re import time import sys import rsaclass Student:sessions = requests.Session()time = int(time.time())def __init__(self, name, password, login_url, key_url, grade_url):self.pub = Noneself.year = Noneself.term = Noneself.token = Noneself.header = Noneself.cookie = Noneself.modules = Noneself.request = Noneself.name = str(name).encode("utf8").decode("utf8")self.password = str(password).encode("utf8").decode("utf8")self.url = login_urlself.KeyUrl = key_urlself.gradeUrl = grade_urlself.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"]# 說實(shí)話 這也太那啥了 這居然是沒用的 怪不得去年栽在這里# self.exponent = result["exponent"]# 獲取CsrfTokendef get_csrf_token(self):r = self.sessions.get(self.url + str(self.time))r.encoding = r.apparent_encodingsoup = BeautifulSoup(r.text, 'html.parser')self.token = soup.find('input', attrs={'id': 'csrftoken'}).attrs['value']# 加密密碼def process_public(self):weibo_rsa_e = 65537message = 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('用戶名或密碼錯(cuò)誤,請(qǐng)查驗(yàn)..')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']# 學(xué)歷sch_stu = self.request['items'][0]['xslb']# 學(xué)院institute = self.request['items'][0]['jgmc']# 班級(jí)stu_class = self.request['items'][0]['bj']print('姓名:{}\t學(xué)歷:{}\t\t學(xué)院:{}\t班級(jí):{}'.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('課程', '成績(jī)', '績(jī)點(diǎn)', '教師'))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__':# 輸入學(xué)號(hào)密碼# stu_name = input('請(qǐng)輸入學(xué)號(hào):').strip()stu_name = "你的學(xué)號(hào)"# stu_password = getpass.getpass('請(qǐng)輸入密碼(密碼不回顯,輸入完回車即可):') .strip()stu_password = "你的密碼"# 教務(wù)系統(tǒng)登錄路徑url = "http://你的學(xué)校域名或者ip地址/jwglxt/xtgl/login_slogin.html?language=zh_CN&_t="# 請(qǐng)求PublicKey的URLkey_url = "http://你的學(xué)校域名或者ip地址/jwglxt/xtgl/login_getPublicKey.html?time="# 獲取成績(jī)路徑grade_url = "http://你的學(xué)校域名或者ip地址/jwglxt/cjcx/cjcx_cxDgXscj.html?doType=query&gnmkdm=N305005"# 登陸~temp = Student(stu_name, stu_password, url, key_url, grade_url)# 設(shè)定學(xué)年temp.year = "2018"# 第一學(xué)期為3 第二學(xué)期為12temp.term = "3"# 選擇成績(jī)查詢temp.post_grade_data()# 輸出個(gè)人信息temp.welcome()# 輸出成績(jī)信息temp.print_grades()運(yùn)行結(jié)果
感覺沒啥好講的 都是干貨 git大學(xué)一定要學(xué)會(huì)呀 公司里都在用~
如果幫助到你了 煩請(qǐng)star!
最后留個(gè)工作郵箱 lilousc@dingtalk.com
總結(jié)
以上是生活随笔為你收集整理的Python实现新版正方教务系统爬虫(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做卓有成效的程序员
- 下一篇: ArcEngine实现色带下拉框