我正在尝试打开登录页面(GET),获取网络服务器提供的cookie,然后提交用户名和密码对以登录网站(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
没有任何内容填充,因为链接问题的回答会表明。
我在我的代码中通过使用标头dict并在执行GET或POST之后解决这个问题,使用它来处理set-cookie
标头:
headers['Cookie'] = r.headers['set-cookie']
然后在请求方法中传递标头。这是正确的,还是有更好的方法来应用set-cookie
?
答案 0 :(得分:48)
忽略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")
答案 1 :(得分:9)
有一个名为session
的包含类,它会自动为您处理这类事情。您可以创建它的实例,然后直接在该实例上调用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")
答案 2 :(得分:2)
另一种对我有用的方法(不使用session objects)如下(在ARCamera.projectionMatrix
中测试过)。
v2.18.4
请注意,上述代码将在存在重定向的情况下失败,重定向由Requests库透明处理。在这种情况下,您还必须使用重定向响应中发送的cookie更新您的jar。例如。通过执行以下操作:
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 ...