request處理cookie的兩種方法
有些http請求後臺介面時,需要加headers,不加會報錯。有些是不需要的。這個要看後臺是怎麼校驗的。可以先發一個不帶hearders的請求測試下,能得到預期的結果就不需要加headers。
python提供了一個非常強大的第三方庫requests處理http協議。今天講的重點就是如何使用requests處理cookie。cookie使用場景:訪問需要登入才可見的頁面。那如何獲取到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)