Как выполнять GET запросы с библиотекой requests

Раздел: Веб-разработка -> HTTP

Основы GET-запроса с библиотекой requests

Наиболее эффективный способ выполнения GET-запроса в Python - использование библиотеки requests. Она предоставляет лаконичный и интуитивно понятный интерфейс. Для установки достаточно выполнить команду pip install requests. Простейший запрос выглядит так:

import requests
response = requests.get('https://httpbin.org/get')
print(response.status_code)
print(response.text)

Python requests get (get-запрос через requests в python)

Этот код отправляет GET-запрос по указанному URL, получает ответ и выводит его статус-код и содержимое. Библиотека автоматически обрабатывает кодировку, декодирует ответ в строку (если это текст) и предоставляет доступ к заголовкам, куки и другим деталям. Метод get возвращает объект Response, который содержит все данные ответа сервера.

Как передавать параметры в GET-запросе?

Параметры запроса можно передать через аргумент params в виде словаря. Библиотека сама закодирует их в строку запроса. Пример:

params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url)  # Выведет полный URL с параметрами

Get html python (получение html-содержимого через http в python)

Этот способ удобен, когда требуется динамически формировать параметры без ручного кодирования.

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

Заголовки передаются через аргумент headers словарём. Например, для имитации браузера:

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
response = requests.get('https://example.com', headers=headers)

Url запрос python (работа с url в python)

Заголовки часто требуются для авторизации, указания формата данных или обхода ограничений сервера.

Как обрабатывать возможные ошибки соединения или статус-коды?

Для проверки успешности запроса используется raise_for_status(). Если статус-код указывает на ошибку (4xx или 5xx), будет выброшено исключение HTTPError. Дополнительно можно обрабатывать исключения ConnectionError, Timeout и другие. Пример:

try:
    response = requests.get('https://httpbin.org/status/404', timeout=5)
    response.raise_for_status()
except requests.exceptions.HTTPError as err:
    print(f'HTTP ошибка: {err}')
except requests.exceptions.ConnectionError:
    print('Не удалось подключиться к серверу')
except requests.exceptions.Timeout:
    print('Время ожидания истекло')

Python urllib request (отправка запросов с помощью urllib.request в python)

Такой подход позволяет корректно реагировать на сетевые проблемы и ошибочные ответы сервера.

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

Аргумент timeout задаёт максимальное время ожидания ответа в секундах. Таймаут можно указать как одно число (для всего запроса) или кортеж из двух чисел (соединение и чтение):

response = requests.get('https://httpbin.org/delay/2', timeout=(3, 5))

Files upload python (загрузка файлов на сервер с помощью python (requests, flask))

Без таймаута запрос может зависнуть на неопределённое время, что критично для production-кода.

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

Объект Session сохраняет куки и настройки между запросами, что ускоряет работу при частых обращениях к одному сайту. Пример:

with requests.Session() as session:
    session.headers.update({'User-Agent': 'my-app'})
    resp1 = session.get('https://httpbin.org/cookies/set?user=test')
    resp2 = session.get('https://httpbin.org/cookies')
    print(resp2.text)  # Куки сохраняются

Python requests method (методы http-запросов в python (get, post, put, delete) с requests)

Сессии полезны для имитации поведения браузера или выполнения цепочек запросов с общей аутентификацией.

Как получить JSON-ответ?

Метод response.json() преобразует JSON-содержимое ответа в словарь Python. Если ответ не является корректным JSON, будет выброшено исключение. Пример:

response = requests.get('https://api.github.com')
data = response.json()
print(data['current_user_url'])

Python request data (извлечение данных из http-запроса (request) в python)

Это стандартный способ работы с REST API.

Как скачать файл с помощью GET-запроса?

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

with requests.get('https://httpbin.org/image/png', stream=True) as r:
    r.raise_for_status()
    with open('image.png', 'wb') as f:
        for chunk in r.iter_content(chunk_size=8192):
            f.write(chunk)

Без потокового режима большие файлы могут привести к переполнению памяти.

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

  • ConnectionError - возникает, если сервер недоступен или DNS не резолвится. Решение: проверить URL, интернет-соединение, добавить таймаут.
  • HTTPError - возникает при статус-коде 4xx или 5xx, если вызван raise_for_status(). Решение: обрабатывать исключения или проверять response.ok.
  • TooManyRedirects - превышено количество редиректов. Решение: установить параметр allow_redirects=False или увеличить лимит через сессию (max_redirects в custom transport adapters).
  • SSLError - ошибка проверки SSL-сертификата. Решение: временно отключить проверку через verify=False (не рекомендуется в production) или указать путь к сертификату через cert.
  • режим потоковой передачи без чтения контента - если не вызвать iter_content или close, соединение может не освободиться. Решение: всегда использовать контекстный менеджер или явно вызывать response.close().
- Python requests параметры (передача параметров в get/post запросах requests в python)
- Request session python (использование session в библиотеке requests (куки, заголовки) в python)
- Python requests timeout (установка таймаута для http-запроса (requests timeout) в python)

Расширенные примеры GET-запросов

Пример 1: Использование базовой аутентификации (Basic Auth)

Пример
from requests.auth import HTTPBasicAuth

response = requests.get(
    'https://httpbin.org/basic-auth/user/pass',
    auth=HTTPBasicAuth('user', 'pass')
)
print(response.status_code, response.ok)
print(response.text)
200 True
{
  "authenticated": true,
  "user": "user"
}

Пример 2: Передача параметров через URL и проверка редиректа

Пример
response = requests.get(
    'https://httpbin.org/redirect/2',
    params={'foo': 'bar'},
    allow_redirects=True
)
# После редиректов финальный URL может отличаться
print('Final URL:', response.url)
print('History:', [r.url for r in response.history])
Final URL: https://httpbin.org/get?foo=bar
History: ['https://httpbin.org/redirect/2?foo=bar', 'https://httpbin.org/relative-redirect/1?foo=bar']

Пример 3: Использование прокси

Пример
proxies = {
    'http': 'http://10.10.1.10:3128',
    'https': 'http://10.10.1.10:1080'
}
response = requests.get('https://httpbin.org/ip', proxies=proxies, timeout=10)
print(response.json())
{"origin": "10.10.1.10"}

Примечание: Для работы с прокси их необходимо предварительно настроить. Если прокси не требуется, этот параметр можно опустить.

Пример 4: Загрузка контента по частям (streaming) с обработкой прогресса

Пример
import shutil

url = 'https://httpbin.org/stream-bytes/65536'
with requests.get(url, stream=True) as r:
    r.raise_for_status()
    total_length = int(r.headers.get('Content-Length', 0))
    downloaded = 0
    with open('output.bin', 'wb') as f:
        for chunk in r.iter_content(chunk_size=8192):
            downloaded += len(chunk)
            f.write(chunk)
            if total_length:
                percent = 100 * downloaded / total_length
                print(f'Загружено {percent:.2f}%', end='\r')
print('\nФайл сохранён')
Загружено 100.00%
Файл сохранён

Пример 5: Проверка SSL-сертификата и использование пользовательского CA-файла

Пример
# Указание собственного сертификата для проверки
response = requests.get(
    'https://example.com',
    verify='/path/to/custom-ca.crt',
    cert=('/path/to/client.crt', '/path/to/client.key')
)
print(response.status_code)

Отключение проверки (небезопасно):

Пример
response = requests.get('https://expired.badssl.com/', verify=False)
# При этом выдаётся предупреждение: InsecureRequestWarning
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
print(response.status_code)
200

Пример 6: Кастомное поведение при редиректах (максимум 1 редирект и остановка)

Пример
class LimitedRedirectSession(requests.Session):
    def resolve_redirects(self, resp, req, **kwargs):
        for i, r in enumerate(super().resolve_redirects(resp, req, **kwargs)):
            if i >= 1:
                break
            yield r

session = LimitedRedirectSession()
response = session.get('https://httpbin.org/redirect/3')
print('Final status:', response.status_code, 'URL:', response.url)
Final status: 302 URL: https://httpbin.org/redirect/3

Данный пример демонстрирует, как ограничить количество автоматических редиректов, переопределив внутренний метод сессии.

GET-запрос через requests в Python - comments

En
Python requests get (python)