Python3爬蟲之模擬登陸
阿新 • • 發佈:2018-12-16
爬取一些不需要登陸的網址操作已經試過了,這次來用Python嘗試需要登陸的網址,來利用cookie模擬登陸
我用的是火狐瀏覽器自帶的F12開發者工具,開啟網址輸入賬號,密碼,登陸,如圖
可以看到捕捉到很多post和get請求,第一個post請求就是我們提交賬號和密碼的,
點選post請求的引數選項可以看到我們提交的引數在bian表單資料裡,name為賬戶名,pass為加密後的密碼,remember為是否記住密碼,0為不記住密碼。
我們再來看看headers,即訊息頭
我們把這些請求頭加到post請求的headers後對網頁進行模擬登陸,
Cookie為必填項,否則會報錯:
{"code":403,"message":"訪問超時,請重試,多次出現此提示請聯絡QQ:1409765583","data":[]}
便可以建立一個帶有cookie的opener,在第一次訪問登入的URL時,將登入後的cookie儲存下來,然後利用帶有這個cookie的opener來訪問其他網址,檢視登入之後才能看到的資訊。
import urllib from urllib import request from http import cookiejar login_url = "https://www.saikr.com/login" postdata ={ "name": "your account","pass": "your password(加密後)" } header = { "Accept":"application/json, text/javascript, */*; q=0.01", "Accept-Language":"zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", "Connection":"keep-alive", "Host":"www.saikr.com", "Referer":"https://www.saikr.com/login", "Cookie":"your cookie", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "TE":"Trailers","X-Requested-With":"XMLHttpRequest" } postdata = urllib.parse.urlencode(postdata).encode('utf8') #req = requests.post(url,postdata,header) #宣告一個CookieJar物件例項來儲存cookie cookie = cookiejar.CookieJar() #利用urllib.request庫的HTTPCookieProcessor物件來建立cookie處理器,也就CookieHandler cookie_support = request.HTTPCookieProcessor(cookie) #通過CookieHandler建立opener opener = request.build_opener(cookie_support) #建立Request物件 date_url="https://www.saikr.com/" req1 = request.Request(url=login_url, data=postdata, headers=header)#post請求 req2 = request.Request(url=date_url)#利用構造的opener不需要cookie即可登陸,get請求 response1 = opener.open(req1) response2 = opener.open(req2) print(response1.read().decode('utf8')) print(response2.read().decode('utf8'))
ps:有點小插曲,當在headers里加入
Accept-Encoding |
gzip, deflate, br |
時,最後在 print(response1.read().decode('utf8'))時便會報錯
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
原因:在請求header中設定了'Accept-Encoding': 'gzip, deflate'
參考連結:https://www.cnblogs.com/chyu/p/4558782.html
解決方法:去掉Accept-Encoding後就正常了