如何在 Python 请求中使用 cookie

Posted

技术标签:

【中文标题】如何在 Python 请求中使用 cookie【英文标题】:How to use cookies in Python Requests 【发布时间】:2015-10-11 20:02:20 【问题描述】:

我正在尝试登录一个页面并访问该页面中的另一个链接。

payload='username'=<username>,'password'=<password>
with session() as s:
    r = c.post(<URL>, data=payload)
    print r
    print r.content

这给了我一个“405 不允许”错误。 我使用 chrome 开发人员工具检查了 post 方法的详细信息,并且可以看到一个 api (URL/api/auth)。 我使用有效负载发布到该 URL 并且它正在工作,并且我得到了类似于我在开发人员中看到的响应。

不幸的是,在登录后尝试“获取”另一个 url 时,我仍然从登录页面获取内容。 为什么登录不上?我应该使用cookies吗? 我是新手,所以我真的不知道如何使用 cookie。

【问题讨论】:

【参考方案1】:

您可以使用会话对象。它存储 cookie 以便您发出请求,并为您处理 cookie

s = requests.Session() 
# all cookies received will be stored in the session object

s.post('http://www...',data=payload)
s.get('http://www...')

文档:https://requests.readthedocs.io/en/master/user/advanced/#session-objects

您还可以将 cookie 数据保存到外部文件,然后重新加载它们以保持会话持久,而无需每次运行脚本时登录:

How to save requests (python) cookies to a file?

【讨论】:

:哦,这太棒了!我希望我以前知道这个功能。它是像浏览器一样将 cookie 存储在磁盘上,还是仅仅将它们保存在内存中? 它只是在应用程序运行时将它们保存在内存中。要从磁盘保存/加载 cookie,请参见:***.com/a/30441145/4411196 我没有保存它们,而是创建了一个全局变量,为其分配了一个会话并创建了一个函数,以便在 cookie 不存在时登录和/或返回会话 for me print(s.cookies) 表明 cookie 在会话中,但并不总是在后续请求中传递(事实上,相同的代码对 localhost 有效,但对测试服务器无效)跨度> 【参考方案2】:

来自documentation:

    从响应中获取 cookie

    url = 'http://example.com/some/cookie/setting/url'
    r = requests.get(url)
    r.cookies
    

    'example_cookie_name': 'example_cookie_value'

    在后续请求中将 cookie 返还给服务器

    url = 'http://httpbin.org/cookies'
    cookies = dict(cookies_are='working')
    r = requests.get(url, cookies=cookies)`
    

【讨论】:

谢谢。实际上,似乎没有创建 cookie。我检查了请求标头,但看不到任何“cookies”。同时,在响应标头中创建了一个 cookie。如果没有 cookie,我怎样才能让我的登录保持不变。 认证 cookie 的正常流程是:(1) 当您提交登录表单时,您会在响应标头中收到一个 cookie。 (2) 在后续页面请求中,您将 cookie 添加到请求标头中。 如何添加多个cookie? kwarg“cookies”是一个字典,你可以添加任意数量的项目。【参考方案3】:

总结(@Freek Wiekmeijer,@gtalarico)其他人的回答:

登录逻辑

很多资源(pages, api)需要authentication才能访问,否则405 Not Allowed 常见的authentication=grant access方法有: cookie auth header Basic xxx Authorization xxx

如何在requests中使用cookie进行认证

    首先获取/生成 cookie 为以下请求发送 cookie
手动设置cookie in headers 自动处理cookie by requests's session 自动管理 cookie response.cookies手动设置cookies

使用requestssession自动管理cookies

curSession = requests.Session() 
# all cookies received will be stored in the session object

payload='username': "yourName",'password': "yourPassword"
curSession.post(firstUrl, data=payload)
# internally return your expected cookies, can use for following auth

# internally use previously generated cookies, can access the resources
curSession.get(secondUrl)

curSession.get(thirdUrl)

手动控制requestsresponse.cookies

payload='username': "yourName",'password': "yourPassword"
resp1 = requests.post(firstUrl, data=payload)

# manually pass previously returned cookies into following request
resp2 = requests.get(secondUrl, cookies= resp1.cookies)

resp3 = requests.get(thirdUrl, cookies= resp2.cookies)

【讨论】:

以上是关于如何在 Python 请求中使用 cookie的主要内容,如果未能解决你的问题,请参考以下文章

如何在http请求头中添加cookie-CSDN论坛

如何使用 Python 登录网页并检索 cookie 以供以后使用?

如何在 Javascript 中为 websocket 的请求标头设置 cookie?

如何从 POST 请求中检索 cookie?

如何使用来自 IHttpClientFactory 的 HttpClient 将 cookie 添加到请求中

如何在 Flutter 上使用 cookie 发出 http 请求?