Используя модуль запросов, как обрабатывать "set-cookie" в ответе на запрос?
Я пытаюсь открыть страницу входа (GET), получить файлы cookie, предоставленные веб-сервером, а затем отправить пару имени пользователя и пароля для входа на сайт (POST).
Рассматривая qaru.site/info/163754/..., я бы подумал, что я просто сделаю следующее:
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
?
Ответы
Ответ 1
Игнорируйте куклу-кувшин, пусть requests
обрабатывает файлы cookie для вас. Вместо этого используйте объект сеанса, он сохранит файлы cookie и отправит их обратно на сервер:
with requests.Session() as s:
r = s.get(URL1)
r = s.post(URL2, data="username and password data payload")
Ответ 2
Здесь есть класс, называемый 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")
Ответ 3
Другой способ, который работал у меня (без использования объектов сеанса), является следующим (проверено в 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. В таком случае вам также необходимо обновить банку с помощью файлов cookie, отправленных в ответах на перенаправление. Например. выполнив что-то вроде следующего:
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)