【问题标题】:How to use cookies in Python Requests如何在 Python 请求中使用 cookie
【发布时间】: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。

【问题讨论】:

    标签: python cookies python-requests


    【解决方案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,请参见:stackoverflow.com/a/30441145/4411196
    • 我没有保存它们,而是创建了一个全局变量,为其分配了一个会话并创建了一个函数,以便在 cookie 不存在时登录和/或返回会话
    • for me print(s.cookies) 表明 cookie 在会话中,但并不总是在后续请求中传递(事实上,相同的代码对 localhost 有效,但对测试服务器无效)跨度>
    【解决方案2】:

    来自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)`
      

    【讨论】:

    • 谢谢。实际上,似乎没有创建 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进行认证

    1. 首先获取/生成 cookie
    2. 为以下请求发送 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)
    

    【讨论】:

      猜你喜欢
      • 2019-09-07
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      相关资源
      最近更新 更多