共计 3049 个字符,预计需要花费 8 分钟才能阅读完成。
在上一节中,我们学习了使用 requests 模块发起各种 HTTP 请求的方法。但在实际开发中,我们经常会遇到需要保持登录状态、携带 Cookies 或跨多个请求共享会话的情况。例如:访问一个需要登录的网站时,第一次请求登录接口,后续的请求就要带上登录后的身份信息(即 Cookies)。
本节我们将深入学习如何使用 requests 模块来处理 Cookies 和会话(Session),掌握如何实现“登录后操作”的常见网络编程场景。
一、什么是 Cookies
Cookies 是服务器发送给客户端的一小段数据,通常用来记录用户的登录状态、偏好设置等。当你登录某个网站后,服务器会在响应中返回一组 Cookies,浏览器(或程序)在之后的请求中会自动携带这些 Cookies,以表明“我已经登录”。
Python 的 requests 模块提供了简单的接口来读取、设置和保持 Cookies。
二、查看响应中的 Cookies
我们可以通过 response.cookies 来查看服务器返回的 Cookies。
import requests
response = requests.get("https://httpbin.org/cookies/set?user=python&level=beginner")
print(" 状态码:", response.status_code)
print(" 服务器返回的 Cookies:", response.cookies)
# 将 Cookies 转为字典形式查看内容
print("Cookies 字典:", response.cookies.get_dict())
https://httpbin.org 是一个提供测试 HTTP 请求的站点,方便我们实验。
三、在请求中携带 Cookies
如果我们已经有 Cookies(例如从浏览器中复制下来的),可以在请求时手动添加:
cookies = {"user": "python_learner", "auth": "token123"}
response = requests.get("https://httpbin.org/cookies", cookies=cookies)
print(" 请求的 Cookies:", cookies)
print(" 服务器返回:", response.json())
requests 会自动在请求头中添加 Cookie 字段。
四、使用 Session 对象保持会话
在真实的应用中,我们往往需要跨多个请求保持同一个会话(即自动管理 Cookies)。
这时就需要用到 requests.Session()。
import requests
# 创建 Session 对象
session = requests.Session()
# 第一次请求:设置 Cookie
session.get("https://httpbin.org/cookies/set/sessioncookie/123456")
# 第二次请求:自动携带上次的 Cookie
response = session.get("https://httpbin.org/cookies")
print(" 保持会话后的 Cookies:", response.json())
Session 对象会在多次请求中自动保存和携带 Cookies,非常适合模拟登录。
五、模拟登录场景示例
下面我们模拟一个典型的登录操作过程:
- 向登录接口发送用户名和密码;
- 服务器返回 Cookies 表示登录成功;
- 之后访问用户信息页时自动带上 Cookies。
import requests
login_url = "https://httpbin.org/post"
profile_url = "https://httpbin.org/cookies"
# 创建 Session
session = requests.Session()
# 模拟登录
payload = {"username": "admin", "password": "123456"}
response = session.post(login_url, data=payload)
print(" 登录响应:", response.json())
# 访问需要登录的页面
session.cookies.set("auth_token", "abc123") # 模拟登录后的 cookie
profile_response = session.get(profile_url)
print(" 用户信息页面返回:", profile_response.json())
在实际网站中,这个流程和思路相同,只是登录接口和字段不同。
六、保存与加载 Cookies
有时我们希望将 Cookies 保存下来,下次使用时直接加载。可以用 requests.utils 来处理。
import requests
import pickle
session = requests.Session()
session.get("https://httpbin.org/cookies/set/user/python")
# 保存 Cookies 到文件
with open("cookies.pkl", "wb") as f:
pickle.dump(session.cookies, f)
# 读取 Cookies 并重新加载
new_session = requests.Session()
with open("cookies.pkl", "rb") as f:
new_session.cookies.update(pickle.load(f))
response = new_session.get("https://httpbin.org/cookies")
print(" 重新加载 Cookies 后的结果:", response.json())
这种方法常用于脚本自动化登录,避免重复登录操作。
七、删除 Cookies
如果你需要清除某个 Cookie,可以通过如下方式:
session.cookies.clear(domain=None, path=None, name=None)
也可以指定某个 Cookie 名清除:
session.cookies.clear(name="auth_token")
八、常见问题与调试技巧
- 某些网站的 Cookies 会带有过期时间、路径、HttpOnly 等属性,这些都由服务器控制,客户端无法修改。
- 若请求失败,可以通过
response.history查看是否有重定向;也可打印response.request.headers查看实际发送的请求头。 - 如果网站需要登录令牌(token),除了 Cookies 外,还需在请求头中加入
Authorization。
九、实战练习
- 使用
requests.Session()模拟登录某个公开测试网站(如 https://reqres.in/)。 - 尝试保存 Cookies 并重新加载,实现“免登录访问”。
- 编写一个简单的“登录检测脚本”,在登录过期时自动重新登录。
十、小结
本节内容主要学习了 requests 模块的高级用法——Cookies 与会话保持。
重点掌握以下几点:
response.cookies获取服务器返回的 Cookies;- 通过
cookies参数手动传递 Cookies; - 使用
requests.Session()实现多次请求间的状态保持; - 使用
pickle保存与恢复 Cookies,实现持久化登录。
掌握这些技巧后,你就能编写出更智能、更接近真实浏览器行为的 Python 网络程序。下一节,我们将进入网络爬虫的重要部分——学习如何使用 BeautifulSoup 解析网页内容。