0%

Python中Requests库操作Cookie常用方法

前言

在通过 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 对象并添加到当前 sessioncookies 中:

1
2
3
4
import requests

session=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时,它只保留了 namevalue 两个参数。而通过 add_dict_to_cookiejarcookiejar_from_dict 将 字典dict 转成 cookiejar 时,也只会设置cookie的 namevalue

由于 dict 中的 key 不能重复,也就可能导致对于一些 name 重复而 domainpath 等不相同的cookie时,就会导致cookie数据丢失。

添加cookie信息的path、domain参数,可以通过 RequestsCookieJar 来实现,常用的方法有三种:

  • jar.set()
  • jar.set_cookie()
  • jar.update()
1
2
3
4
5
6
7
import requests
from requests.cookies import RequestsCookieJar

session = 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 requests
from requests.cookies import RequestsCookieJar,create_cookie

jar=RequestsCookieJar()
jar.set_cookie(create_cookie('T', 'cookie_t'))
session.cookies=jar
1
2
3
4
5
6
7
8
import requests
from http.cookiejar import Cookie
from requests.cookies import RequestsCookieJar

jar = 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 requests

def cookie_test():

s=requests.Session()

print(f'cookies: {s.cookies}')
# 结果:cookies: <RequestsCookieJar[]>

# requests.utils.cookiejar_from_dict 方法可以将一个字典转换成cookiejar对象并添加到当前session的cookies中
cook1={'a':'1','b':'2'}
s.cookies=requests.utils.cookiejar_from_dict(cook1)
print(f'cookies: {s.cookies}')
# 结果:cookies: <RequestsCookieJar[<Cookie a=1 for />, <Cookie b=2 for />]>

# requests.utils.dict_from_cookiejar 方法可以将cookiejar对象转换成一个dict对象
cookies=requests.utils.dict_from_cookiejar(s.cookies)
print(f'cookies: {cookies}')
# 结果:cookies: {'a': '1', 'b': '2'}

# requests.utils.add_dict_to_cookiejar 方法可以为当前的cookies添加新的cookie
cook2={'c':'3'}
requests.utils.add_dict_to_cookiejar(s.cookies, cook2)
cookies=requests.utils.dict_from_cookiejar(s.cookies)
print(f'cookies: {cookies}')
# 结果:cookies: {'a': '1', 'b': '2', 'c': '3'}

# 将 cookie 字符串添加到当前session的cookie中
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}')
# 结果:cookies: {'PHPSESSID': '994kdkgrkss', 'a': '1', 'b': '2', 'c': '3', 'expire_in': '1666229628', 'ip': '901eb854', 'key': '9335e01424', 'lang': 'zh-cn', 'pop': 'yes', 'uid': '1000'}

if __name__ == '__main__':
cookie_test()

如有疑问或需要技术讨论,请留言或发邮件到 service@itfanr.cc