如何在python请求库中向cookiejar添加cookie

pxiryf3j  于 2022-12-05  发布在  Python
关注(0)|答案(5)|浏览(158)

我正在尝试使用python requests 1.2.3库向一个已有的cookiejar添加一个cookie。每次添加新cookie时,jar中的数据都会被munged为新cookie。键丢失,值丢失或与不正确的键匹配。我不确定这是请求库错误还是我没有正确发送cookie。我使用的以下代码导致cookiejar中出现错误cookie。我的cookie格式正确吗?有什么想法吗?

my_cookie = {
           'domain':'www.mydomain.com',
           'expires':None,
           'name':'COOKIE_NAME',
           'path':'/',
           'value':'the cookie works',
           'version':0
}

s = requests.Session()
requests.utils.add_dict_to_cookiejar(s.cookies, my_cookie)
bwitn5fc

bwitn5fc1#

快速解答

选项1

import requests
s = requests.session()
s.cookies.set("COOKIE_NAME", "the cookie works", domain="example.com")

选项2

import requests
s = requests.session()
# Note that domain keyword parameter is the only optional parameter here
cookie_obj = requests.cookies.create_cookie(domain="example.com",name="COOKIE_NAME",value="the cookie works")
s.cookies.set_cookie(cookie_obj)

详细答案

我不知道当最初的问题被问到时,这种技术是否有效,但是理想情况下,您应该使用requests.cookies.create_cookie(name,value,**kwargs)生成自己的cookie对象,然后通过requests.cookies.RequestsCookieJar.set_cookie(cookie,*args,**kwargs)将其添加到cookie jar中。

向请求会话添加自定义Cookie

>>> import requests
>>> s = requests.session()
>>> print(s.cookies)
<RequestsCookieJar[]>
>>> required_args = {
        'name':'COOKIE_NAME',
        'value':'the cookie works'
    }
>>> optional_args = {
    'version':0,
    'port':None,
#NOTE: If domain is a blank string or not supplied this creates a
# "super cookie" that is supplied to all domains.
    'domain':'example.com',
    'path':'/',
    'secure':False,
    'expires':None,
    'discard':True,
    'comment':None,
    'comment_url':None,
    'rest':{'HttpOnly': None},
    'rfc2109':False
}
>>> my_cookie = requests.cookies.create_cookie(**required_args,**optional_args)
# Counter-intuitively, set_cookie _adds_ the cookie to your session object,
#  keeping existing cookies in place
>>> s.cookies.set_cookie(my_cookie)
>>> s.cookies
<RequestsCookieJar[Cookie(version=0, name='COOKIE_NAME', value='the cookie works', port=None, port_specified=False, domain='www.domain.com', domain_specified=True, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)]>

奖励:让我们添加一个超级cookie,然后删除它

>>> my_super_cookie = requests.cookies.create_cookie('super','cookie')
>>> s.cookies.set_cookie(my_super_cookie)
# Note we have both our previous cookie and our new cookie
>>> s.cookies
<RequestsCookieJar[Cookie(version=0, name='super', value='cookie', port=None, port_specified=False, domain='', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False), Cookie(version=0, name='COOKIE_NAME', value='the cookie works', port=None, port_specified=False, domain='www.domain.com', domain_specified=True, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)]>
# Deleting is simple, note that this deletes the cookie based on the name,
# if you have multiple cookies with the same name it will raise
# requests.cookies.CookieConflictError
>>> del s.cookies['super']
>>> s.cookies
<RequestsCookieJar[Cookie(version=0, name='COOKIE_NAME', value='the cookie works', port=None, port_specified=False, domain='www.domain.com', domain_specified=True, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)]>
nwo49xxi

nwo49xxi2#

我找到了一种方法,通过导入CookieJar,Cookie和Cookie来做到这一点。在@Lukasa的帮助下,他向我展示了一种更好的方法。然而,用他的方法我无法指定“port_specified”,“domain_specified”,“domain_initial_dot”或“path_specified”属性。“set”方法使用默认值自动执行此操作。我试着抓取一个网站,他们的cookie在这些属性中有不同的值。因为我是新来的,我不确定这是否真的有关系。

my_cookie = {
"version":0,
"name":'COOKIE_NAME',
"value":'true',
"port":None,
# "port_specified":False,
"domain":'www.mydomain.com',
# "domain_specified":False,
# "domain_initial_dot":False,
"path":'/',
# "path_specified":True,
"secure":False,
"expires":None,
"discard":True,
"comment":None,
"comment_url":None,
"rest":{},
"rfc2109":False
}

s = requests.Session()
s.cookies.set(**my_cookie)
1tu0hz3e

1tu0hz3e3#

如果您希望处理普通的Cookie字符串:

def make_cookiejar_dict(cookies_str):
    # alt: `return dict(cookie.strip().split("=", maxsplit=1) for cookie in cookies_str.split(";"))`
    cookiejar_dict = {}
    for cookie_string in cookies_str.split(";"):
        # maxsplit=1 because cookie value may have "="
        cookie_key, cookie_value = cookie_string.strip().split("=", maxsplit=1)
        cookiejar_dict[cookie_key] = cookie_value
    return cookiejar_dict

cookies_str = '''nopubuser_abo=1; groupenctype_abo="1="'''
cj = requests.utils.cookiejar_from_dict(make_cookiejar_dict(cookies_str))
sess = requests.Session()
sess.cookies = cj
1tu0hz3e

1tu0hz3e4#

要使用内置函数和方法...

import requests

session = requests.session()
my_cookies = {'cookie_key': 'cookie_value',
              'another_cookie_key': 'another_cookie_value'}
requests.utils.add_dict_to_cookiejar(session.cookies, my_cookies)

您可以根据需要添加任意多的Cookie。如果需要特殊的标头,请使用此方法添加它们。

my_headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0'}
session.headers.update(my_headers)
8i9zcol2

8i9zcol25#

将新cookie添加到requestssession.cookies

方法1:session.cookies.set

传递新cookie的命令
还有两种写入类型:

类型1:全部在一个字典中

cookieCurrencyDict = {
    "name": "user_pref_currency",
    "value": "CNY",
    # common part
    "domain": ".ti.com.cn",
    "path": "/",
    "expires": 1701488751,
    "secure": True,
    # "discard": True,
    "version": 0,
}

session.cookies.set(**cookieCurrencyDict)

类型2:namevalue和通用字典

cookieCommonDict = {
    "domain": ".ti.com.cn",
    "path": "/",
    "expires": expiresOneYear,
    "secure": True,
    # "discard": True,
    "version": 0,
}

session.cookies.set(name="user_pref_currency", value="CNY", **cookieCommonDict)
# or omit parameter name:
# session.cookies.set("user_pref_currency", "CNY", **cookieCommonDict)

生成新cookieobject,然后添加到cookie中

cookieCommonDict = {
    "domain": ".ti.com.cn",
    "path": "/",
    "expires": expiresOneYear,
    "secure": True,
    # "discard": True,
    "version": 0,
}

cookieCurrency = requests.cookies.create_cookie(
    name="user_pref_currency",
    value="CNY",
    **cookieCommonDict
)
# or omit parameter name:
# cookieCurrency = requests.cookies.create_cookie("user_pref_currency", "CNY", **cookieCommonDict)

session.cookies.set_cookie(cookieCurrency)

添加了新cookie示例

session.cookies._cookies['.ti.com.cn']['/']['user_pref_currency'] = 

Cookie(version=0, name='user_pref_currency', value='CNY', port=None, port_specified=False, domain='.ti.com.cn', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=True, expires=1701503561, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)

摘要


参考

  • 会话对象
  • requests.cookies.RequestsCookieJar
  • requests.utils
  • requests.cookies
  • Cookie对象

相关问题