Подтвердить что ты не робот

Используя модуль запросов, как обрабатывать "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?

4b9b3361

Ответ 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)