前言 在通过 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()