python模拟登陆川农大教务系统----requests库
人生苦短,我用python,学了段时间爬虫,该应用下了,不如就拿我们学校教务处开刀呗,心疼我教3秒。
废话不多说,首先先分析下教务系统登陆机制:
先打开谷歌浏览器,登陆川农教务处,按F12,记得把preserve log(保留日志)打上勾,后面分析数据要用到
怎么找验证密码的网站呢?提交网站后一般都会重定向(跳转到其他网站),所以找到状态码为302并且请求方式是post的即可
接下来我们分析下需要提交哪些东西。
一般提交的有header,post表单和验证码(此处没有),先说header:
header里面那么多数,但不全都是必须提交的,多登陆几次你会发现变化的只有cookie,,那么cookie怎么获取呢?我们访问教务网主页,服务器返回的信息里就有需要的cookie,具体怎么获取请看代码(前面让勾选保留日志派上用场,不勾选,网页一刷新前面数据全没了),cookies搞定了,header也就搞定了
接下来是看post表单需要提交哪些数据:
我们注意到密码被url解密后不是明文,说明密码在前端就被加密了。在HTML中找到加密方法加密即可(此处略,代码中有)
然后提交所需数据。最后尝试登陆,以下是成功截图
模拟登陆成功后抢课(删掉),查成绩,查课表都不在话下!(逃)
最后献上代码:
import requests
import re
def log_scau(id,pwd):
#该模拟登陆共分为三部分
#第一部分,准备header
index = requests.get('http://jiaowu.sicau.edu.cn/web/web/web/index.asp')
index.encoding = 'gb2312'
cookies = index.headers['Set-Cookie'] #获取header中需要提交的cookies
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Content-Type': 'application/x-www-form-urlencoded',
'Proxy-Connection': 'Keep-Alive',
'Host': 'jiaowu.sicau.edu.cn',
'Origin': 'http://jiaowu.sicau.edu.cn',
'Referer': 'http://jiaowu.sicau.edu.cn/web/web/web/index.asp',
'Cookie': cookies #获取的的cookies,其他为固定参数,照搬即可
}
#第二部分,准备post提交的数据,登陆密码需要加密,所以先获取加密算法,算法就在html文档中
data=index.text
pattern = re.compile(r"dcode2=\d{10}") # 正则匹配
match = pattern.search(data)
tmp = match.group(0)
# 加密算法
dcode = pwd
dcode1 = ""
temp = int(tmp.split("=")[1])
dcode2 = "" + str(temp * 137)
length = len(dcode)
for i in range(1, length + 1):
tmpstr = dcode[i - 1:i]
dcode1 = dcode1 + chr(ord(tmpstr[0]) - i - int(dcode2[i - 1:i])) #加密后的数据
data={ #需要提交的数据
'user': id,
'pwd': dcode1,
'lb': 'S',
'submit': ''
}
#第三部分,尝试登陆
post_url='http://jiaowu.sicau.edu.cn/jiaoshi/bangong/check.asp' #验证密码的网站
try:
requests.post(post_url, data=data, headers=headers) #先登陆验证密码网站
data=requests.get('http://jiaowu.sicau.edu.cn/xuesheng/bangong/main/index1.asp',headers=headers)#登陆个人主页
data.encoding='gb2312'
name=re.compile('<td width="99" align="left">(.*)</td>').findall(data.text) #正则匹配你的名字
print('欢迎你,'+name[1]) #输出欢迎你,xxx
except Exception as e:
print('登陆失败')
id=input('输入你的账号:\n')
pwd=input('输入你的密码:\n')
log_scau(id,pwd)