Python3+Requests庫帶驗證碼登陸學校教務系統的嘗試。

畢業快兩年了,上班空閒摸魚的時候無意中打開了學校的教務系統。發現瀏覽器還記着我的學號和登陸密碼(果然是很多東西你自己都忘了,瀏覽器的雲端都幫你記着),輸入驗證碼之後居然登陸進去了。學校的教務系統還是一如既往地難看。

可能是兼容性的問題,這個系統在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的數據是從開發者工具裏面獲取的。

做完這些之後,其實心裏面有種做個小的教務系統客戶端的念頭,不過很快就打消了,哈哈哈哈,畢竟實在是有點花時間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章