爬取正方教务系统课程表
被一個學長布置下的任務…有些地方可能不夠完整…
思路: 首先你需要完成登錄操作:
(1) 首先根據教務系統網站的審查元素, 發現了一個驗證碼的網址:http://210.40.2.253:8888/(fw5xjvfovnf3f4zg1ikero2a)/CheckCode.aspx
進去后你會發現,這里面的驗證碼是會隨著時間的變化而變化的,那這樣子該怎么辦呢?(果斷百度一波!!)
然后巴拉巴拉… 大概就是說驗證碼的核對是與你的cookies有關的,那么這個東西要怎么獲得呢,
request第三方庫中提供了一個session , 這個就是相當于代碼中的一個瀏覽器,在你請求http的時候會自動幫你保存你的cookies的值,這樣子就可以完成驗證碼的匹配操作了 。
具體一點:
先創建一個session對象
然后向驗證碼頁面發送get請求(這時你的cookies就有了)
然后向教務系統頁面發送post請求(提交賬號密碼驗證碼)
這時,你就登錄成功了(前提是提交的東西要正確= =)
(2) 爬取課程表
登錄進去后,我們繼續我們的審查元素,在其中找到了向課程表頁面發送post請求的地址:
http://210.40.2.253:8888/xskbcx.aspx?xh=1717000113&xm=?����&gnmkdm=N121603
其中 xh 是 學號 , xm 是學生姓名的url編碼 , gnmkdm是課程表頁面的代碼
這些信息是獲得課表頁面的學生信息,會顯示出你是哪里的學生,學號是什么,專業是什么等等之類的
這些東西我們需要想辦法獲得,也就是說,只有得到了這些信息,我們才能方便向課表頁面發送post請求
那么應該怎么獲得?
(1) 先發送一個get請求 http://210.40.2.253:8888/xskbcx.aspx?xh="+ user_name+ "&gnmkdm=N121603
(2) 然后運用bs4庫去提取http網頁中的學生信息(參考代碼)
(3)得到后向課表頁面發送post請求(哪一年第幾學期)
(4) 然后便得到了我們的課程表頁面, 接下來就可以進行信息提取了
其實只要登錄進去了,里面的成績,課表,選課什么的都是可以以一種模擬人的辦法進行操作
import requests from bs4 import BeautifulSoup session = None checkcodePath = './code.png' #驗證碼保存路徑 res = requests.Session() Origin_url = "http://210.40.2.253:8888/(fw5xjvfovnf3f4zg1ikero2a)/" # 教務系統網址 url = "http://210.40.2.253:8888/default2.aspx" checkcodeURL = Origin_url+'CheckCode.aspx' #驗證碼網址 head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0","Connection": "keep-alive", "Referer":"http://210.40.2.253:8888/default2.aspx"} post_data = {"__VIEWSTATE":"dDwtNTE2MjI4MTQ7Oz4I55DQ6KPcVdzTLmjGjlJPRWgYUQ==","Textbox1" : "" ,"txtSecretCode":"","RadioButtonList1":"%D1%A7%C9%FA","Button1":"","lbLanguage":"","hidPdrs":"","hidsc":""} def get_photo(URL):checkcode = res.get(checkcodeURL, headers=head)with open(checkcodePath, 'wb') as fp: #保存驗證碼圖片fp.write(checkcode.content)post_data['txtSecretCode'] = input("請輸入圖片中的驗證碼: (驗證碼圖片保存在同級文件夾)") def login():user_name = input("請輸入您的學號:")user_password = input("請輸入您的密碼:")post_data["txtUserName"] = user_namepost_data["TextBox2"]= user_password login_page_url = Origin_url + "default2.aspx"head['Referer'] = login_page_urlget_photo(url)homePage = res.post(login_page_url, data=post_data, headers=head) #在這里得到了主頁面with open('text1.html','w' , encoding = 'gb2312') as f :f.write(homePage.text)#更改數據#head["Referer"]="http://210.40.2.253:8888/(fw5xjvfovnf3f4zg1ikero2a)/default2.aspx"exit_sys = "what should i do "URL = "http://210.40.2.253:8888/xskbcx.aspx?xh="+ user_name+ "&gnmkdm=N121603"#URL = "http://210.40.2.253:8888/xskbcx.aspx?xh=1717000113&xm=%D6%A3%BC%CE%F3%DE&gnmkdm=N121603head["Referer"]= URLpage_home = res.get(URL , headers = head) post_data["__VIEWSTATE"] = BeautifulSoup(page_home.text, 'html.parser').find_all('input')[2].get('value')#xm = BeautifulSoup(res.get(URL , headers = head).text, 'html.parser').find_all('form')[0].get('action')post_data["__EVENTTARGET"] = "xqd"while exit_sys != "q":query_years = input("請輸入您要查詢課表的年份:(2017-2018)")query_how = input("請輸入您要查詢第幾學期的課表:") #URL = "http://210.40.2.253:8888/" + xm#print(URL)post_data["xnd"]= query_yearspost_data["xqd"]=query_howlearning = res.post(URL , data = post_data , headers = head)print(URL)if query_years == "2018-2019" and query_how == "1" :with open( query_years + '-'+ query_how + '.html' ,'w' , encoding = "gb2312") as f :f.write(page_home.text)else : with open( query_years + '-'+ query_how + '.html' ,'w' , encoding = "gb2312" , errors = "ignore") as f :f.write( learning.text)print("您的課表已經保存為html的形式!")print("按q退出 按c繼續")while 1 :exit_sys = input()if exit_sys == "c" or exit_sys == 'q' :breakelse:print("無效操作!")return learning def class_table(table_html):pass def main():res = login() class_table(res) if __name__ == "__main__":main()總結
以上是生活随笔為你收集整理的爬取正方教务系统课程表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 11款物联网开发平台对比:功能孰优孰劣?
- 下一篇: Microsoft Office 201