pin_drop当前位置:知识文库 ❯ 图文
requests Cookie处理教程 - 发送接收会话管理详解
目录
一、Cookie处理概述
Cookie是服务器发送到客户端并存储在本地的小段数据,用于在后续请求中标识用户身份和状态。requests库提供了灵活的Cookie处理机制:可以通过cookies参数发送Cookie,通过response.cookies获取服务器设置的Cookie,通过Session自动管理Cookie生命周期。
在Web爬虫、登录态保持和API测试中,Cookie管理是核心技能。理解Cookie的传递机制和生命周期管理,对于模拟真实用户行为至关重要。
二、Cookie语法与参数
requests提供多种方式处理Cookie,从简单的字典传参到精细的CookieJar控制。
代码示例
# 发送Cookie
requests.get(url, cookies=dict)
# 获取响应Cookie
response.cookies
# Session自动管理Cookie
session = requests.Session()
session.cookies
参数说明
RequestsCookieJar常用方法
三、发送和接收Cookie
最基本的Cookie操作是通过cookies参数发送Cookie到服务器,以及从响应中获取服务器设置的Cookie。
代码示例
import requests
# 发送Cookie
cookies = {'session_id': 'abc123', 'user_pref': 'dark_mode'}
response = requests.get('https://httpbin.org/cookies', cookies=cookies)
print(f"服务器收到Cookie: {response.json()['cookies']}")
# 获取服务器设置的Cookie
response2 = requests.get('https://httpbin.org/cookies/set?token=xyz789&theme=light')
print(f"服务器设置Cookie: {dict(response2.cookies)}")
输出结果:
代码示例
服务器收到Cookie: {'session_id': 'abc123', 'user_pref': 'dark_mode'}
服务器设置Cookie: {'token': 'xyz789', 'theme': 'light'}
四、Session自动管理Cookie
当需要跨请求保持Cookie时,必须使用Session对象。Session会自动维护CookieJar,在后续请求中自动携带之前服务器设置的Cookie。
代码示例
import requests
session = requests.Session()
# 第一步:服务器设置Cookie
session.get('https://httpbin.org/cookies/set?login=true&user_id=10086')
print(f"登录后Cookie: {dict(session.cookies)}")
# 第二步:后续请求自动携带Cookie
response = session.get('https://httpbin.org/cookies')
print(f"自动携带Cookie: {response.json()['cookies']}")
# 第三步:手动添加Cookie
session.cookies.set('custom_token', 'my_token_value')
response2 = session.get('https://httpbin.org/cookies')
print(f"添加自定义Cookie后: {response2.json()['cookies']}")
# 清除Cookie
session.cookies.clear()
response3 = session.get('https://httpbin.org/cookies')
print(f"清除Cookie后: {response3.json()['cookies']}")
session.close()
输出结果:
代码示例
登录后Cookie: {'login': 'true', 'user_id': '10086'}
自动携带Cookie: {'login': 'true', 'user_id': '10086'}
添加自定义Cookie后: {'login': 'true', 'user_id': '10086', 'custom_token': 'my_token_value'}
清除Cookie后: {}
五、Cookie与CookieJar互转
RequestsCookieJar支持设置Cookie的domain、path等属性,比普通字典更加灵活。在某些场景下需要在字典和CookieJar之间进行转换。
代码示例
import requests
from http.cookiejar import CookieJar
# 字典转CookieJar
jar = requests.cookies.RequestsCookieJar()
jar.set('cookie_a', 'value_a', domain='httpbin.org', path='/')
jar.set('cookie_b', 'value_b', domain='httpbin.org', path='/')
response = requests.get('https://httpbin.org/cookies', cookies=jar)
print(f"CookieJar发送: {response.json()['cookies']}")
# CookieJar转字典
cookie_dict = dict(jar)
print(f"转为字典: {cookie_dict}")
# 遍历CookieJar
print("遍历Cookie:")
for name, value in jar.items():
print(f" {name} = {value}")
输出结果:
代码示例
CookieJar发送: {'cookie_a': 'value_a', 'cookie_b': 'value_b'}
转为字典: {'cookie_a': 'value_a', 'cookie_b': 'value_b'}
遍历Cookie:
cookie_a = value_a
cookie_b = value_b
六、Cookie应用场景
-
模拟登录:模拟登录后保持会话,Session自动管理登录Cookie
-
爬虫绕过验证:携带Cookie绕过登录验证,访问需要认证的页面
-
API测试:验证服务器是否正确设置和读取Cookie
安全提示:直接使用requests.get()的cookies参数发送Cookie,不会自动保持服务端返回的Cookie。需要跨请求保持Cookie时,必须使用Session对象。Cookie中可能包含敏感信息(如session_id),需注意安全存储和传输。
七、Cookie管理方式对比
八、常见问题
为什么使用cookies参数发送的Cookie不会自动保存?
requests.get(url, cookies=dict)只在当前请求中发送Cookie,不会维护Cookie状态。需要跨请求保持Cookie时,必须使用Session对象。
如何查看Session中当前保存的所有Cookie?
使用dict(session.cookies)可以将Session的CookieJar转换为字典查看,或使用session.cookies.items()遍历。
如何删除Session中的某个特定Cookie?
使用session.cookies.clear()清除所有Cookie,或者使用session.cookies.set(name, None)将特定Cookie设为空值来删除。
Cookie的domain和path属性有什么作用?
domain属性指定Cookie作用域,只有访问匹配的域名时才会发送;path属性指定Cookie的URL路径限制。通过CookieJar的set方法可以精确设置这两个属性,实现更细粒度的Cookie控制。
本文涉及AI创作
内容由AI创作,请仔细甄别