要将 requests.Session 对象的 cookies 转换为 JSON 格式并保存到文件,以及从文件加载 JSON 并设置回 Session,您需要使用 requests.utils.dict_from_cookiejar 和 requests.utils.cookiejar_from_dict 这两个工具函数。
下面是完整的 Python 示例代码,演示了如何实现这一过程:
1. 保存 Cookies 到 JSON 文件
此过程涉及:
-
从
session.cookies(一个requests.cookies.RequestsCookieJar对象) 中提取数据。 -
使用
requests.utils.dict_from_cookiejar()转换为 Python 字典。 -
将字典写入 JSON 文件。
Python
import requests
import json
import os
def save_cookies_to_json(session: requests.Session, filename: str):
"""
将 requests.Session 中的 cookies 转换为字典并保存为 JSON 文件。
"""
try:
# 1. 将 RequestsCookieJar 转换为标准 Python 字典
cookies_dict = requests.utils.dict_from_cookiejar(session.cookies)
# 2. 写入 JSON 文件
with open(filename, 'w', encoding='utf-8') as f:
json.dump(cookies_dict, f, indent=4)
print(f"✅ Cookies 已成功保存到文件: {filename}")
print(f" 保存的 Cookies 数量: {len(cookies_dict)}")
except Exception as e:
print(f"❌ 保存 Cookies 失败: {e}")
# --- 示例使用 ---
# 1. 创建一个 Session 对象
s = requests.Session()
# 2. 假设我们访问一个网站并获取 cookies
# 这里使用百度作为示例
print("尝试获取 Cookies...")
s.get("https://www.baidu.com/")
# 3. 保存 cookies
output_filename = 'session_cookies.json'
save_cookies_to_json(s, output_filename)
2. 从 JSON 文件加载 Cookies 到 Session
此过程涉及:
-
从 JSON 文件加载数据为 Python 字典。
-
使用
requests.utils.cookiejar_from_dict()将字典转换回RequestsCookieJar对象。 -
将这个
RequestsCookieJar设置给新的或现有的 Session 对象。
Python
import requests
import json
import os
def load_cookies_from_json(session: requests.Session, filename: str):
"""
从 JSON 文件加载 cookies 字典,并将其设置到 requests.Session 中。
"""
if not os.path.exists(filename):
print(f"⚠️ 文件未找到: {filename}。跳过加载。")
return False
try:
# 1. 从 JSON 文件加载字典
with open(filename, 'r', encoding='utf-8') as f:
cookies_dict = json.load(f)
# 2. 将字典转换为 RequestsCookieJar 对象
cookies_jar = requests.utils.cookiejar_from_dict(cookies_dict)
# 3. 将 CookieJar 设置到 Session
session.cookies.update(cookies_jar)
print(f"✅ Cookies 已成功从文件加载并设置到 Session 中。")
print(f" 加载的 Cookies 数量: {len(cookies_dict)}")
return True
except Exception as e:
print(f"❌ 加载 Cookies 失败: {e}")
return False
# --- 示例使用 ---
# 1. 创建一个新的 Session 对象
new_s = requests.Session()
print("\n--- 加载 Cookies ---")
# 2. 加载 cookies
input_filename = 'session_cookies.json'
load_cookies_from_json(new_s, input_filename)
# 3. 验证新 Session 是否包含 cookies
print("\n验证加载后的 Session Cookies:")
for name, value in new_s.cookies.items():
print(f" {name}: {value}")
为什么不直接使用 json.dumps(session.cookies)?
session.cookies 实际上是一个 RequestsCookieJar 对象,它不是一个标准的 Python 字典,不能直接被 json.dumps 序列化。
- 错误示例:
json.dumps(s.cookies)会抛出TypeError: Object of type RequestsCookieJar is not JSON serializable。
因此,必须使用 requests.utils.dict_from_cookiejar 进行中间转换。