Как выполнять GET запросы с библиотекой requests
Основы 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().
Расширенные примеры 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
Данный пример демонстрирует, как ограничить количество автоматических редиректов, переопределив внутренний метод сессии.