requests session的作用

requests庫的session會話對象可以跨請求保持某些參數,說白了,就是比如你使用session成功的登錄了某個網站,則在再次使用該session對象求求該網站的其他網頁都會默認使用該session之前使用的cookie等參數,類似于以下urllib庫的使用:

cookie =http.cookiejar.CookieJar()

handler = urllib.request.HttpCookieProcessor(cookie)

opener = urllib.request.build_opener(handler)

然后該opener里面就保存了cookie,以后無論訪問該網站的那個網頁都是自動的帶上同一個cookie,此cookie就是你第一次登陸該網站時的cookie,

opener(url)---url可以使該網站的任意網頁,這就是跨請求的意思,請求不同的網站就是跨請求攜帶同樣的cokkie等參數.


如何在requests session中手動設置cookie????

在使用python requests庫時遇到一個問題,就是如何在session中設置對所有請求都生效的cookie?requests中的session對象一大特性就是它會自動為你管理cookie,當你登錄一個頁面時,它可以自動識別response中的set cookie頭,然后為下面的請求一直維持這個cookie。不過我在使用的過程中,因為目標網站登錄有驗證碼,所以打算每次運行時手動登錄頁面獲取cookie,然后再把cookie寫到代碼變量中。這里遇到的問題就是當在get函數中傳入cookie變量時,cookie只對當前的請求進行生效,下一次調用get還需要再傳入一次cookie,否則發出去的請求是默認不會帶有cookie的。

如下:

import requests

import time

mycookie = { "PHPSESSID":"56v9clgo1kdfo3q5q8ck0aaaaa" }

x = requests.session()

x.get("http://127.0.0.1:80",cookies = mycookie)

time.sleep(5)

x.get("http://127.0.0.1:80"

運行腳本后,通過抓包發現,第一次get請求的中含有我自定義的cookie,第二次請求中卻沒有。因為我要對很多http接口發送請求,所以如果在每個get里面都加入一個cookie變量的話,寫起來就有些麻煩了。于是google了一下,找到了如下的解決方法:

import requests

import time

mycookie = { "PHPSESSID":"56v9clgo1kdfo3q5q8ck0aaaaa" }

x = requests.session()

requests.utils.add_dict_to_cookiejar(x.cookies,{"PHPSESSID":"07et4ol1g7ttb0bnjmbiqjhp43"})

x.get("http://127.0.0.1:80",cookies = mycookie)

time.sleep(5)

x.get("http://127.0.0.1:80")

這樣,通過requests.utils.add_dict_to_cookiejar對session對象設置cookie,之后所有的請求都會自動加上我自定義的cookie內容。

也可以通過requests.utils.cookiejar_from_dict 先生成一個cookiejar對象,時候在賦值給session.cookies。貌似還可以使用session.cookies.set()或者update()。


# session()中方法和requests()中一樣

# session.get()? session.post()

session = requests.session()

# 使用session發送post請求獲取cookie保存到本地session中。

# 以人人網登錄為例。

post_url = "http://www.renren.com/PLogin.do"

headers = {"User-Agent": "Mozilla/5.0"}

session = requests.session()

post_data = {"email": "username", "password": "password"}

session.post(post_url, headers=headers, data=post_data)

# 使用session請求登錄后的頁面

# 得到登錄后的網頁內容

url = "http://www.renren.com/xxxxx/profile"

response = session.get(url, headers=headers)

單獨處理cookie字段,處理為字典格式

# 處理cookie內容為字典

cookie = "SINAGLOBAL=821034395211.0111.1522571861723; wb_cmtLike_1850586643=1; un=tyz950829@sina.com; wb_timefeed_1850586643=1; UOR=,,login.sina.com.cn; wvr=6; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WWsNeq71O_sXkkXNnXFHgOW5JpX5KMhUgL.Fo2RSK5f1hqcShe2dJLoI0qLxK-L12qLB-zLxKqL1hnL1K2LxK-LBo5L12qLxKqL1hML1KzLxKnL1K.LB-zLxK-L1K-LBKqt; YF-V5-G0=c99031715427fe982b79bf287ae448f6; ALF=1556795806; SSOLoginState=1525259808; SCF=AqTMLFzIuDI5ZEtJyAEXb31pv1hhUdGUCp2GoKYvOW0LQTInAItM-ENbxHRAnnRUIq_MR9afV8hMc7c-yVn2jI0.; SUB=_2A2537e5wDeRhGedG7lIU-CjKzz-IHXVUm1i4rDV8PUNbmtBeLVrskW9NUT1fPIUQGDKLrepaNzTEZxZHOstjoLOu; SUHB=0IIUWsCH8go6vb; _s_tentry=-; Apache=921830614666.5322.1525261512883; ULV=1525261512916:139:10:27:921830614666.5322.1525261512883:1525239937212; YF-Page-G0=b5853766541bcc934acef7f6116c26d1"

cookie_dict = {i.split("=")[0]: i.split("=")[1] for i in cookie.split("; ")}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容