Python3+Requests库带验证码登陆学校教务系统的尝试。

毕业快两年了,上班空闲摸鱼的时候无意中打开了学校的教务系统。发现浏览器还记着我的学号和登陆密码(果然是很多东西你自己都忘了,浏览器的云端都帮你记着),输入验证码之后居然登陆进去了。学校的教务系统还是一如既往地难看。

Python3+Requests库带验证码登陆学校教务系统的尝试。_第1张图片Python3+Requests库带验证码登陆学校教务系统的尝试。_第2张图片

可能是兼容性的问题,这个系统在WinXP中能够完美运行,但是在Win7及以上的浏览器中都是不能显示全部的,以前没有搞清楚这个问题,是因为以前大家的电脑上都是Win7、Win8和Win10。存粹就是骂网站,从来不找原因[doge]。如果不改兼容性的话,会提示不能创建对象。改了兼容性之后,就会像上图这样,右上角的部分文字都是白色的,然后页面像是被切了一样的显示出来。

之前为了爬取发货订单,写了一段登陆公司OA平台的代码,由于是内部系统,所以对反爬虫机制没有那么严格,没有验证码的情况下很容易就用Python爬进去了。始终没什么机会去爬带验证码的网站。这次正好碰到了学校的教务系统,就拿来练练手。由于从来没有接触过,就百度了几篇经验blog,总结出了一些内容,为我提供了帮助。

1、网站后台对验证码的判断方法

其实在没看blog之前,我一直对网站判断验证码的方法有疑问,毕竟不能直接把验证码的结果先传过来,由JavaScript来判断,不然任何一个网抓技术就都能很轻易的长驱直入了。而且,这么多人同时登陆网站,网站是如何分辨的。这两天才知道,网站是通过Cookie来区分不同的浏览器Post的数据,并针对Cookie返回相应的结果。

2、带验证码登陆的步骤

根据搜集到的资料,以及实际的操作,在当前的情况下,带验证码登陆的步骤如下:

(1)获取验证码的图片,并保留验证码网页的Cookie

(2)向网站登陆网址Post数据

(3)Get网站登陆后网址的信息

3、实际操作

很多大神是通过urllib库和Http.CookieJar库来操作的,个人比较倾向于requests库,操作上比较简单。

#/usr/bin/env python
#-*-coding:utf-8-*-
import requests
homeurl='http://www2.hnjtzy.com.cn'
codeurl=homeurl+'/jwnet/other/CheckCode.aspx?datetime=az'
posturl=homeurl+'/jwnet/login.aspx'
geturl=homeurl+'/jwnet/JWXS/Default.aspx'
mydeskurl=homeurl+'/jwnet/JWXS/OA_DESK.aspx'

ress=requests.session()

def Login():
    headers={'Accept':'image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5',
             'Referer':'http://www2.hnjtzy.com.cn/jwnet/login.aspx',
             'Accept-Language':'zh-CN',
             'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
             'Accept-Encoding':'gzip, deflate',
             'Host':'www2.hnjtzy.com.cn',
             'Connection':'Keep-Alive'}
    code=ress.get(codeurl,headers=headers)
    with open('code.jpg','wb') as file:
        file.write(code.content)
        file.close

    headers={'Accept':'text/html, application/xhtml+xml, */*',
             'Referer':'http://www2.hnjtzy.com.cn/jwnet/login.aspx',
             'Accept-Language':'zh-CN',
             'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
             'Accept-Encoding':'gzip, deflate',
             'Host':'www2.hnjtzy.com.cn',
             'Connection':'Keep-Alive',
             'Cache-Control':'no-cache'}
    vusername=input('请输入用户名:')
    vpassword=input('请输入密码:')
    vcode=input('请输入验证码:')
    data={'__VIEWSTATE':'/wEPDwULLTEyMzg5MzU4MjgPZBYCAgMPZBYEAg0PDxYCHgRUZXh0ZWRkAg8PDxYCHwAFATdkZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAQUHQ2hrVXNlcg2Rn2ww7opTFHCp2zYdC8U7VKuj',
          '__EVENTVALIDATION':'/wEWBgLqtf3ACQKvo8HwCwKG85bvBgLO44u1DQLAiqigBwKZwO3DDXUidV3/JkCNp7t9Q0L9lF+crP3N',
          'Account':vusername,
          'PWD':vpassword,
          'CheckCode':vcode,
          'cmdok':''}
    post=ress.post(posturl,headers=headers,data=data)
    get=ress.get(geturl,headers=headers)
    if '请输入验证码' in get.text:
        print('信息不符合,请重新输入')
        Login()
    else:
        MyDesk()

def MyDesk():
    headers={'Accept':'text/html, application/xhtml+xml, */*',
             'Referer':'http://www2.hnjtzy.com.cn/jwnet/login.aspx',
             'Accept-Language':'zh-CN',
             'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
             'Accept-Encoding':'gzip, deflate',
             'Host':'www2.hnjtzy.com.cn',
             'Connection':'Keep-Alive',
             'Cache-Control':'no-cache'}
    mydesk=ress.get(mydeskurl,headers=headers)
    print(mydesk.text)

Login()

原理上是先下载验证码到电脑,然后通过人工输入用户名、密码和验证码的方式实现登陆。Post的数据是从开发者工具里面获取的。

做完这些之后,其实心里面有种做个小的教务系统客户端的念头,不过很快就打消了,哈哈哈哈,毕竟实在是有点花时间。

你可能感兴趣的:(Python练习,Yogurt_cry)