Отправка HTTPS GET-запросов в Python: всестороннее руководство
Основные подходы к выполнению HTTPS GET-запросов в Python
Как отправить простой HTTPS GET-запрос с помощью библиотеки requests?
Библиотека requests является самым популярным и удобным решением для выполнения HTTP/HTTPS запросов в Python. Она автоматически обрабатывает SSL/TLS, поддерживает сессии и предоставляет простой API.
import requests
response = requests.get('https://api.example.com/data')
print(response.status_code)
print(response.text)
Api client python (api-клиент на python)
Ключевые шаги:
- Импорт библиотеки requests.
- Вызов функции get() с URL, начинающимся с https://.
- Получение объекта Response, из которого извлекаются статус-код, тело ответа и заголовки.
Возможные проблемы:
- Ошибка SSL (SSLError) – если сертификат сервера невалидный. Решение: response = requests.get(url, verify=False), но это снижает безопасность. Лучше указать путь к CA-сертификату: verify='/path/to/cert.pem'.
- Таймаут – если сервер долго отвечает. Рекомендуется всегда указывать таймаут: timeout=5.
- Редиректы – requests автоматически следует за редиректами (до 30 по умолчанию). Отключить можно параметром allow_redirects=False.
Как выполнить GET-запрос с использованием встроенной библиотеки urllib?
Стандартная библиотека Python содержит модуль urllib.request, который также поддерживает HTTPS. Этот вариант может быть полезен, когда установка сторонних пакетов нежелательна.
from urllib.request import urlopen
from urllib.error import URLError
try:
with urlopen('https://api.example.com/data') as response:
data = response.read().decode('utf-8')
print(response.status)
print(data)
except URLError as e:
print('Ошибка:', e.reason)
Python get https (https-запросы в python)
Особенности:
- Необходимо вручную декодировать тело ответа.
- Обработка ошибок через URLError.
- Для настройки SSL можно создать SSL-контекст (например, для игнорирования ошибок – ssl._create_unverified_context()).
Типичные ошибки:
- SSLCertVerificationError – при проблемах с сертификатом. Для тестирования: context = ssl._create_unverified_context(); urlopen(url, context=context).
- HTTPError – код статуса 4xx или 5xx. Обработка через исключение.
Как организовать асинхронный HTTPS GET-запрос с aiohttp?
Для высоконагруженных приложений, где требуется выполнять множество запросов параллельно, удобна библиотека aiohttp. Она использует асинхронный подход (async/await).
import aiohttp
import asyncio
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
html = await fetch('https://api.example.com/data')
print(html)
asyncio.run(main())
Python get api (получение данных через api в python)
Важные моменты:
- Требуется установка: pip install aiohttp.
- Код выполняется в цикле событий asyncio.
- Соединение использует пул и может быть перенастроено лимитами.
Проблемы и их решения:
- Ошибка SSL (недостоверный сертификат) – в ClientSession можно указать connector=aiohttp.TCPConnector(ssl=False).
- Превышение времени ожидания – установить timeout=aiohttp.ClientTimeout(total=10).
Как использовать httpx для синхронных и асинхронных запросов?
Современная библиотека httpx предлагает как синхронный, так и асинхронный API и поддерживает HTTP/2. Установка: pip install httpx.
import httpx
# Синхронный запрос
response = httpx.get('https://api.example.com/data')
print(response.status_code, response.text)
# Асинхронный запрос
async def async_get():
async with httpx.AsyncClient() as client:
r = await client.get('https://api.example.com/data')
print(r.json())
Ключевые особенности:
- Поддержка HTTP/2 (включить http2=True).
- Встроенная поддержка таймаутов (timeout=5).
- Простая работа с JSON (response.json()).
Возможные сложности:
- SSLError – решается через verify=False (не рекомендуется для продакшена).
- Проблемы с HTTP/2 – если сервер не поддерживает, httpx автоматически откатывается на HTTP/1.1.
Расширенные примеры HTTPS GET-запросов в Python
1. GET-запрос с параметрами (query string) и заголовками
import requests
params = {'q': 'python', 'page': 2}
headers = {'User-Agent': 'Mozilla/5.0', 'Accept': 'application/json'}
response = requests.get('https://api.example.com/search', params=params, headers=headers)
print(response.url) # https://api.example.com/search?q=python&page=2
print(response.json())
{"results": [{"title": "Python HTTP"}], "total": 123}
2. Обработка ошибок и таймаутов
import requests
from requests.exceptions import Timeout, ConnectionError
try:
response = requests.get('https://httpstat.us/200?sleep=5000', timeout=3)
response.raise_for_status() # выбросит HTTPError при статусе 4xx/5xx
except Timeout:
print('Превышено время ожидания')
except ConnectionError:
print('Ошибка соединения')
except requests.exceptions.HTTPError as e:
print(f'HTTP ошибка: {e.response.status_code}')
3. Использование сессии (Session) для сохранения cookies и заголовков
import requests
session = requests.Session()
session.headers.update({'Authorization': 'Bearer token123'})
# Первый запрос – куки сохранятся
resp1 = session.get('https://httpbin.org/cookies/set?name=value')
# Второй запрос – куки будут отправлены автоматически
resp2 = session.get('https://httpbin.org/cookies')
print(resp2.json()) # {"cookies": {"name": "value"}}
4. Запрос с проверкой сертификата и пользовательским CA
import requests
# Использование доверенного сертификата
response = requests.get('https://self-signed.badssl.com/', verify='/etc/ssl/certs/ca-certificates.crt')
# Или игнорирование проверки (небезопасно)
response = requests.get('https://self-signed.badssl.com/', verify=False)
5. Асинхронные запросы с aiohttp (параллельное выполнение)
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as resp:
return await resp.text()
async def main():
urls = ['https://httpbin.org/get', 'https://example.com', 'https://python.org']
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
results = await asyncio.gather(*tasks)
for url, html in zip(urls, results):
print(f'{url}: {len(html)} символов')
asyncio.run(main())
https://httpbin.org/get: 239 символов https://example.com: 1256 символов https://python.org: 24000 символов
6. Использование httpx с поддержкой HTTP/2 и прокси
import httpx
# Синхронный запрос с прокси
proxies = {'https://': 'http://proxy.example.com:8080'}
with httpx.Client(proxies=proxies, http2=True) as client:
resp = client.get('https://httpbin.org/ip')
print(resp.text)
# Асинхронный запрос с таймаутом
async def fetch_async():
timeout = httpx.Timeout(5.0, connect=2.0)
async with httpx.AsyncClient(timeout=timeout) as client:
r = await client.get('https://httpbin.org/delay/1')
return r.json()
7. Работа с редиректами и историей запросов
import requests
resp = requests.get('https://httpbin.org/redirect/3', allow_redirects=True)
print('Конечный URL:', resp.url) # последний URL после всех редиректов
print('История:', [r.url for r in resp.history]) # список промежуточных URL
# Отключение следования редиректам
resp = requests.get('https://httpbin.org/redirect/1', allow_redirects=False)
print('Статус:', resp.status_code) # 302
print('Location:', resp.headers.get('Location'))
8. Получение двоичных данных (изображение, файл)
import requests
url = 'https://www.python.org/static/img/python-logo.png'
response = requests.get(url, stream=True)
if response.status_code == 200:
with open('python.png', 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
print('Файл сохранён')
9. Повторные попытки при ошибках с использованием адаптера requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
import requests
session = requests.Session()
retries = Retry(total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
adapter = HTTPAdapter(max_retries=retries)
session.mount('https://', adapter)
response = session.get('https://httpstat.us/503')
print(response.status_code) # 200 после повторных попыток (если сервер ответил)
10. Отправка GET-запроса с сертификатом клиента (mTLS)
import requests
response = requests.get(
'https://api.example.com/secure',
cert=('/path/to/client.crt', '/path/to/client.key'),
verify='/path/to/ca.crt'
)
print(response.status_code)