Сообщить об ошибке.

Сессии/сеансы Session() модуля requests в Python

Параметры сессии/сеанса при работе с сайтом

Объект сессии requests.Session позволяет сохранять определенные параметры в запросах к одному и тому же сайту. Он также сохраняет файлы cookie во всех запросах, сделанных из экземпляра Session, и будет использовать пул соединений модуля urllib3. Поэтому, если делать несколько запросов к одному и тому же хосту, базовое TCP-соединение будет использоваться повторно, что приводит к значительному увеличению производительности.

Объект сессии Session имеет все методы основного API модуля requests.

import requests
sess = requests.Session()
sess.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
resp = sess.get('https://httpbin.org/cookies')
print(resp.text)
# '{"cookies": {"sessioncookie": "123456789"}}'

Сессии/сеансы также могут использоваться для предоставления данных по умолчанию методам запроса. Это делается путем предоставления данных в свойства объекта Session:

import requests
sess = requests.Session()
# установленные таким образом данные , будут передаваться 
# в каждый запрос к сайту в рамках жизни одной сессии
sess.headers.update({'x-test': 'true'})
# посылаются как "x-test", так и "x-test2"
resp = sess.get('https://httpbin.org/headers', headers={'x-test2': 'true'})
>>> print(resp.text)
# {
#   "headers": {
#    ...
#     "X-Test": "true", 
 #    "X-Test2": "true"
#   }
# }

Любые словари, которые передаются методу запроса sess.get(), sess.post() и т.д., будут объединены с установленными значениями уровня сессии/сеанса. Параметры уровня метода sess.get() переопределяют параметры сессии/сеанса sess.headers. Другими словами, если например установить в sess.headers.update({'one': 'true'}), а потом передать параметр 'one' с другим значением в метод sess.get(..., headers={'one': 'false'}), то на сайт попадет последний заголовок, т.е. 'one': 'false'.

import requests
sess = requests.Session()
sess.headers.update({'one': 'true'})
# переопределяем заголовок в только этом запросе 'one' на 'false'
resp = sess.get('https://httpbin.org/headers', headers={'one': 'false'})
>>> print(resp.text)
# {
#   "headers": {
#    ...
#    "One": "false", 
#   }
# }

Обратите внимание, что параметры переданные напрямую в методы sess.get(), sess.post() и т.д. не будут сохраняться в запросах, даже если используется объект Session. Этот пример будет отправлять файлы cookie только с первым запросом, но не со вторым:

import requests
sess = requests.Session()
resp = sess.get('https://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(resp.text)
# '{"cookies": {"from-my": "browser"}}'

# файл cookie больше не передается, что бы закрепить 
# cookie в сессии используйте `sess.cookies.update()`
resp = sess.get('https://httpbin.org/cookies')
print(resp.text)
# '{"cookies": {}}'

Если необходимо вручную добавить ранее сохраненные файлы cookie в сессию/сеанс, то для управления Session.cookies используйте функцию requests.utils.add_dict_to_cookiejar(cj, cookie_dict), где cj - это экземпляр requests.cookies.RequestsCookieJar(), а cookie_dict это словарь ключ/значения для вставки в cj.

Сеансы/сессии также можно использовать в качестве контекстных менеджеров:

with requests.Session() as sess:
    sess.get('https://httpbin.org/cookies/set/sessioncookie/123456789')

Это гарантирует, что сеанс будет закрыт сразу же после выхода из блока with, даже если произошли необработанные исключения.

Примечание: Иногда надо опустить некоторые ключи, добавленные в сеанс/сессию как постоянные. Чтобы сделать это, необходимо установить значение этого ключа равным None в аргументе метода запроса, и он будет автоматически опущен.

import requests
sess = requests.Session()
# установленные таким образом данные , будут передаваться 
# в каждый запрос к сайту в рамках жизни одной сессии
sess.headers.update({'one': 'true', 'two': 'true'})
# отключаем заголовок 'one' только в данном запросе
resp = sess.get('https://httpbin.org/headers', headers={'one': None})
>>> print(resp.text)
# {
#   "headers": {
#    ...
#     "Two": "true", 
#   }
# }