前言
記得從大二的時(shí)候就很想寫(xiě)一個(gè)基于教務(wù)系統(tǒng)的輔助工具耕漱,提供一些“黑科技”的功能算色,例如輔助選課等等,但是受限于當(dāng)時(shí)掌握的知識(shí)螟够,還有就是正方的這套教務(wù)系統(tǒng)實(shí)在是有不少坑灾梦。。妓笙。
遇到的坑
下面總結(jié)一下在爬取數(shù)據(jù)過(guò)程中遇到的一些問(wèn)題及解決方案若河。
1. 模擬登陸教務(wù)系統(tǒng)需要一個(gè)隱藏表單項(xiàng)
想要爬取教務(wù)系統(tǒng)中的課程、成績(jī)等信息寞宫,首先自然是要登錄系統(tǒng)萧福,在抓包的過(guò)程中發(fā)現(xiàn),提交的 POST 請(qǐng)求中需要一個(gè)名為 lt 的參數(shù)辈赋,查看源碼鲫忍,發(fā)現(xiàn)一個(gè)隱藏表單項(xiàng)。
沒(méi)有這個(gè)參數(shù)是無(wú)法成功登錄的钥屈,因此我們需要先通過(guò)一個(gè) GET 請(qǐng)求饲窿,獲取到該表單項(xiàng)的值,然后再進(jìn)行 POST 登錄焕蹄。
2. 登錄完成以及跳轉(zhuǎn)到其他應(yīng)用時(shí)會(huì)有很多認(rèn)證跳轉(zhuǎn)
這個(gè)是什么意思呢逾雄?當(dāng)我們?cè)谕瓿?POST 請(qǐng)求之后,并不是直接跳轉(zhuǎn)至我們想要的頁(yè)面腻脏,而是會(huì)經(jīng)過(guò)多次頁(yè)面跳轉(zhuǎn)鸦泳。個(gè)人猜測(cè)是為了同步不同域之間的會(huì)話數(shù)據(jù),由于整個(gè)教務(wù)系統(tǒng)永品,包括數(shù)字杭電做鹰、教學(xué)管理(選課系統(tǒng))、銀校通其實(shí)都各自是獨(dú)立的應(yīng)用鼎姐,所屬域不同钾麸,甚至使用的編程語(yǔ)言都不同更振,那么當(dāng)我們從一個(gè)應(yīng)用跳轉(zhuǎn)至另一個(gè)應(yīng)用的時(shí)候,如何保持我們的登錄狀態(tài)呢饭尝?首先每個(gè)應(yīng)用需要提供一個(gè)接口用于同步會(huì)話信息肯腕,然后需要一個(gè)獨(dú)立的認(rèn)證服務(wù)。
當(dāng)然上面都是我個(gè)人的猜測(cè)实撒。。涉瘾。
在這套系統(tǒng)中知态,這些跳轉(zhuǎn)是通過(guò) js 來(lái)完成的(location.href = ……),那我們要怎么做的立叛,最簡(jiǎn)單的方式就是使用循環(huán)负敏,檢查源碼中是否包含「認(rèn)證跳轉(zhuǎn)」這四個(gè)字,如果有秘蛇,則解析出其中要跳轉(zhuǎn)的地址其做,再發(fā)送一次 GET 請(qǐng)求,如果沒(méi)有彤叉,表明已經(jīng)到達(dá)目的地庶柿,則退出循環(huán)。
3. 請(qǐng)求頁(yè)面出現(xiàn) Object moved to here
這個(gè)問(wèn)題困擾了我很長(zhǎng)時(shí)間秽浇,也導(dǎo)致這個(gè)項(xiàng)目荒廢了很久浮庐。
這其實(shí)是 asp.net 編寫(xiě)的 Web 程序經(jīng)常出現(xiàn)的問(wèn)題,具體我也沒(méi)有深入研究柬焕,解決方案也很簡(jiǎn)單审残,在請(qǐng)求頭加入一個(gè) Referer 參數(shù)就可以了,值的話可以用請(qǐng)求頁(yè)面的 URL斑举。