requests中session的用法

正常情況下,我們想打開禪道的“組織”視圖頁面,是需要先在禪道的登錄頁面輸入正確的用戶名和密碼點(diǎn)擊登錄,再切換到“組織”視圖頁面。

如果我們的python代碼這樣寫的話,r1和r2的狀態(tài)碼都是200,但r2.text并不是我們想要的。這是因?yàn)?,r1和r2請求相當(dāng)于在2個(gè)不同的瀏覽器中,發(fā)出的兩個(gè)請求,彼此是獨(dú)立的,那么r2請求就相當(dāng)于是在沒有登錄的情況下發(fā)出的請求。

import requests

paylod = {'account':'admin',
          'password':'e10adc3949ba59abbe56e057f20f883e'}
url01 = 'http://localhost:9000/zentao/user-login.html'
url02 = 'http://localhost:9000/zentao/company-browse.html'
r1 = requests.get(url01,params=paylod)
r2 = requests.post(url02)
print(r1.status_code)
print(r2.status_code)
print(r2.text)

那么如何解決這個(gè)問題呢
1、我們可以創(chuàng)建一個(gè)session對象來存儲(chǔ)請求的缺省值,r2.text可以取到想要的值。

import requests

s=requests.session()
paylod = {'account':'admin','password':'e10adc3949ba59abbe56e057f20f883e'}
url01='http://localhost:9000/zentao/user-login-L3plbnRhby8=.html'
url02='http://localhost:9000/zentao/user-create-0.html'
r1=s.get(url01,params=paylod)
r2=s.post(url02,data=d)
print(r2.text)

2、可以直接加上auth認(rèn)證,那么r2請求也可取到相應(yīng)的值,而不需要登錄。(用戶名:admin,密碼:123456)
import requests
from requests.auth import HTTPBasicAuth

url02 = 'http://39.106.90.48:9000/zentao/company-browse.html'
r2 = requests.post(url02,auth=HTTPBasicAuth('admin','123456'))
print(r2.status_code)
print(r2.text)

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

cookie =http.cookiejar.CookieJar()

handler = urllib.request.HttpCookieProcessor(cookie)

opener = urllib.request.build_opener(handler)

然后該opener里面就保存了cookie,以后無論訪問該網(wǎng)站的那個(gè)網(wǎng)頁都是自動(dòng)的帶上同一個(gè)cookie,此cookie就是你第一次登陸該網(wǎng)站時(shí)的cookie,

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

有驗(yàn)證碼沒有登錄成功,如何在requests session中手動(dòng)設(shè)置cookie.

在使用python requests庫時(shí)遇到一個(gè)問題,就是如何在session中設(shè)置對所有請求都生效的cookie?requests中的session對象一大特性就是它會(huì)自動(dòng)為你管理cookie,當(dāng)你登錄一個(gè)頁面時(shí),它可以自動(dòng)識(shí)別response中的set cookie頭,然后為下面的請求一直維持這個(gè)cookie。不過我在使用的過程中,因?yàn)槟繕?biāo)網(wǎng)站登錄有驗(yàn)證碼,所以打算每次運(yùn)行時(shí)手動(dòng)登錄頁面獲取cookie,然后再把cookie寫到代碼變量中。這里遇到的問題就是當(dāng)在get函數(shù)中傳入cookie變量時(shí),cookie只對當(dāng)前的請求進(jìn)行生效,下一次調(diào)用get還需要再傳入一次cookie,否則發(fā)出去的請求是默認(rèn)不會(huì)帶有cookie的。

如下:

import requests

import time

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

s = requests.session()

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

time.sleep(5)

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

運(yùn)行腳本后,通過抓包發(fā)現(xiàn),第一次get請求的中含有我自定義的cookie,第二次請求中卻沒有。因?yàn)槲乙獙芏鄅ttp接口發(fā)送請求,所以如果在每個(gè)get里面都加入一個(gè)cookie變量的話,寫起來就有些麻煩了。于是google了一下,找到了如下的解決方法:

import requests

import time

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

s = requests.session()

# 手動(dòng)設(shè)置cookie
requests.utils.add_dict_to_cookiejar(x.cookies,{"PHPSESSID":"07et4ol1g7ttb0bnjmbiqjhp43"})

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

time.sleep(5)

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

這樣,通過requests.utils.add_dict_to_cookiejar對session對象設(shè)置cookie,之后所有的請求都會(huì)自動(dòng)加上我自定義的cookie內(nèi)容。

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

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

# session.get()  session.post()

session = requests.session()

使用session發(fā)送post請求獲取cookie保存到本地session中。

以人人網(wǎng)登錄為例。

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

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

s = requests.session()

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

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

使用session請求登錄后的頁面

得到登錄后的網(wǎng)頁內(nèi)容

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

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

單獨(dú)處理cookie字段,處理為字典格式

處理cookie內(nèi)容為字典

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"

字典推導(dǎo)式

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • requests庫的session會(huì)話對象可以跨請求保持某些參數(shù),說白了,就是比如你使用session成功的登錄了...
    朝畫夕拾閱讀 34,161評論 0 13
  • 什么是爬蟲網(wǎng)絡(luò)爬蟲 網(wǎng)絡(luò)爬蟲(又被稱為網(wǎng)頁蜘蛛,網(wǎng)絡(luò)機(jī)器人), 是一種按照一定的規(guī)則,自動(dòng)第抓取萬維網(wǎng)信息的大程序...
    yustyal閱讀 304評論 0 0
  • 什么是Urllib: Urllib是python內(nèi)置的HTTP請求庫 包括以下模塊 urllib.request ...
    啊煙雨閱讀 1,339評論 0 5
  • 爬蟲的基本流程 一、發(fā)送HTTP請求(Request)通過Python庫向目標(biāo)站點(diǎn)發(fā)送HTTP請求,等待服務(wù)器響應(yīng)...
    曉楓_0544閱讀 845評論 0 0
  • HTTP響應(yīng)狀態(tài)碼參考: 1xx:信息 100Continue 服務(wù)器僅接收到部分請求,但是一旦服務(wù)器并沒有拒絕該...
    冬gua閱讀 631評論 0 0

友情鏈接更多精彩內(nèi)容