最近開發(fā)關(guān)于學(xué)校服務(wù)類小程序,小程序后臺需要從學(xué)校的系統(tǒng)獲取到各同學(xué)的信息缘厢,所以語言優(yōu)先選擇了python吃度,并用了Django框架。之前也有寫過一些爬蟲贴硫,但都是用其他語言寫的椿每。對python并不熟悉,所以這次開發(fā)踩了不少坑夜畴,也走了不少彎路拖刃。在這里總結(jié)一下,分享給同樣有需要的人贪绘。
學(xué)校的登陸流程是這樣的:
正確登陸流程應(yīng)該是上圖的那樣的,但是如果登陸錯(cuò)誤是不會(huì)獲取到302頁的央碟,而是直接返回登陸頁税灌,python獲取到的狀態(tài)碼也是200均函。
在這里我就犯了一個(gè)很嚴(yán)重的錯(cuò)誤,我一直以為我post登陸是正確的菱涤,從而把bug定位到【python獲取不到302驗(yàn)證頁】這個(gè)問題上苞也,一開始先百度,得出的答案是在requests.post請求中添加allow_redirects=False來禁止網(wǎng)頁重定向粘秆,我發(fā)現(xiàn)還是沒有獲取到302頁如迟,從而轉(zhuǎn)向更底層的httplib和自定義自己的urlib的重定向類。發(fā)現(xiàn)還是不行攻走,困擾了我一天殷勘,終于在我祭出fiddler之后,bug慢慢顯現(xiàn)出來昔搂。
fd第一步:抓包
通過fd分別抓取瀏覽器和pycharm Post請求包
fd第二步:對比
對比pycharm和瀏覽器向教務(wù)系統(tǒng)服務(wù)器發(fā)出的請求包內(nèi)容發(fā)現(xiàn)玲销,
username,password摘符,imgcode以及cookies兩邊都是一樣的
而user_lb這個(gè)字段兩邊不一樣pycharm請求的是中文瀏覽器則是亂碼
難道就是因?yàn)檫@個(gè)字段編碼問題導(dǎo)致服務(wù)器驗(yàn)證失斚托薄?
接下來分析一下pycharm的編碼
在python3中默認(rèn)是Unicode編碼逛裤,我們在使用requests發(fā)送post請求的時(shí)候瘩绒,python會(huì)默認(rèn)使用utf-8編碼data表單數(shù)據(jù),而學(xué)校的表單卻是以gbk編碼提交带族,是真的很奇葩锁荔,目前來說只有非常古老的網(wǎng)站才采用gbk編碼了。
下面我們來改一下代碼
postdata = {
'imgcode': input(),
'password':input(),
'user_lb':'學(xué)生',----> 'user_lb':'學(xué)生'.encode('gbk'),
'username':input(),
}
提示:在Python3中炉菲,decode是把二進(jìn)制字符串解碼成Unicode碼堕战,encode則是把Unicode碼轉(zhuǎn)換成對應(yīng)的二進(jìn)制字符串
修改完以后再一次驗(yàn)證
就此困擾了我兩天的問題終于成功解決,拿到了sessid拍霜,之后通過設(shè)置相應(yīng)的cookies便可以對學(xué)生信息頁進(jìn)行相應(yīng)的操作了嘱丢。
貼個(gè)登陸時(shí)序圖方便理解吧
總結(jié):我最后只用了【.encode('gbk')】就解決了問題,所以說請求的時(shí)候祠饺,編碼很重要越驻,編碼錯(cuò)誤很可能導(dǎo)致服務(wù)端拿不到正確的請求內(nèi)容,從而爬蟲也接收不到正確的響應(yīng)內(nèi)容道偷。