Python 使用请求模块,如何处理';设置cookie';请求-响应?

Python 使用请求模块,如何处理';设置cookie';请求-响应?,python,python-2.7,cookies,python-requests,Python,Python 2.7,Cookies,Python Requests,我试图打开一个登录页面(GET),获取Web服务器提供的cookies,然后提交一个用户名和密码对来登录该站点(POST) 看看,我想我应该做以下几点: import requests import cookielib URL1 = 'login prompt page' URL2 = 'login submission URL' jar = cookielib.CookieJar() r = requests.get(URL1, cookies=jar) r2 = requests.po

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

看看,我想我应该做以下几点:

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")
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)
但是,在
r
中,头中有一个
set cookie
,但是
jar
对象中没有改变。事实上,链接问题的回答表明,
jar中没有填充任何内容

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

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

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

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

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")

忽略cookie jar,让
请求
为您处理cookie。改为使用,它将保留cookie并将其发送回服务器:

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

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

请注意,如果存在由库透明处理的重定向,上述代码将失败。在这种情况下,您还必须使用重定向响应中发送的cookies更新您的jar。例如,通过执行以下操作:

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")
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)

在Python3.7.3中,请求v2.23.0,
response1.cookies
返回空的CookieJar对象。遗憾的是,在现代版本中,我们似乎无法避免Session()对象。