一、什麼是Cookie?
Cookie是一種存儲在客戶端的小型數據文件,它通常由Web伺服器發送給客戶端的Web瀏覽器並存儲在本地。Web瀏覽器會在之後的請求中自動發送該Cookie給Web伺服器。Cookie包含了一些關於客戶端和伺服器之間會話的信息,比如登錄憑據、購物車商品、上次訪問時間等等。
二、為什麼要使用Cookie?
HTTP是一種無狀態協議,也就是說它無法記住之前客戶端和伺服器之間的交互。每次HTTP請求都是一個獨立的事件,伺服器無法知道是否是同一個客戶端在發送請求。這時,Cookie就派上了用場。通過在客戶端存儲相關數據,Cookie可以在之後的請求中將這些數據發送給伺服器,這樣伺服器就能夠識別出是同一個客戶端在發送請求。
三、Python中的Cookie庫
Python中有很多HTTP客戶端庫可以用來發送HTTP請求,比如requests、http.client等。不過這些庫並沒有直接提供對Cookie的支持。此時,Python中的http.cookiejar庫就派上了用場。
1、cookiejar庫概述
cookiejar庫是Python標準庫中的一部分,它提供了一個CookieJar類作為基礎類,可以用於管理HTTP cookies。CookieJar是一個抽象類,實際上我們要使用它的子類來管理我們的cookies。
2、cookiejar庫的使用方法
cookiejar庫提供了很多種不同的Cookie管理類,我們可以根據不同的需求選擇不同的類。下面,我們以HTTPCookieProcessor和LWPCookieJar兩個類為例,分別介紹基於內存和硬碟的Cookie存儲方法。
(1)HTTPCookieProcessor
HTTPCookieProcessor用於處理HTTP請求中的Cookies,它的作用是創建一個CookieJar實例,並嵌入一個opener對象中。這樣,在發送HTTP請求時,opener對象就會自動管理CookieJar中的Cookies。
import http.cookiejar
import urllib.request
cookie = http.cookiejar.CookieJar() # 創建CookieJar實例
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie))
response = opener.open("http://www.baidu.com")
for item in cookie:
print(item.name +"="+ item.value)
首先,我們創建了一個cookie實例,然後把它傳給HTTPCookieProcessor,創建了一個支持Cookies的opener對象。然後,我們用opener來發送了一個HTTP請求,並在結果中輸出了CookieJar中的內容。
(2)LWPCookieJar
LWPCookieJar是CookieJar的派生類,它可以將Cookies保存在本地文件中。LWPCookieJar的使用方式與HttpCookieProcessor基本相同。我們只需要把上面的代碼中的CookieJar()替換為LWPCookieJar(filename)即可。
import http.cookiejar
import urllib.request
filename = 'cookies.txt'
cookie = http.cookiejar.LWPCookieJar(filename) # 創建LWPCookieJar實例
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open("http://www.baidu.com")
# 保存CookieJar到文件
cookie.save(ignore_discard=True, ignore_expires=True)
# 從文件中讀取CookieJar
cookie.load(filename=filename, ignore_discard=True)
for item in cookie:
print(item.name +"="+ item.value)
這段代碼與上一個示例代碼的唯一區別在於我們創建了一個LWPCookieJar實例,並將文件名傳遞給它。在使用完畢後,我們可以將CookieJar保存到文件中,並在下一次使用時從文件中讀取CookieJar。
四、如何在請求中發送Cookies
當我們使用CookieJar來管理cookies時,我們的代碼會非常簡潔。不過,在發起HTTP請求的時候,我們有時需要手動添加一些額外的cookies。這時,我們可以使用urllib庫或requests庫來發送HTTP請求,並在請求中添加cookies信息。
1、使用urllib發送Cookies
在使用urllib庫發送HTTP請求時,我們可以用urllib.request.Request類來創建請求對象,並通過add_header()方法來添加HTTP header信息,例如cookies。
import http.cookiejar
import urllib.request
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
# 添加cookies信息
req = urllib.request.Request("http://www.baidu.com")
req.add_header("Cookie", "key=value")
response = opener.open(req)
for item in cookie:
print(item.name +"="+ item.value)
這裡,我們創建了一個請求對象req,並使用add_header()方法添加了一條Cookie記錄。
2、使用requests發送Cookies
requests庫相對於urllib庫更加Pythonic和易用,同樣也可以發送HTTP請求並添加cookies。
import requests
# 添加cookies信息
cookies = {"key": "value"}
response = requests.get("http://www.baidu.com", cookies=cookies)
for item in response.cookies:
print(item.name +"="+ item.value)
這裡,我們創建了一個cookies字典,並將其傳遞給requests.get()方法。在得到response對象後,我們可以使用response.cookies屬性來獲取響應中的cookies。
五、總結
本文圍繞cookies展開,從「What is Cookie」開始,逐步介紹了Python中的http.cookiejar庫,在講解完畢影響Cookie的那些因素後,拿出HTTPCookieProcessor和LWPCookieJar分別對只存在內存和硬碟上的Cookie進行了操作。最後,並舉例介紹了如何發送Cookie信息。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/153861.html