使用请求模块,如何处理请求响应中的“设置cookie”?

2024-09-18 16:50:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图打开一个登录页面(GET),获取web服务器提供的cookies,然后提交用户名和密码对以登录到站点(POST)。

看着this Stackoverflow question/answer,我想我应该做以下几点:

import requests
import cookielib


URL1 = 'login prompt page'
URL2 = 'login submission URL'
jar = cookielib.CookieJar()

r = requests.get(URL1, cookies=jar)
r2 = requests.post(URL2, cookies=jar, data="username and password data payload")

然而,在r中,头中有一个set-cookie,但在jar对象中没有改变。事实上,正如链接的问题的回答所表明的,没有任何东西被填充到jar中。

我在代码中通过使用headers dict来解决这个问题,在执行GET或POST之后,使用它来处理set-cookie头:

headers['Cookie'] = r.headers['set-cookie']

然后在requests方法中传递头。这是正确的,还是有更好的方法来应用set-cookie


Tags: 方法importdatagetcookieloginpostrequests
3条回答

有一个名为^{}的包含类,它自动为您处理这类事情。您可以创建它的实例,然后在该实例上调用getset

import requests

URL1 = 'login prompt page'
URL2 = 'login submission URL'

session = requests.Session()

r = session.get(URL1)
r2 = session.post(URL2, data="username and password data payload")

另一种对我有效的方法(不使用session objects)是下面的(在v2.18.4中测试)。

jar = requests.cookies.RequestsCookieJar()
response1 = requests.get(some_url, cookies=jar) # or post ...
jar.update(response1.cookies)
response2 = requests.get(some_other_url, cookies=jar) # or post ...

请注意,上述代码将在重定向存在时失败,重定向由Requests库透明处理。在这种情况下,还必须用重定向响应中发送的cookies更新jar。E、 g.做如下事情:

if (response.history): # we have to add to the cookie jar, the cookies sent by the server in intermediate responses 
    for historicResponse in response.history:
        jar.update(historicResponse.cookies)

忽略cookie jar,让requests为您处理cookie。使用session object代替,它将保存cookie并将它们发送回服务器:

with requests.Session() as s:
    r = s.get(URL1)
    r = s.post(URL2, data="username and password data payload")

相关问题 更多 >