python requests模塊session的使用建議及整個會話中的全部cookie的方法

話很少說,直接上代碼python

測試代碼

服務端

下面是用flask作的一個服務端,用來設置cookie以及打印請求時的請求頭flask

# -*- coding: utf-8 -*-
from flask import Flask, make_response, request

app = Flask(__name__)


@app.route('/a1')
def a1():
    print(request.headers)
    rp = make_response()
    rp.set_cookie('a1', '123')
    return rp


@app.route('/a2')
def a2():
    print(request.headers)
    rp = make_response()
    # rp.set_cookie('a2', '234')
    return rp


@app.route('/a3')
def a3():
    print(request.headers)
    rp = make_response()
    rp.set_cookie('a3', '345')
    return rp


if __name__ == '__main__':
    app.run(host='0.0.0.0')

客戶端

# -*- coding: utf-8 -*-

import requests

url1 = 'http://192.168.2.159:5000/a1'
url2 = 'http://192.168.2.159:5000/a2'
url3 = 'http://192.168.2.159:5000/a3'

cookies = requests.utils.cookiejar_from_dict({'test': 'test'})
print(type(cookies), cookies)  # RequestsCookieJar 對象
s = requests.session()
s.cookies = cookies    # 這裏設置的cookie test=test 是全部請求中都會附帶的
s.headers = {'h1':'h1'} #  這裏設置的請求頭h1=h1是全部請求中都會附帶的
r1 = s.get(url1, cookies={'r1': 'r1'},headers={'h2':'h2'})  # 臨時加上cookie r1=r1 和 header h2=h2 下一個請求中不會有此 cookie  和header
r2 = s.get(url2)
requests.utils.add_dict_to_cookiejar(s.cookies, {'xx': 'xx'})  # 在接下來的請求中,永久添加xx cookie

r3 = s.get(url3)

# r1.cookies 是一個RequestsCookieJar對象,可使用  requests.utils.dict_from_cookiejar(r1.cookies) 將其轉換成dict
# 我發現能夠直接用dict進行轉換,這樣寫起來更方便  
print(dict(r1.cookies))  # 打印r1請求的返回結果中設置的cookies
print(dict(r2.cookies))  # 打印r2請求的返回結果中設置的cookies
print(dict(r3.cookies))  # 打印r3請求的返回結果中設置的cookies

print(dict(s.cookies))  # s.cookies中包含整個會話請求中的全部cookie(臨時添加的如上面的r1不包含在內)

先啓動服務端,再啓動客戶端瀏覽器

運行結果

服務端打印結果

192.168.2.159 - - [26/Jun/2019 17:28:00] "GET /a1 HTTP/1.1" 200 -
Host: 192.168.2.159:5000
Accept-Encoding: identity
H1: h1
H2: h2
Cookie: test=test; r1=r1


192.168.2.159 - - [26/Jun/2019 17:28:00] "GET /a2 HTTP/1.1" 200 -
Host: 192.168.2.159:5000
Accept-Encoding: identity
H1: h1
Cookie: test=test; a1=123


192.168.2.159 - - [26/Jun/2019 17:28:00] "GET /a3 HTTP/1.1" 200 -
Host: 192.168.2.159:5000
Accept-Encoding: identity
H1: h1
Cookie: test=test; xx=xx; a1=123

客戶端打印結果

<class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie test=test for />]>
{'a1': '123'}
{}
{'a3': '345'}
{'test': 'test', 'xx': 'xx', 'a1': '123', 'a3': '345'}

總結及使用建議

  • 經過服務端打印能夠看出,若是咱們不設置User-Agent, requests模塊的請求頭是python-requests/2.21.0,這不是正常瀏覽器的請求頭,這也是爲何咱們作爬蟲時必定要修改請求頭的一個緣由cookie

  • 使用requests.session()能夠幫助咱們保存這個會話過程當中的全部cookie,能夠省去咱們本身獲取上一個請求的cookie,而後更新cookie後從新設置再進行請求這類操做session

  • 經過s.cookies 和s.headers設置的整個會話中都會攜帶的cookie和headerapp

  • 經過s.get(url1, cookies={'r1': 'r1'},headers={'h2':'h2'}) 這種形式設置的cookie和header 不會覆蓋s.cookies和s.headers中設置的請求頭和cookie,只是在這次請求中添加此cookie和header,下個請求中不會攜帶這裏的r1和h2ide

  • requests.utils.add_dict_to_cookiejar(s.cookies, {'xx': 'xx'}) 能夠給s設置固定cookie: xx ,這種設置的cookie 不是臨時的,後面的請求中都會攜帶測試

  • r1.cookies 的結果是RequestsCookieJar對象,能夠經過dict對其轉換,獲得一個dict,其內容是r1請求響應頭中設置的cookie,若是當前請求沒有被設置新cookie,則dict後的是一個空字典url

  • s.cookies 的結果是整個會話過程(經過s發送的全部請求的過程)被設置的cookie,全部經過dict(s.cookies) 能夠獲得全部被設置cookiecode

  • 建議咱們再使用的過程當中,把公共部分提早設置好,好比headers,cookies,proxies

  • 最近使用發現,若是整個過程當中某些cookie被屢次設置,直接使用dict強轉會失敗,最穩妥的辦法,仍是使用requests.utils.dict_from_cookiejar(s.cookies)來獲得字典類型的cookies

相關文章
相關標籤/搜索