requests cookiejar - 从字典列表中发送多个 cookie

Posted

技术标签:

【中文标题】requests cookiejar - 从字典列表中发送多个 cookie【英文标题】:requests cookiejar - send multiple cookies from list of dictionaries 【发布时间】:2021-05-06 14:51:43 【问题描述】:

我希望有人可以帮助我从字典列表中创建一个包含多个 cookie 的 cookie jar。这是在python3中。

我尝试了几种不同的方法,但它们要么覆盖以前的 cookie,要么不接受非标准的 cookie 属性(例如 httpOnly)

cookie 从 Flaresolverr(我相信它与 selenium 的输出相同)作为列表中的多个字典返回,例如:

cookies = [
      
        "name": "ASP.NET_SessionId",
        "value": "SOMEVALUE",
        "domain": "sub.mydomain.co.uk",
        "path": "/",
        "expires": -1,
        "size": 41,
        "httpOnly": true,
        "secure": false,
        "session": true
      ,
      
        "name": "__cfduid",
        "value": "SOMEVALUE",
        "domain": ".mydomain.co.uk",
        "path": "/",
        "expires": 1622898293.967355,
        "size": 51,
        "httpOnly": true,
        "secure": true,
        "session": false,
        "sameSite": "Lax"
      
   ]

因此,如果我尝试将它们全部添加到 cookie 罐中,您会看到“__cfduid”是罐中唯一的 cookie:

r = requests.session()
for c in cookies:
      r.cookies.update(c)

print(r.cookies)
<RequestsCookieJar[<Cookie domain=.mydomain.co.uk for />, <Cookie expires=1622898293.967355 for />, <Cookie httpOnly=True for />, <Cookie name=__cfduid for />, <Cookie path=/ for />, <Cookie sameSite=Lax for />, <Cookie secure=True for />, <Cookie session=False for />, <Cookie size=51 for />, <Cookie value=SOMEVALUE for />]>

我也尝试过jar = requests.cookies.RequestsCookieJar()jar.set(xxxx),但它不喜欢非标准的 cookie 属性(例如 httpOnly)

我无法执行r= requests.get 并从 r.cookies 获取 cookie,因为 cookie 在 requests.text(或 requests.json)中以 json 格式返回,而不是会话本身的一部分。

我已经进行了大量搜索,但找不到任何有效的方法 - 任何帮助将不胜感激,谢谢!

【问题讨论】:

没人有什么想法吗? :( 【参考方案1】:

您要查找的方法是 set(),而不是 update()。它可以将其所有参数作为关键字参数,但它必须与http.cookiejar 记录的相匹配。此外,会话参数在 Cookie 对象中称为丢弃。通过一些列表推导,我们可以将其转换为所需的形式:

cookie_props = ['name', 'value', 'port', 'domain', 'path', 'expires', 'secure', 'discard']
cookiejar = [dict([(k, item['session' if k == 'discard' else k])
             for k in cookie_props if k in item]) for item in cookies]

r = requests.session()
for c in cookiejar:
    r.cookies.set(**c)
print(r.cookies)
print(len(r.cookies))

列表解析将会话重命名为丢弃,并且仅复制与http.cookiejar 上的 set() 方法接受的属性匹配的名称/值对。

【讨论】:

以上是关于requests cookiejar - 从字典列表中发送多个 cookie的主要内容,如果未能解决你的问题,请参考以下文章

requests.Session()从CookieJar加载cookie

cooke

关于cookiejar(),requests.session()中cookie的详细操作方法

Python3 requests与http.cookiejar的使用(cookie的保存与加载)

cookie

Python中用requests处理cookies的3种方法