畢業快兩年了,上班空閒摸魚的時候無意中打開了學校的教務系統。發現瀏覽器還記着我的學號和登陸密碼(果然是很多東西你自己都忘了,瀏覽器的雲端都幫你記着),輸入驗證碼之後居然登陸進去了。學校的教務系統還是一如既往地難看。
可能是兼容性的問題,這個系統在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的數據是從開發者工具裏面獲取的。
做完這些之後,其實心裏面有種做個小的教務系統客戶端的念頭,不過很快就打消了,哈哈哈哈,畢竟實在是有點花時間。