前言 在通过 requests 库实现模拟请求类项目时,免不了要对请求过程中的 Cookie 进行处理。
花了点时间,整理了一下平时开发中常用到的 requests 操作 cookies 的方法。
实现 Python中操作 Cookie ,常用的方法主要有:
cookiejar_from_dict
dict_from_cookiejar
add_dict_to_cookiejar
cookiejar_from_dict requests.utils.cookiejar_from_dict 方法可以将一个字典转换成cookiejar 对象并添加到当前 session 的 cookies 中:
1 2 3 4 import requestssession=requests.Session() session.cookies=requests.utils.cookiejar_from_dict(cook1)
dict_from_cookiejar requests.utils.dict_from_cookiejar 方法可以将 cookiejar 对象转换成一个dict对象:
1 cook_dict=requests.utils.dict_from_cookiejar(s.cookies)
add_dict_to_cookiejar requests.utils.add_dict_to_cookiejar 方法可以为当前的 cookies 添加新的cookie :
1 requests.utils.add_dict_to_cookiejar(session.cookies, cook_dict)
Cookie字符串处理 一般情况下除了从登录请求中获取到 Cookie 数据用于后续的请求这种场景,另一种情况就是我们从其他的方式获取到了 字符串 形式的cookie数据,然后需要将字符串转换为代码中可用的 Cookie值 来添加到请求Cookie 中。
常用方法如下:
1 2 3 cook_str='lang=zh-cn; uid=1000; key=9335e01424;' cook_dict=dict([x.strip().split('=' ) for x in cook_str.split(';' )if x != '' ]) requests.utils.add_dict_to_cookiejar(session.cookies, cook_dict)
其中,为了将cookie字符串信息转成 dict 形式,通过如下函数实现:
1 dict([x.strip().split('=' ) for x in cook_str.split(';' )if x != '' ])
RequestsCookieJar 当通过 dict_from_cookiejar 去转存cookie时,它只保留了 name 和 value 两个参数。而通过 add_dict_to_cookiejar 或 cookiejar_from_dict 将 字典dict 转成 cookiejar 时,也只会设置cookie的 name 和 value 。
由于 dict 中的 key 不能重复,也就可能导致对于一些 name 重复而 domain 或 path 等不相同的cookie时,就会导致cookie数据丢失。
添加cookie信息的path、domain参数,可以通过 RequestsCookieJar 来实现,常用的方法有三种:
jar.set()
jar.set_cookie()
jar.update()
1 2 3 4 5 6 7 import requestsfrom requests.cookies import RequestsCookieJarsession = requests.Session() jar = RequestsCookieJar() jar.set('cookie-name' , 'cookie-value' , path='/' , domain='.abc.com' ) session.cookies.update(jar)
1 2 3 4 5 6 import requestsfrom requests.cookies import RequestsCookieJar,create_cookiejar=RequestsCookieJar() jar.set_cookie(create_cookie('T' , 'cookie_t' )) session.cookies=jar
1 2 3 4 5 6 7 8 import requestsfrom http.cookiejar import Cookiefrom requests.cookies import RequestsCookieJarjar = RequestsCookieJar() c1=Cookie(name='' ,value='' ,domain='' ,path='' ,expires=0 ) jar.set_cookie(c1) session.cookies=jar
1 2 3 4 5 6 7 8 from http.cookies import SimpleCookie from requests.cookies import RequestsCookieJar cookies = SimpleCookie() cookies.load('auth_session=null; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT; httponly; samesite=strict' ) jar = RequestsCookieJar() jar.update(cookies)
Demo示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 import requestsdef cookie_test () : s=requests.Session() print(f'cookies: {s.cookies} ' ) cook1={'a' :'1' ,'b' :'2' } s.cookies=requests.utils.cookiejar_from_dict(cook1) print(f'cookies: {s.cookies} ' ) cookies=requests.utils.dict_from_cookiejar(s.cookies) print(f'cookies: {cookies} ' ) cook2={'c' :'3' } requests.utils.add_dict_to_cookiejar(s.cookies, cook2) cookies=requests.utils.dict_from_cookiejar(s.cookies) print(f'cookies: {cookies} ' ) cook_str='lang=zh-cn; uid=1000; key=9335e01424; ip=901eb854; expire_in=1666229628; PHPSESSID=994kdkgrkss; pop=yes;' cook_dict=dict([x.strip().split('=' ) for x in cook_str.split(';' )if x != '' ]) requests.utils.add_dict_to_cookiejar(s.cookies, cook_dict) cookies=requests.utils.dict_from_cookiejar(s.cookies) print(f'cookies: {cookies} ' ) if __name__ == '__main__' : cookie_test()