2014-02-12 2 views
13

로그인 페이지 (GET)를 열고 웹 서버에서 제공 한 쿠키를 가져온 다음 사용자 이름과 비밀번호 쌍을 제출하여 사이트 (POST)에 로그인하십시오.요청 모듈을 사용하여 요청 응답에서 'set-cookie'를 처리하는 방법은 무엇입니까?

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 객체에 변경되지 않습니다

this Stackoverflow question/answer 보면, 난 그냥 다음을 수행 것이라고 생각합니다. 실제로, 연결된 질문의 응답이 나타내는대로 jar에 아무것도 채워지지 않습니다.

나는이는 set-cookie 헤더 처리하기 위해 사용하는 헤더 딕셔너리를 필요로하고, GET 또는 POST를 수행 한 후 내 코드에서이 문제를 해결 받고 있어요 :

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

그런 다음 요청 방법에 헤더 주위에 통과를 . 이게 맞습니까, 아니면 set-cookie을 적용 할 수있는 더 좋은 방법이 있습니까?

답변

39

쿠키자를 무시하면 requests 쿠키가 처리됩니다. 대신 session object를 사용하여, 그것은 쿠키를 지속하고 서버로 다시 보내드립니다 :

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

이 종류의 것을 자동으로 처리하는 session이라는 클래스가 있습니다. 인스턴스를 생성 한 다음 해당 인스턴스에 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") 
0

(session objects를 사용하지 않고) 나를 위해 일했다 또 다른 방법은이 (v2.18.4에서 테스트) 다음이다. 위의 코드는 Requests 라이브러리에 의해 투명하게 처리하는 리디렉션의 존재에 실패 할

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 ... 

참고. 이 경우 리디렉션 응답에서 보낸 쿠키로 항아리를 업데이트해야합니다. 예 : 다음과 같이하면됩니다.

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) 
관련 문제