Cookiejar 庫處理 cookie 儲存回話視窗的登陸狀態
阿新 • • 發佈:2018-11-25
- 像什麼知乎,酷狗,拉鉤這些大網站,模擬登陸有點複雜,所以還是學校的教務系統最友好
目錄
import urllib.request import urllib.parse url = 'http://es.bnuz.edu.cn:8080/login.do' post_data = urllib.parse.urlencode({ 'tssName' : 'userid', 'tssPassword' : 'password' }).encode('utf-8') #使用 urlencode 編碼處理後,在設定成 utf-8 編碼 req = urllib.request.Request(url,post_data) #構建 Request 請求物件 #新增請求頭 req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWeb\ Kit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36') data = urllib.request.urlopen(req).read() #登入並爬取對應網頁 html 程式碼 #將 html 程式碼寫入檔案 file = open('1.html','wb') file.write(data) file.close()
- 在登陸頁面輸入使用者和密碼那裡右鍵檢查元素,可以看到他們對應的 name 屬性的值;這裡分別是
tssName 與 tssPassword,所以表單裡面是它們
- 要獲取真實的登陸地址,按 F12 調出對應的除錯介面,輸入使用者名稱與密碼登陸,觀察除錯介面,可以看到很多網址,
這些網址大多使用了 GET 方法,有一個使用的是 POST 方法,與之對應的就是 POST 表單的真實網址
- 執行後,開啟第一個是登陸狀態,開啟第二個仍然需要我們登陸
因為在這裡沒有設定 cookie 處理,而 HTTP 協議是一個無狀態協議,訪問了新網頁自然回話資訊就消失了
2.Cookie 處理:
import urllib.request import urllib.parse import http.cookiejar url = 'http://es.bnuz.edu.cn:8080/login.do' post_data = urllib.parse.urlencode({ 'tssName' : 'userid', 'tssPassword' : 'password'}).encode('utf-8') #使用 urlencode 編碼處理後,在設定成 utf-8 編碼 req = urllib.request.Request(url,post_data) #構建 Request 請求物件 #新增請求頭 req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWeb\ Kit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36') data = urllib.request.urlopen(req).read() #登入並爬取對應網頁 html 程式碼 #使用 http.cookiejar.Cookiejar.CookieJar() 建立 CookieJar 物件 cjar = http.cookiejar.CookieJar() #使用 HTTPCookieProcessor 建立 cookie 處理器,並以其為引數構造 opener 物件 opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar)) #將 opener 安裝為全域性 urllib.request.install_opener(opener) file = opener.open(req) data = file.read() file = open('3.html','wb') file.write(data) file.close() url1 = 'http://es.bnuz.edu.cn:8080/xiangmuStudent.do?method=goList' data1 = urllib.request.urlopen(req).read() #登入並爬取對應網頁 html 程式碼 #將 html 程式碼寫入檔案 file = open('4.html','wb') file.write(data1) file.close()