Как отправлять запросы по URL через библиотеку requests в Python

Раздел: Python -> Requests

Основные подходы к выполнению запроса

Базовый GET-запрос с помощью requests.get()

Наиболее распространённый способ получения данных по URL – использование функции requests.get(). Этот метод отправляет HTTP GET-запрос и возвращает объект Response, содержащий ответ сервера.

import requests

url = 'https://api.example.com/data'
response = requests.get(url)
print(response.status_code)
print(response.text)

Python 2 requests (библиотека requests в python 2)

После получения ответа можно проверить его статус (response.status_code), получить содержимое как текст (response.text), в формате JSON (response.json()) или как бинарные данные (response.content). Рекомендуется всегда проверять успешность запроса через response.raise_for_status().

Типичные проблемы:

  • ConnectionError – сервер недоступен; проверка URL и интернет-соединения.
  • Timeout – превышение времени ожидания; установка параметра timeout (например, timeout=5).
  • HTTPError (404, 500) – код состояния ошибки; использование raise_for_status() для автоматического выброса.

Как отправить POST-запрос с данными?

Для отправки данных на сервер используется метод requests.post(). Данные передаются в параметре data (форма application/x-www-form-urlencoded) или json (application/json).

import requests

url = 'https://httpbin.org/post'
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post(url, data=data)
print(response.json())

Python 3 requests (библиотека requests в python 3)

Ошибка: сервер ожидает JSON, а передана строка формы.

Решение: использовать параметр json вместо data для автоматической сериализации и установки заголовка Content-Type.

Как добавить заголовки к запросу?

Заголовки передаются словарём в параметре headers. Это нужно для имитации браузера, работы с API, указания типа контента и т.д.

headers = {'User-Agent': 'Mozilla/5.0', 'Accept': 'application/json'}
response = requests.get(url, headers=headers)

Python requests url (выполнение запроса по url с помощью requests в python)

Ошибка: сервер отклоняет запрос без определённого заголовка (например, API-ключа).

Решение: передать ключ в заголовке Authorization или в параметрах URL.

Как передать параметры запроса (query string)?

Параметры URL (после знака вопроса) удобно задавать словарём params. Библиотека сама закодирует и добавит их.

params = {'page': 2, 'limit': 10}
response = requests.get('https://api.example.com/items', params=params)
print(response.url)

Python requests headers (заголовки запросов в python requests)

Проблема: некоторые специальные символы не кодируются.

Решение: requests автоматически кодирует, но если нужно ручное кодирование, использовать urllib.parse.urlencode.

Как установить таймаут для запроса?

Параметр timeout задаёт максимальное время ожидания ответа (в секундах). Можно указать отдельно для соединения и чтения кортежем.

response = requests.get(url, timeout=5)  # общий таймаут 5 с
response = requests.get(url, timeout=(3, 10))  # соединение до 3 с, чтение до 10 с

Python requests exceptions (исключения в python requests)

Ошибка: при медленном интернете запрос может упасть с Timeout.

Решение: увеличить значение таймаута или использовать повторные попытки (retry).

Как обработать HTTP-ошибки (404, 500)?

Лучшая практика – использовать response.raise_for_status(), который вызовет исключение HTTPError для плохих статусов.

try:
    response = requests.get(url)
    response.raise_for_status()
    data = response.json()
except requests.exceptions.HTTPError as err:
    print(f'HTTP error: {err}')
except requests.exceptions.RequestException as err:
    print(f'Request error: {err}')

Python requests codes (коды ответов http в python requests)

Ошибка: игнорирование кода состояния и работа с некорректными данными.

Решение: всегда проверять status_code или вызывать raise_for_status().

Как использовать сессию для сохранения cookies и заголовков?

Объект requests.Session() позволяет сохранять состояние между запросами (cookies, заголовки).

session = requests.Session()
session.headers.update({'User-Agent': 'my-app'})
response1 = session.get(url1)
response2 = session.get(url2)  # использует ту же сессию

Python module requests (модуль requests в python)

Проблема: cookies не сохраняются между разными экземплярами Session.

Решение: использовать один объект сессии для цепочки запросов.

Как работать с прокси?

Параметр proxies принимает словарь протокол: адрес прокси.

proxies = {'http': 'http://user:pass@proxy.com:8080', 'https': 'https://proxy.com:8080'}
response = requests.get(url, proxies=proxies)

Python requests response (обработка ответа requests в python)

Ошибка: неверный формат прокси – библиотека ожидает полный URL.

Решение: включать схему (http://) и порт.

Как отключить проверку SSL-сертификата?

Для тестовых или внутренних ресурсов можно выключить проверку параметром verify=False. Рекомендуется избегать в продакшене.

response = requests.get(url, verify=False)
# на экране появится предупреждение, его можно подавить: 
import urllib3
urllib3.disable_warnings()

Ошибка: SSLError при самоподписанном сертификате.

Решение: либо указать путь к сертификату в verify, либо временно отключить проверку.

- Python types requests (типы запросов в requests python)
- Python requests post (отправка post-запроса с помощью requests python)
- Requests errors python (ошибки библиотеки requests python)

Расширенные примеры работы с библиотекой requests

Асинхронные запросы с aiohttp

Для высокопроизводительных приложений, где нужно одновременно выполнить много запросов, используется асинхронная библиотека aiohttp (совместно с asyncio).

Пример
import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    urls = ['https://httpbin.org/get', 'https://httpbin.org/get?x=1']
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        results = await asyncio.gather(*tasks)
        for res in results:
            print(res[:100])

asyncio.run(main())
{
  "args": {}, 
  "headers": {...}, 
  "origin": "...", 
  "url": "https://httpbin.org/get"
}
{
  "args": {"x": "1"}, 
  ...
}

Потоковая загрузка больших файлов

При скачивании больших файлов (например, видео), чтобы не держать их в памяти целиком, используется потоковая передача с параметром stream=True.

Пример
import requests

url = 'https://example.com/bigfile.zip'
response = requests.get(url, stream=True)
response.raise_for_status()

with open('bigfile.zip', 'wb') as f:
    for chunk in response.iter_content(chunk_size=8192):
        f.write(chunk)
(Файл bigfile.zip сохранён на диск, прогресс можно отслеживать подсчётом байт)

Загрузка файлов на сервер (multipart/form-data)

Для отправки файлов используется параметр files, который принимает словарь имя_поля: (имя_файла, содержимое) или кортеж.

Пример
url = 'https://httpbin.org/post'
files = {'file': ('test.txt', b'Hello World', 'text/plain')}
response = requests.post(url, files=files)
print(response.json()['files'])
{
  "file": "Hello World"
}

Работа с cookie

Cookies можно получать из ответа и отправлять в запрос. Сессия делает это автоматически, но можно и вручную.

Пример
session = requests.Session()
session.get('https://httpbin.org/cookies/set?name=value')
print(session.cookies.get_dict())
response = session.get('https://httpbin.org/cookies')
print(response.json()['cookies'])
{'name': 'value'}
{'name': 'value'}

Авторизация Basic Auth и Bearer Token

Для Basic Auth используется параметр auth с кортежем (логин, пароль). Для Bearer token – заголовок Authorization.

Пример
# Basic Auth
response = requests.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass'))
print(response.status_code, response.json())

# Bearer Token
token = 'your_token'
headers = {'Authorization': f'Bearer {token}'}
response = requests.get('https://api.example.com/me', headers=headers)
200 {'authenticated': True, 'user': 'user'}
(зависит от API)

Запрос с использованием verify и cert для клиентских сертификатов

При работе с взаимной аутентификацией TLS передаются сертификат и ключ через параметр cert.

Пример
response = requests.get('https://example.com', cert=('/path/to/client.crt', '/path/to/client.key'))

Результат зависит от сервера. При отсутствии корректного сертификата вернётся ошибка.

Повторные попытки (retry) с использованием адаптера HTTPAdapter

Для автоматического повторения запросов при временных сбоях настраивается HTTPAdapter с Retry.

Пример
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

session = requests.Session()
retry = Retry(total=3, backoff_factor=0.5, status_forcelist=[500, 502, 503, 504])
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)

response = session.get('https://httpbin.org/status/503')
print(response.status_code)  # после нескольких попыток может вернуть 200
200 (если сервер перестал отвечать 503)

Выполнение запроса по URL с помощью requests в Python - comments

En
Python requests url (python)