可以參考Github:模擬登錄一些知名的網(wǎng)站,為了方便爬取需要登錄的網(wǎng)站
進(jìn)入學(xué)生管理系統(tǒng)的登錄頁面后抬伺,筆者用的是谷歌瀏覽器穆律,按F12啟動(dòng)開發(fā)者模式,勾選Preserve log滋早,原因是Mysise有重定向機(jī)制,過程中的POST請求會(huì)被重定向砌们,不勾選會(huì)看不到POST請求
Network標(biāo)簽是顯示捕獲到的信息項(xiàng)
登錄后捕獲到一個(gè)POST請求杆麸,該請求用于提交用戶名和密碼(用于登錄的真實(shí)請求地址)
接下來用Python模擬登錄需要準(zhǔn)備三樣信息,第一樣是請求地址浪感,在General中可以看到Request URL:? http://class.sise.com.cn:7001/sise/login_check_login.jsp
第二樣是請求頭昔头,Request Headers(包含各種屬性),第三樣是POST請求提交的表單(攜帶 用戶名和密碼等信息)
其中表單中有5個(gè)參數(shù)影兽,第一個(gè)b74ecf92e26768c545bd2fac91220e5a:77d26418c74a62efa70938589ecb0ab9? 是瀏覽器生成的揭斧,不同電腦登錄會(huì)產(chǎn)生不同參數(shù),是一個(gè)32長度的隨機(jī)碼峻堰,該隨機(jī)碼用于驗(yàn)證是否允許登錄讹开,random和token可以不需要也能模擬登錄成功,接下來的兩個(gè)就是用戶名和密碼了
所以我們第一件事要做的是獲取隨機(jī)碼茧妒,構(gòu)建完整的登錄表單萧吠,在獲取隨機(jī)碼前先講一下cookie
什么是cookie:
當(dāng)用戶通過瀏覽器首次訪問一個(gè)域名時(shí),訪問的Web服務(wù)器會(huì)給客戶端發(fā)送數(shù)據(jù)桐筏,以保持Web服務(wù)器與客戶端之間的狀態(tài)纸型,這些數(shù)據(jù)就是Cookie。
它是站點(diǎn)創(chuàng)建的梅忌,為了辨別用戶身份而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)狰腌,其中的信息一般都是經(jīng)過加密的,存在緩存或硬盤中牧氮,在硬盤中是一些小文本文件琼腔。
當(dāng)訪問該網(wǎng)站時(shí),就會(huì)讀取對(duì)應(yīng)網(wǎng)站的Cookie信息踱葛。
作用:記錄不同用戶的訪問狀態(tài)丹莲。
構(gòu)建支持cookie的opener對(duì)象
import urllib,urllib2
import cookielib
#設(shè)置cookie
c = cookielib.LWPCookieJar()
#設(shè)置cookie處理器
cookie = urllib2.HTTPCookieProcessor(c)
#設(shè)置登錄時(shí)用到的opener光坝,它的open方法相當(dāng)于urllib2.urlopen(不過是帶cookie的 urllib2.urlopen )
opener = urllib2.build_opener(cookie,urllib2.HTTPHandler)
#安裝不同的opener對(duì)象作為urlopen()使用的全局opener。
urllib2.install_opener(opener)
準(zhǔn)備三樣信息
#請求地址
path="http://class.sise.com.cn:7001/sise/login_check_login.jsp"
#表單? ? [?username?]? [?password?]填寫具體的信息? ? 或者可以寫成函數(shù)甥材,通過傳參進(jìn)行構(gòu)建? ?需要用字典的格式來構(gòu)建表單
data={
'username':'[ username ]',
'password':'[ password ]',
}
#瀏覽器請求頭? 作用:偽裝瀏覽器訪問? 也需要用字典的格式構(gòu)建
headers={
'Host': 'class.sise.com.cn:7001',
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
'Referer': 'http://class.sise.com.cn:7001/sise/',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8'
}
下面開始獲取隨機(jī)碼盯另,需要利用opener對(duì)象中的open函數(shù)打開登錄頁面??http://class.sise.com.cn:7001/sise/
hidden_html = opener.open('http://class.sise.com.cn:7001/sise/').read()
#利用字符串查找和字符串索引提取關(guān)鍵字
hidden_html = hidden_html[hidden_html.find('<input type="hidden"')+len('<input type="hidden"'):]
name = hidden_html[hidden_html.find('name="')+len('name="'):hidden_html.find('name="')+len('name="')+32]
value = hidden_html[hidden_html.find('value="')+len('value="'):hidden_html.find('value="')+len('value="')+32]
#提取后加入data表單
data[name]=value
最后開始登錄
#建立了一個(gè)Request對(duì)象來明確指明想要獲取的url
req = urllib2.Request(path)
#加入瀏覽器請求頭信息
req.headers = headers
# 對(duì)表單字典進(jìn)行數(shù)據(jù)編碼
data = urllib.urlencode(data)
html = urllib2.urlopen(req, data=data)
查看html的內(nèi)容可以看出是否登錄成功
print html.read()
成功登錄輸出信息: <script>top.location.href='/sise/index.jsp'</script>
按下F12,正常訪問課表頁面洲赵,瀏覽器捕獲到訪問課表的真實(shí)地址
html_class = opener.open('http://class.sise.com.cn:7001/sise/module/student_schedular/student_schedular.jsp').read() #獲取課表頁面
print html_class
具體課程信息提取看各位自由發(fā)揮