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

Получение/отправка заголовков сервера модулем requests в Python

Получение заголовков headers в ответе сервера.

Заголовки/header ответа сервера, т.е. которые сервер отправил обратно, доступны после запроса к серверу, в атрибуте Response.headers. Эти заголовки, модуль requests возвращает в виде словаря Python:

>>> import requests
>>> resp = requests.get('https://httpbin.org/get')
>>> resp.headers
# {
#     'content-encoding': 'gzip',
#     'transfer-encoding': 'chunked',
#     'connection': 'close',
#     'server': 'nginx/1.0.4',
#     'x-runtime': '148ms',
#     'etag': '"e1ca502697e5c9317743dc078f67693f"',
#     'content-type': 'application/json'
# }

НО словарь особенный: он создан только для HTTP-заголовков. Согласно RFC 7230, имена заголовков HTTP не чувствительны к регистру символов.

Таким образом, можно получить доступ к любому заголовку, используя при его написании заглавные буквы:

# при извлечении заголовка 'Content-Type' 
# используется разный регистр символов
>>> resp.headers['Content-Type']
# 'application/json'

# при извлечении заголовка 'content-type' 
# используется только нижний регистр символов
>>> resp.headers.get('content-type')
# 'application/json'

Заголовки также особенные, т.к. сервер может отправить один и тот же заголовок несколько раз с разными значениями, но запросы объединяют их таким образом, чтобы они могут быть представлены в словаре в рамках одного сопоставления, согласно RFC 7230:

Получатель МОЖЕТ объединить несколько полей заголовка с одним и тем же именем поля в одну пару “field-name: field-value”, не изменяя семантику сообщения, добавляя каждое последующее значение поля к объединенному значению поля по порядку, разделенному запятой.

Если необходимо получить заголовки, которые МЫ отправили серверу, то просто получаем доступ к запросу, а затем к заголовкам запроса:

>>> import requests
>>> resp = requests.get('https://httpbin.org/get', headers={'one': 'true'})
>>> resp.request.headers
# {'User-Agent': 'python-requests/2.25.1', 'Accept-Encoding': 'gzip, deflate', 
# 'Accept': '*/*', 'Connection': 'keep-alive', 'one': 'true'}

Отправка заголовков headers на сервер в запросе.

Если необходимо добавить в запрос пользовательские HTTP-заголовки, то просто передайте словарь со своими заголовками в аргумент headers метода requests.get().

Например, в предыдущих примерах мы не указывали/устанавливали user-agent (тип браузера):

>>> import requests
>>> url = 'https://api.github.com/some/endpoint'
# определение типа агента пользователя
>>> headers = {'user-agent': 'my-app/0.0.1'}
# передача пользовательского агента, 
# определенного в словаре аргумента `headers`
>>> resp = requests.get(url, headers=headers)

Примечание: Пользовательские заголовки имеют меньший приоритет, чем более конкретные источники информации. Например:

  • Заголовки авторизации, заданные с помощью аргумента headers, будут переопределены, если учетные данные указаны в файле .netrc, который, в свою очередь, будет переопределен аргументом auth. Модуль requests будет искать файл netrc по адресу ~/.netrc, ~/_netrc или по пути, указанному переменной среды NETRC.
  • Заголовки авторизации будут удалены, если будет сделано перенаправление за пределы хоста.
  • Заголовки авторизации прокси-сервера будут переопределены учетными данными прокси-сервера, указанными в URL-адресе.
  • Заголовки Content-Length будут переопределены, когда можно будет определить длину содержимого ответа.

Кроме того, запросы вообще не меняют свое поведение в зависимости от того, какие пользовательские заголовки указаны. Заголовки просто передаются в окончательный запрос.

Примечание: Все значения заголовка должны быть текстовой строкой, строкой bytes или unicode. Хотя это разрешено, но рекомендуется избегать передачи значений заголовка в unicode.