Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
{'name': 'value'},简单但无法设置属性requests.cookies.RequestsCookieJar,完整支持Cookie属性http.cookiejar.Cookie,标准库Cookie对象使用Session对象可以自动处理Cookie的发送和接收,简化Cookie管理。
import requests
# 不使用Session,需要手动管理Cookie
cookies = {}
# 第一次请求:获取Cookie
response1 = requests.get(
'https://httpbin.org/cookies/set/session/abc123'
)
# 手动保存Cookie
for cookie in response1.cookies:
cookies[cookie.name] = cookie.value
# 第二次请求:手动携带Cookie
response2 = requests.get(
'https://httpbin.org/cookies',
cookies=cookies
)
print(f"第一次请求状态码: {response1.status_code}")
print(f"第二次请求状态码: {response2.status_code}")
print(f"手动管理的Cookie: {cookies}")
import requests
# 使用Session,自动管理Cookie
session = requests.Session()
# 第一次请求:自动保存Cookie
response1 = session.get(
'https://httpbin.org/cookies/set/session/abc123'
)
# 第二次请求:自动携带Cookie
response2 = session.get('https://httpbin.org/cookies')
print(f"第一次请求状态码: {response1.status_code}")
print(f"第二次请求状态码: {response2.status_code}")
# 查看Session中的Cookie
print(f"Session中的Cookie数量: {len(session.cookies)}")
for cookie in session.cookies:
print(f" {cookie.name}: {cookie.value}")
将Cookie保存到文件或数据库,以便在不同运行会话之间保持登录状态。
import pickle
import requests
from requests.cookies import RequestsCookieJar
def save_cookies_to_file(cookie_jar, filename):
"""保存CookieJar到文件"""
with open(filename, 'wb') as f:
pickle.dump(cookie_jar, f)
print(f"Cookie已保存到 {filename}")
def load_cookies_from_file(filename):
"""从文件加载CookieJar"""
try:
with open(filename, 'rb') as f:
cookie_jar = pickle.load(f)
print(f"Cookie已从 {filename} 加载")
return cookie_jar
except FileNotFoundError:
print(f"文件 {filename} 不存在,返回空的CookieJar")
return RequestsCookieJar()
# 使用示例
session = requests.Session()
# 获取一些Cookie
session.get('https://httpbin.org/cookies/set/test_cookie/persisted_value')
# 保存Cookie
save_cookies_to_file(session.cookies, 'cookies.pkl')
# 新会话中加载
new_session = requests.Session()
new_session.cookies = load_cookies_from_file('cookies.pkl')
# 验证加载的Cookie
response = new_session.get('https://httpbin.org/cookies')
if response.status_code == 200:
data = response.json()
print(f"加载的Cookie: {data.get('cookies', {})}")
import json
import requests
from requests.cookies import RequestsCookieJar
from http.cookiejar import Cookie
class JSONCookieStorage:
"""JSON格式的Cookie存储"""
@staticmethod
def save(cookie_jar, filename):
"""保存CookieJar为JSON"""
cookies_data = []
for cookie in cookie_jar:
cookie_dict = {
'name': cookie.name,
'value': cookie.value,
'domain': cookie.domain,
'path': cookie.path,
'expires': cookie.expires,
'secure': cookie.secure,
'rest': cookie.rest
}
cookies_data.append(cookie_dict)
with open(filename, 'w', encoding='utf-8') as f:
json.dump(cookies_data, f, indent=2, ensure_ascii=False)
print(f"Cookie已保存为JSON到 {filename}")
@staticmethod
def load(filename):
"""从JSON加载CookieJar"""
jar = RequestsCookieJar()
try:
with open(filename, 'r', encoding='utf-8') as f:
cookies_data = json.load(f)
for cookie_dict in cookies_data:
cookie = Cookie(
version=0,
name=cookie_dict['name'],
value=cookie_dict['value'],
port=None,
port_specified=False,
domain=cookie_dict['domain'],
domain_specified=bool(cookie_dict['domain']),
domain_initial_dot=cookie_dict['domain'].startswith('.') if cookie_dict['domain'] else False,
path=cookie_dict['path'],
path_specified=bool(cookie_dict['path']),
secure=cookie_dict['secure'],
expires=cookie_dict['expires'],
discard=False,
comment=None,
comment_url=None,
rest=cookie_dict.get('rest', {}),
rfc2109=False
)
jar.set_cookie(cookie)
print(f"Cookie已从JSON文件 {filename} 加载")
except FileNotFoundError:
print(f"文件 {filename} 不存在")
return jar
Cookie安全对于保护用户会话和敏感信息至关重要。
本章详细介绍了Requests库中Cookie的发送与管理:
最佳实践建议: