1. 程式人生 > >request處理cookie的兩種方法

request處理cookie的兩種方法

       有些http請求後臺介面時,需要加headers,不加會報錯。有些是不需要的。這個要看後臺是怎麼校驗的。可以先發一個不帶hearders的請求測試下,能得到預期的結果就不需要加headers。

       python提供了一個非常強大的第三方庫requests處理http協議。今天講的重點就是如何使用requests處理cookie。cookie使用場景:訪問需要登入才可見的頁面。那如何獲取到cookie?獲取到cookie後又怎麼使用cookie呢?

一、獲取cookie

#匯入requests包
import requests

targetURL = '目標網站地址'

#設定頭UA
headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}

#開啟一個session會話
session = requests.session()

#設定請求頭資訊
session.headers = headers

#申明一個用於儲存手動cookies的字典
manual_cookies={}

##開啟手動設定的cookies檔案
#部分網站需要滑動驗證,這裡通過瀏覽器登入成功後獲取cookies手動存到文字來繞過驗證,後續cookies自動更新
with open("manual_cookies.txt",'r',encoding='utf-8') as frcookie:
    cookies_txt = frcookie.read().strip(';')  #讀取文字內容
    #手動分割新增cookie
    for item in cookies_txt.split(';'):
        name,value=item.strip().split('=',1)  #用=號分割,分割1次
        manual_cookies[name]=value  #為字典cookies新增內容

#將字典轉為CookieJar:
cookiesJar = requests.utils.cookiejar_from_dict(manual_cookies, cookiejar=None,overwrite=True)

#將cookiesJar賦值給會話
session.cookies=cookiesJar

#向目標網站發起請求
res = session.get(targetURL)

#將CookieJar轉為字典:
res_cookies_dic = requests.utils.dict_from_cookiejar(res.cookies)

#將新的cookies資訊更新到手動cookies字典
for k in res_cookies_dic.keys():
    manual_cookies[k] = res_cookies_dic[k]

print(manual_cookies)

#重新將新的cookies資訊寫回文字
res_manual_cookies_txt = ""

#將更新後的cookies寫入到文字
for k in manual_cookies.keys():
    res_manual_cookies_txt += k+"="+manual_cookies[k]+";"

#將新的cookies寫入到文字中更新原來的cookies
with open('manual_cookies.txt',"w",encoding="utf-8") as fwcookie:
    fwcookie.write(res_manual_cookies_txt);

  •        自動獲取,先寫登入方法,等登入成功後從response報文中得到cookie。有些登入很簡單,只需要使用者名稱,密碼就可以。有些登入還有驗證碼,有驗證碼的登陸可以驗證碼自動識別的方式獲取。當然,有驗證碼的登陸,有些也可以直接使用cookie來繞過驗證碼。這種方式就必須熟悉cookie怎麼用。

二 、使用cookie

方法一: 

# cookies是字典格式,這種cookie不能放在headers裡

cookies = {

      name1 :value1,

      name2:value2

}

response = request.post(url, data=data, cookies=cookies)

方法二:使用requests.session, 通過CookieJar來處理cookie。

session = requests.session()

# cookie處理,將字典型別的cookie轉換成cookiejar,由session自動處理cookie,報文請求的時候就不需要再加上cookie了。見上面的例子,已經寫的很詳細了,不需要再寫了

方法三,headers中加cookie。

headers = { 

'User-Agent':'Apache-HttpClient/4.5.2 (Java/1.8.0_66)',

'cookie':'_zap=191e4816-acf0-41ab-85ca-c54c2ff9ca1f; d_c0="ABCsEEAYPQ2PTofKIlzwxMJDdb8R-_6iVQA=|'

}

response = requests.post(url,data=data,headers=headers)