1. 程式人生 > >Python3爬蟲之模擬登陸

Python3爬蟲之模擬登陸

爬取一些不需要登陸的網址操作已經試過了,這次來用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後就正常了