如何在Python Requests中使用cookies?

129

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

但是我在这个尝试中收到了“405不允许”的错误提示:

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

我使用Chrome开发者工具检查了POST方法的详细信息,并找到了一个看起来像API端点的URL。 我使用有效数据向该URL发送了请求,它似乎能够正常工作; 我得到的响应类似于我在开发者工具中看到的内容。

不幸的是,在登录后尝试获取另一个URL时,我仍然从登录页面获取内容。 为什么登录没有生效? 我应该使用cookies吗? 如何使用?

4个回答

167
你可以使用一个session对象。它存储了cookies,这样你就可以发出请求并由它来处理cookie。

你可以使用一个session对象。它存储了cookies,这样你就可以发出请求并由它来处理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数据保存到外部文件中,然后重新加载它们,以保持会话持久性,而不必每次运行脚本时都要登录:

如何将请求(python)cookies保存到文件中?


3
太棒了!我希望我早点知道这个功能。 它是像浏览器一样将cookie存储在磁盘上,还是只是将它们保存在内存中? - Aurelius
3
它仅在应用程序运行时将它们保存在内存中。若要从磁盘中保存/加载 cookie,请参阅此链接:https://dev59.com/O2cs5IYBdhLWcg3wOBbl#30441145。 - gtalarico
我没有将它们保存,而是创建了一个全局变量并分配了一个会话,并创建了一个函数,以便在没有cookie的情况下登录并/或返回会话。 - yashas123
对我来说,print(s.cookies)显示会话中存在cookie,但并不总是在后续请求中传递(实际上,相同的代码针对本地主机有效,但针对测试服务器无效)。 - Andrzej Martyna

99

文档中得知:

  1. 从响应中获取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 = {'cookies_are': 'working'}
     r = requests.get(url, cookies=cookies)`
    

    谢谢。实际上,似乎没有创建任何cookie。我检查了请求头,没有看到任何“cookies”。同时,在响应头中创建了一个cookie。如果没有cookie,我该如何使我的登录保持? - user1474157
    2
    身份验证 cookie 的正常流程是:(1)当您提交登录表单时,您会在响应标头中收到一个 cookie。 (2)在随后的页面请求中,您将 cookie 添加到请求标头中。 - Freek Wiekmeijer
    你如何添加多个 cookie? - Jitin
    2
    kwarg“cookies”是一个字典,你可以添加任意数量的项。 - Freek Wiekmeijer

    19

    总结(@Freek Wiekmeijer, @gtalarico)其他答案:

    登录逻辑

    • 许多资源(页面、API)需要身份验证,才能访问,否则会出现405不允许
    • 常见的身份验证=授权方法有:
      • cookie
      • auth header
        • Basic xxx
        • Authorization xxx

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

    1. 首先获取/生成cookie
    2. 发送cookie以进行后续请求
    • 手动在headers中设置cookie
    • 通过requests的自动管理cookie来自动处理cookie
      • session来自动管理cookies
      • 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)
    

    6

    正如其他人所指出的那样,以下是将cookie作为字符串变量添加到headers参数的示例:

        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...',
            'cookie': '_fbp=fb.1.1654447470850.2143140577; _ga=GA1.2.1...'
        }
        response = requests.get(url, headers=headers)
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接