鉴于先前回答了一个问题 https://www.zhihu.com/question/50623009/answer/122128894?from=profile_answer_card# 导致有一些知友私信我,问我是怎么实现一键评教功能的。所以就打算写篇文章描述我当时是怎么实现这个功能的,声明我只是个python基础学习者,以下仅为个人的一些观点,不足之处还请各位多多担待。
开门见山吧,首先进入官网的登入界面, 并监控浏览器的行为(网络抓包)
点击登入按钮,会抓取到一个POST头信息,里面含有提交给服务器的信息
比如我这里提交了用户名,密码和一个动态变化的参数lt。lt需要动态的抓取,因此需要分析下登入界面的html,ctrl+f搜索lt很快就找到了它的位置所在。到这里我们就知道POST了哪些信息给服务器,下面只需要写代码向上图中的url post请求即可模拟登入官网。
代码参考:
import re
import requests
import urllib.request
from bs4 import BeautifulSoup as bs
def warn(*args, **kw): pass
import warnings
warnings.warn = warn
print('请输入用户名:')
username = input()
print('请输入密码:')
password = input()
login_url = 'https://cas.ecit.cn/index.jsp?service=http://portal.ecit.cn/Authentication'
def get_LT(login_url):
html = requests.get(login_url, verify=False).text
regex = re.compile('')
lt = re.findall(regex, html)[0]
return lt
LT = get_LT(login_url)
data = {
'lt': LT,
'password': password,
'username': username
}
s = requests.Session()
s.post(login_url, data=data, headers=headers, verify=False)
开头重定义了warning.warn函数是因为运行过程中会出现警告,那是由于我们官网的证书问题,所以在这里requests.Session的verify也需要赋值False,要不然就会报错了。
登入成功后我们继续监控浏览器的行为,找到评教的界面(如果在代码中只需要访问评教的url即可)
点击教学评估按钮,在监控框找到上图右侧表单的html
这个html界面蕴含着六个重要参数,在后面的post请求中需要用到。然后点击右侧评教的按钮,这里会监控到一个post请求
这里的bpr,bprm,pgnr,pgnrm,wjbm,wjmc参数就保存在上面的html中的img标签下面
相信大家都能发现参数与他们之间的对应关系了吧。
提取参数的代码参考:
cs_url = 'http://jw.ecit.cn/jxpgXsAction.do?oper=listWj' #html对应的url
cs_html = s.get(cs_url, headers=headers1, verify=False).text
hiden_regex = re.compile('
cs_list = re.findall(hiden_regex, cs_html)
bpr_list = [i.split('#@')[1] for i in cs_list]
kx_list = [i.split('#@')[5] for i in cs_list]
pgnrm_list = [i.split('#@')[4] for i in cs_list]
bprm_list = [i.split('#@')[2] for i in cs_list]
wjmc_list = [i.split('#@')[3] for i in cs_list]
随后构造上面的post请求即可打开,评教的相关项目界面
这里是由于我已经评教了所以字体都高亮了。
最后一步就是提交选项及其相关参数的表单信息,继续监督浏览器自己做实验的时候需要评教一门课程,这样可以分析post的信息,由于我已经评教了不能再评教了,因此不能截取浏览器的post了,所以我贴一下我最开始的监测到的post信息。
解释一下:0000000017-0000000030是对应的题目,5_1,...,4_1是对应的第一个选项,我这里全是选择第一个选项,即是全部都评满意,这里大家可以即兴发挥。到这里全部的原理就分析结束了。
运行代码结果截图:
以上仅作技术上的交流,请勿用于违反校规校纪的场合。
以上仅作技术上的交流,请勿用于违反校规校纪的场合。
以上仅作技术上的交流,请勿用于违反校规校纪的场合。