矿大2017年使用的是新版的教务系统,提交的密码是经过js加密的。
虽然我最后找到了加密的文件,可是js没有学过,看了半天硬是没看懂。
最后渣渣只能另找办法了,最后发现了一个神器splinter。这个库的使用我就不再赘述了,简单介绍一下我是怎么实现登录的
#login
from splinter.browser import Browser
class Login(object):
def __init__(self):
self.txtUserName = '******' #用户名
self.TextBox2 = '******' #密码
self.txtSecretCode = '' #验证码
def submit(self):
b = Browser(driver_name="chrome")
b.visit("http://202.119.206.62/jwglxt/xtgl/login_slogin.html")
b.fill("yhm", self.txtUserName)
b.fill("mm", self.TextBox2)
button = b.find_by_id('dl')
button.click()
cookie = 'JSESSIONID' + '=' + b.cookies['JSESSIONID'] #cookie的构成
return cookie
这样就完成登录了,并拿到了登录后的cookie,接下来就是爬取成绩页面和计算成绩了。
首先是各个库的引用和实例一个login对象
import requests
import json
import xlwt
from login import Login
login = Login()
因为是异步加载的,所以拿到的是json数据,转化成字典后使用
url = 'http://202.119.206.62/jwglxt/cjcx/cjcx_cxDgXscj.html?doType=query&gnmkdm=N305005&queryModel.showCount=100&queryModel.currentPage=1&queryModel.sortName=&queryModel.sortOrder=asc&time=0'
postData = {
# 'xnm': "2016", #学年开始的年份
# 'xqm': "12", #对应第几学期,3表示第一学期,12是第二学期
}
headers = {
'cookie': login.submit(), #cookie值是临时获得生成的
'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'
}
r = requests.post(url, headers = headers, data=postData)
js = json.loads(r.text)
这里的postdata可以修改,选择那个学年哪个学期,我这里是导入整个大一大二的,所以直接注释掉了,headers中可以拿到前面登录过的cookie访问成绩查询页面。
然后写入到excel文件中
sheet1.write(0, 0, '科目')
sheet1.write(0, 1, '成绩')
sheet1.write(0, 2, '学分')
sheet1.write(0, 3, '绩点')
print(js['items'][0]['xm'], js['items'][0]['bj'])
print("所有科目共有{}条记录".format(len(js['items'])))
count = 0
jqCj = []
tplt = "{:^6}\t{:^6}\t{:^6}\t{:^20}"
print(tplt.format( "学分", "成绩", "绩点", "科目"))
for infor in js['items']:
if infor['kcxzmc'] != "通识教育公选课" and infor['kcxzmc'] != "素质教育课":
if infor['cj'] == '良好':
infor['cj'] = 80
elif infor['cj'] == '优秀':
infor['cj'] = 90
print(tplt.format( infor['xf'], infor['cj'], infor['jd'], infor['kcmc']))
jqCj.append([float(infor['xf']), float(infor['cj']), float(infor['jd'])])
sheet1.write(count, 0, infor['kcmc'])
sheet1.write(count, 1, infor['cj'])
sheet1.write(count, 2, infor['xf'])
sheet1.write(count, 3, infor['jd'])
count += 1
最后的计算我就不说了。。。2333
贴一下整个过程中的几张截图:
1.首先是自动登录
2.然后是打印成绩和计算成绩
成绩不好,大家看看就行。