python模拟登陆川农大教务系统----requests库

人生苦短,我用python,学了段时间爬虫,该应用下了,不如就拿我们学校教务处开刀呗,心疼我教3秒。

废话不多说,首先先分析下教务系统登陆机制:

先打开谷歌浏览器,登陆川农教务处,按F12,记得把preserve log(保留日志)打上勾,后面分析数据要用到

python模拟登陆川农大教务系统----requests库

怎么找验证密码的网站呢?提交网站后一般都会重定向(跳转到其他网站),所以找到状态码为302并且请求方式是post的即可

接下来我们分析下需要提交哪些东西。

一般提交的有header,post表单和验证码(此处没有),先说header:

python模拟登陆川农大教务系统----requests库

header里面那么多数,但不全都是必须提交的,多登陆几次你会发现变化的只有cookie,,那么cookie怎么获取呢?我们访问教务网主页,服务器返回的信息里就有需要的cookie,具体怎么获取请看代码(前面让勾选保留日志派上用场,不勾选,网页一刷新前面数据全没了),cookies搞定了,header也就搞定了

接下来是看post表单需要提交哪些数据:

python模拟登陆川农大教务系统----requests库

我们注意到密码被url解密后不是明文,说明密码在前端就被加密了。在HTML中找到加密方法加密即可(此处略,代码中有)

然后提交所需数据。最后尝试登陆,以下是成功截图

python模拟登陆川农大教务系统----requests库

模拟登陆成功后抢课(删掉),查成绩,查课表都不在话下!(逃)

最后献上代码:

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)