【问题标题】:Get cookies separately as it is - Python Requests按原样单独获取 cookie - Python 请求
【发布时间】:2018-12-27 07:08:00
【问题描述】:

所以我正在尝试使用requests 库编写一个小脚本,该库向站点(例如github.com)发出请求,并解析响应标头中的cookie。因此,当您向 github.com 发出请求时,会有 3 个不同的 Set-Cookie 标头为:

Set-Cookie: has_recent_activity=1; path=/; expires=Thu, 27 Dec 2018 07:54:16 -0000
Set-Cookie: logged_in=no; domain=.github.com; path=/; expires=Mon, 27 Dec 2038 06:54:16 -0000; secure; HttpOnly
Set-Cookie: _gh_sess=MldFM3p...; path=/; secure; HttpOnly

现在,当您通过 requests API 发出请求并通过 req.headers.get('Set-Cookie') 检查 Set-Cookie 标头时,所有这些 cookie 值将合并为一个:

has_recent_activity=1; path=/; expires=Thu, 27 Dec 2018 07:54:16 -0000, logged_in=no; domain=.github.com; path=/; expires=Mon, 27 Dec 2038 06:54:16 -0000; secure; HttpOnly, _gh_sess=MldFM3p...; path=/; secure; HttpOnly

所以我的问题是如何获得 3 个完全独立的完整 cookie,因为它是由服务器连同所有 cookie 元数据信息(可能以列表的形式)一起发送的?

我是 Python 新手,因此我们将不胜感激任何帮助。干杯!

【问题讨论】:

  • 如果请求将它们全部聚集成一个,你怎么知道有三个 set-cookie 标头?
  • @robert 我在发布之前显然已经尝试过了。 :)
  • 我的意思是,您在看到 3 个 set-cookies 标头的地方还发送了一个获取请求吗?无论如何,如果它们都聚集在一起,我不知道如何区分实际的 set-cookie 标头,如果您知道 cookie 名称,则可以从 cookies.get_dict() 中单独获取值。 (如果您需要查看 cookie 的路径/域,请参阅stackoverflow.com/questions/25091976/…
  • @robert,查看设置的 cookie 会发现它们都有自己的 expires 标志,每个设置的 cookie 只能有一个过期标志,所以它们是有道理的不同的。另一方面,您可以通过简单的浏览器/fiddler/burpsuite 进行尝试,拦截请求,您会看到它们。或者你可以在这里试试:hackertarget.com/http-header-check。对于第二部分,遗憾的是我不知道 cookie 的名称。 :(

标签: python python-3.x python-2.7 python-requests


【解决方案1】:

老实说,我无法理解您想知道的问题 cmets,但如果您想要解决以下问题的方法,那将很容易。

所以我的问题是如何获得 3 个完全独立的 cookie,因为它是由服务器发送的(可能以列表的形式)?

import requests
with requests.Session() as s:
    resp = s.get("https://github.com")
    print(resp.cookies)
    #resp.cookies.items()
    #resp.cookies.get_dict()
    # More details: http://docs.python-requests.org/en/master/_modules/requests/cookies/

<RequestsCookieJar[
<Cookie logged_in=no for .github.com/>,
<Cookie _gh_sess=UHd5aUZ0ZXlBVDVPMitaVVBaWFp0c1p6dFA0TWVSanJzRGgrbU1XbVkxV3VXRW9LeWgwWHpWZ2pOOHFxZmtGaTZpRExpT2NjTHRyK3hHZG5GZjlxTzllbklqK0thQytHYi9HZWsrZ1poZ1ZUakJkRU9OZmJINEh3QUR2N3h3UUh6aVdFTmFCRHlHcVpwWHo1bEM5d25adnhUemJ6Y3pFMUxTbk50Q0M0UUJrVG5hR3kxRUVoUTB2TjdUc2hWbHk3cDJDWUZ4UW85NVRuR09keFJRTlc1QT09LS1RUnZHWUpsQ3BQU0hPZGtsWDAxQXFBPT0%3D--d2bd04e94c369f425fb7e9cc57b5b5499909b140 for github.com/>,
<Cookie has_recent_activity=1 for github.com/>]>

也可以通过正则表达式提取(regex101_Aregex101_B)

import requests, re
with requests.Session() as s:
    resp = s.get("https://github.com")
    show_cookie = lambda x: [re.findall(r"([^,;\s]*?=.*?(?=;|$))|(\w+(?=;|$|,))",cookie) for cookie in re.findall(r"((?:^|,\s).*?)(?=,\s\S+;|$)",x)]
    print(show_cookie(resp.headers.get('Set-Cookie')))
[[('has_recent_activity=1', ''), ('path=/', ''), ('expires=Sat, 29 Dec 2018 14:43:45 -0000', '')], [('logged_in=no', ''), ('domain=.github.com', ''), ('path=/', ''), ('expires=Wed, 29 Dec 2038 13:43:45 -0000', ''), ('', 'secure'), ('', 'HttpOnly')], [('_gh_sess=eHBNWkZscHFMeXJ3NEJUU0VXZlBQaHg0S01rby9MK24xNnFvR3gvVTBsOUJjTWNWenJPZ0RRdk9RNE9ZV2V0MTQ1bTg2NEduY3phSWRrd3l0L252KzBJNkRYZlpjWXh5c2NBZktkWGFsdjZDbEJjTEdhVmZ0YnpldDFHTEpuQzFTcDNNS21sT3BRaHhBVUFqTHQ1cDZyQWNPU005ODY0bFh0MGxCbWI5d2kwait5RlcvVjlUc2FwTTdNRE8wOHZQb0RGak5YbG1ZSDJTM2ZpQmVUUkkrdz09LS11M0ZHem1YYjdWYkVLaWtRMkhscW5nPT0%3D--f778e2d24e96f3386a2da36e2d33d2b73418deed', ''), ('path=/', ''), ('', 'secure'), ('', 'HttpOnly')]]

【讨论】:

  • 我见过这种方法,但它实际上并没有返回其他相关的标志,如过期标志、安全标志等。我希望 cookie 只是 服务器发送的完整 (与所有元数据一起完好无损)。谢谢你的回答。
  • @InfectedDrake 谢谢你的提及,我编辑我的答案。但我不知道如何将其转换为dict。如('', 'secure')
  • 感谢您的回答。你真棒。同时,我也找到了另一种解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
相关资源
最近更新 更多