100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Python 模拟登陆南邮智慧校园查询成绩

Python 模拟登陆南邮智慧校园查询成绩

时间:2022-06-05 18:25:56

相关推荐

Python 模拟登陆南邮智慧校园查询成绩

/8/24日已经更新,详情看后面分割线处

之前爬取智慧校园在网页登录后把cookies保存下来,放进代码里,可以运行,还以为完事了,挺简单,但是过了一段时间再运行发现,好像出现了cookies会过期的问题,再经过ctrl+U查看源代码,发现里面的这么一段:

里面的值是很有用的

登录界面url:http://ids6./authserver/login?service=http%3A%2F%2Fmy.%2Findex.do

目前更变为:http://ids6./authserver/login?service=http%3A%2F%2Fyjs.%2Fepstar%2Fweb%2Fswms%2Fmainframe%2Fhome.jsp

在登录界面中打开审查元素,输入学号和密码后再点击登录

进入下图页面

其中Headers中的From Data是发送发post请求时要用的关键信息,而里面的lt值是会改变的,这就是为什么使用一成不变的cookies会失效的原因,这个lt值其实在登录页面的源代码中,随着你每次的访问而变化,因此关键就是找到it值

我们回到登录页面:http://ids6./authserver/login?service=http%3A%2F%2Fmy.%2Findex.do

目前更变为:http://ids6./authserver/login?service=http%3A%2F%2Fyjs.%2Fepstar%2Fweb%2Fswms%2Fmainframe%2Fhome.jsp

在该页面的源代码里面的lt值就是我们所需要的。

除了以上工作,我们还需要注意的是,在我们请求登录页面以获取lt值后,如果再用post发送我们构造好的表单,在这个过程中,相当于刷新了一下页面,换句换说,我们先前获得的lt值已经不再是现在的lt值了,所以这个时候我们就要用requests的session方法来保持cookie不变,session方法可以让同一个实例发出的所有请求保持相同的cookie。

参考文章:

/kelvinmao/article/details/51628649

/wzxwhd/p/5966563.html

以下是完整代码:

import requestsfrom lxml import etreedef getpage(login_url,header,url):res_keep=requests.Session()#保持Cookie不变,然后再次访问这个页面ex_html=res_keep.get(login_url,headers=header).texthtml=etree.HTML(ex_html)value=html.xpath('//div[@class="box"]/form/input/@value')postdata={'username':'xxxxx',#此处为你的学号'password':'xxxxx',#你的密码'lt':value[0],#可变的'dllt':value[1],'execution':value[2],'_eventId':value[3],'rmShown':value[4]}res_post=res_keep.post(login_url,data=postdata,headers=header)#使用构建好的postdata重新登录发送post请求,用之前的res_keep进行post请求respond=res_keep.get(url,headers=header).text#获取到成绩页面源代码,用之前的res_keep进行get请求return responddef checkgrade(page):html=etree.HTML(page)course_name=html.xpath('//td[@class="t_td"]/font[@id="kcmc"]/text()')course_grade=html.xpath('//td[@class="t_td"]/font[@id="cj"]/text()')pscj=html.xpath('//td[@class="t_td"]/font[@id="pscj"]/text()')qmcj=html.xpath('//td[@class="t_td"]/font[@id="qmcj"]/text()')k=len(course_name)no_grade=[];sum=0;j=0 #sum用来记录成绩的和 #j用来记录成绩已经录入的课程数目for i in range(k):if course_grade[i]=='成绩未录入':no_grade.append(i) #将未录入成绩所对应的i值放入no_grade列表,以便后面展示调用else:j=j+1sum=sum+float(course_grade[i]) #sum是数字,course_grade[i]是字符串,所以把course_grade[i]变成float型print('总评:%s'%course_grade[i]+' 期末:%s'%qmcj[i]+'平时:%s'%pscj[i]+'<---'+course_name[i])#打印出成绩已经录入的课程名字以及对应分数#以下是计算均分部分if j==0:#如果j==0说明成绩都还没录入print('所有成绩都还未出')else:#如果j!=0说明至少有一门成绩录入了print(str(j)+'门均分为:'+'%.2f'%(sum/j)+'\n')for each in no_grade:print('成绩未录入'+' <--- '+course_name[each])#打印出成绩还未录入的课程名字if __name__ =='__main__':header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/0101 Firefox/47.0'}login_url='http://ids6./authserver/login?service=http%3A%2F%2Fyjs.%2Fepstar%2Fweb%2Fswms%2Fmainframe%2Fhome.jsp'#登录页面url#url是指成绩页面url='http://yjs./epstar/app/template.jsp?mainobj=YJSXT/PYGL/CJGLST/V_PYGL_CJGL_KSCJHZB&tfile=KSCJHZB_CJCX_CD/KSCJHZB_XSCX_CD_BD&filter=V_PYGL_CJGL_KSCJHZB:WID=%275m3b6a53-8l95jp-jhk08lc3-1-jidxxpoh-1i5l%27'page=getpage(login_url,header,url)if '验证码'in page:print('请检查用户名和密码,稍候再试!')else:checkgrade(page)

菜鸟一枚,自学python没多久,第一次写博客,水平有限,还请大神指教,轻喷

**

—————/8/24日更新———分割线——————————

**

官网的登录地址有变化了,然后代码稍微变化了几个地方

一个是login_url变成了 http://rzfw./cas/login?service=http%3A%2F%2Fyjs.%2Fepstar%2Fweb%2Fswms%2Fmainframe%2Fhome.jsp

因为postdata就是根据login_url页面去获取的,因此post请求所需的postdata变化了

原来的postdata为:

postdata={

‘username’:‘xxxxx’,#此处为你的学号

‘password’:‘xxxxx’,#你的密码

‘lt’:value[0],#可变的

‘dllt’:value[1],

‘execution’:value[2],

‘_eventId’:value[3],

‘rmShown’:value[4]}

现在变成:

postdata={

‘username’:‘xxxxxx’,#此处为你的学号

‘password’:‘xxxxxx’,#你的密码

‘authcode’:’’,

‘execution’:value[0],

‘_eventId’:‘submit’}

这里我们要获取的 ‘execution’的值再login_url页面查看源代码可以找到:

由于它是唯一的,所以直接在input标签下的属性name="execution"的就可以找到

因此我们的变成了value=html.xpath(’//input[@name=“execution”]/@value’)

还有就是之前默认是utf-8编码格式,现在是ISO-8859-1,因此要加上respond.encoding=“utf-8”,防止中文乱码.

更新后代码如下:

import requestsfrom lxml import etreedef getpage(login_url,header,url):res_keep=requests.Session()#保持Cookie不变,然后再次访问这个页面ex_html=res_keep.get(login_url,headers=header).texthtml=etree.HTML(ex_html)value=html.xpath('//input[@name="execution"]/@value')postdata={'username':'xxxxx',#此处为你的学号'password':'xxxxx',#你的密码'authcode':'','execution':value[0],'_eventId':'submit'}res_post=res_keep.post(login_url,data=postdata,headers=header)#使用构建好的postdata重新登录发送post请求,用之前的res_keep进行post请求respond=res_keep.get(url,headers=header)#获取到成绩页面源代码,用之前的res_keep进行get请求respond.encoding="utf-8"#要申明编码格式,不然中文会乱码return respond.textdef checkgrade(page):html=etree.HTML(page)course_name=html.xpath('//td[@class="t_td"]/font[@id="kcmc"]/text()')course_grade=html.xpath('//td[@class="t_td"]/font[@id="cj"]/text()')pscj=html.xpath('//td[@class="t_td"]/font[@id="pscj"]/text()')qmcj=html.xpath('//td[@class="t_td"]/font[@id="qmcj"]/text()')k=len(course_name)no_grade=[];sum=0;j=0 #sum用来记录成绩的和 #j用来记录成绩已经录入的课程数目for i in range(k):if course_grade[i]=='成绩未录入':no_grade.append(i) #将未录入成绩所对应的i值放入no_grade列表,以便后面展示调用else:j=j+1sum=sum+float(course_grade[i]) #sum是数字,course_grade[i]是字符串,所以把course_grade[i]变成float型print('总评:%s'%course_grade[i]+' 期末:%s'%qmcj[i]+'平时:%s'%pscj[i]+'<---'+course_name[i])#打印出成绩已经录入的课程名字以及对应分数#以下是计算均分部分if j==0:#如果j==0说明成绩都还没录入print('所有成绩都还未出')else:#如果j!=0说明至少有一门成绩录入了print(str(j)+'门均分为:'+'%.2f'%(sum/j)+'\n')#+'\n'表示除了打印前面的内容还会换行打印一行空白for each in no_grade:print('成绩未录入'+' <--- '+course_name[each])#打印出成绩还未录入的课程名字if __name__ == '__main__':header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/0101 Firefox/47.0'}login_url='http://rzfw./cas/login?service=http%3A%2F%2Fyjs.%2Fepstar%2Fweb%2Fswms%2Fmainframe%2Fhome.jsp'#登录页面url#url是指成绩页面url='http://yjs./epstar/app/template.jsp?mainobj=YJSXT/PYGL/CJGLST/V_PYGL_CJGL_KSCJHZB&tfile=KSCJHZB_CJCX_CD/KSCJHZB_XSCX_CD_BD&filter=V_PYGL_CJGL_KSCJHZB:WID=%275m3b6a53-8l95jp-jhk08lc3-1-jidxxpoh-1i5l%27'page=getpage(login_url,header,url)if '验证码'in page:print('请检查用户名和密码,稍候再试!')else:checkgrade(page)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。