使用 Python 寫一個搶課用的軟體,卡在了取課表這一步,怎麼辦?

這是firebug抓到去課表的post數據

__EVENTTARGET=kj
__EVENTARGUMENT=
__VIEWSTATE=dDwt#這裡後面還有一堆我刪了
kj=°??飨4£?#這裡是抓到亂碼了,原來是『板塊(4)』

所以我自己構建了一個postdict

posdict={
"__EVENTARGUMENT":"",
"__EVENTTARGET":"kj",
"__VIEWSTATE":__VIEWSTATE,#__VIEWSTATE的值已經利用BeautifulSoup取到
"kj":options[classnum],這裡也已經正確取到
}

這是我的post函數,用的是requests庫

def postData(self, url, user, postDic,cookies=None):
"""
以POST形式獲取內容
"""
try:
head={
"User-Agent":" Mozilla/5.0 (Windows NT 6.3; rv:35.0) Gecko/20100101 Firefox/35.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3",
"Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive",
}
r = requests.post(url, data=postDic, headers=head, timeout=30,cookies=cookies)
except requests.exceptions.RequestException,e:
raise "Error",e
else:
return r

這是抓取到的一部分源碼:

&項目列表&(共8條記錄!)&& &

&

&課程名稱&&教師姓名&&上課時間&&上課地點&&學分&&周學時&&容量&&已選&&餘量&&選課&&備註&

而我程序返回de結果卻是(返回結果和直接用GET方法取回的結果相同):

&項目列表&(共0條記錄!)&& &

&

&課程名稱&&教師姓名&&上課時間&&上課地點&&學分&&周學時&&容量&&已選&&餘量&&選課&&備註& &

試了很多方法也沒辦法取到正確的值,誰遇到過,幫幫我,謝謝。
更新:
瀏覽器抓到的數據

軟體的數據


看來你們學校教務系統和我們學校教務系統都是用http://ASP.NET開發的。
http://ASP.NET每個頁面的VIEWSTATE是用來保存網頁信息的,通過這些信息可以知道網頁中各控制項的狀態。所以為了能夠不出差錯,最好是從登陸頁面起,每次提交表單的時候都先獲取VIEWSTATE等數據並放進post中,依次進入選課的頁面。這樣就不會出現數據查不到等問題。
我之前用PHP的curl模擬登錄教務系統做過課表和成績等查詢網站,開學前又用winform做過搶課 的軟體。

軟體在我上課的時候在寢室的電腦上自動模擬登錄教務系統並爬出數據並發送數據包搶課。不過我是用C#寫的,樓主是用Python。
我比較疑惑的一點是,搶課的時候網站一般會非常卡,為什麼表單要從網頁中獲取呢?要是程序也打不開教務系統網站了那豈不是白寫了?而且效率也非常低啊,所以我直接把教務系統的數據弄成本地的了:

這樣每次發送數據包時就不用先獲取網頁上的數據並分析了。可能你會說有些課選滿了的時候表單可能會發生改變導致選到的課錯位,但是軟體的目的是搶課不是選課,你用軟體當然比別人快一步,還擔心選不到課?
以上。


一般亂碼問題都是編碼導致的,ASP的網站,和我們學校的一樣,我用java爬取過學校網站,發現 post的內容應該要用UrlEncode編碼(gb2312),這裡可以在線轉換UrlEncode編碼/UrlDecode解碼

另外,我看到你的截圖裡面,通過get和post方法得到的返回數據基本上一樣的,可能是課表內容在另外一個html中顯示,學校教務系統特別喜歡用框架= =
你可以手動用瀏覽器去點擊查看課表,然後分析下發出的每一條請求,應該就能找到,然後在用python去模擬


post出去的數據抓包對比吧
順便說一下,VIEWSTATE是.NET保存狀態數據和控制項信息的,你用一個老的viewstate不合適,最好從開始的頁面登陸保存response的viewstate,然後一步步的最後拿到課表


教務管理系統是需要登陸的,話說你構建的request帶cookie了嗎?
還有一種可能,瀏覽器中返回的課表是js生成的課表,你檢查下打開課表過程中的所有get操作,看看能不能找到課表數據。


推薦閱讀:

Python3.4 用 pip 安裝lxml時出現 「Unable to find vcvarsall.bat 」?
基於python的scrapy爬蟲,關於增量爬取是怎麼處理的?
GitHub 上有什麼值得學習,簡單的,易讀的 Python 項目?
python開發一個項目要怎麼做?
Python 閉包代碼理解?

TAG:Python | 爬蟲計算機網路 | 網頁爬蟲 |