如何在 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
使用requests
的session
自动管理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)
手动控制requests
的response.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的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Python 登录网页并检索 cookie 以供以后使用?
如何在 Javascript 中为 websocket 的请求标头设置 cookie?