Cookies的使用——從cookiejar說起

一、什麼是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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-15 03:24
下一篇 2024-11-15 03:24

相關推薦

發表回復

登錄後才能評論