如何在Python请求中使用cookie

时间:2015-07-22 05:45:20

标签: python cookies python-requests

我正在尝试登录页面并访问页面中的其他链接。

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

这给了我一个&#34; 405 Not Allowed&#34;错误。 我使用chrome开发人员工具查看了post方法的详细信息,可以看到api(URL / api / auth)。 我使用有效负载发布到该URL,它正在运行,我得到的响应类似于我在开发人员中看到的内容。

不幸的是,在尝试“获得&#39;登录后的另一个网址,我仍然从登录页面获取内容。 为什么登录不坚持?我应该使用cookies吗? 我是新手,所以我真的不知道如何使用cookies。

3 个答案:

答案 0 :(得分:35)

您可以使用会话对象。它存储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...')

文档:http://docs.python-requests.org/en/latest/user/advanced/

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

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

答案 1 :(得分:13)

来自documentation

  1. 从响应中获取Cookie

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

    {'example_cookie_name': 'example_cookie_value'}

  2. 在后续请求中将cookie返回给服务器

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

答案 2 :(得分:5)

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

登录逻辑

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

如何使用 cookie 中的 requests 进行身份验证

  1. 首先获取/生成cookie
  2. 为以下请求发送 cookie
  • cookie中手动设置headers
  • cookie的自动处理requests
    • session 自动管理 cookie
    • response.cookies 手动设置 cookie

使用requests的{​​{1}}自动管理cookies

session

手动控制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) 的{​​{1}}

requests