Практическое руководство по работе с API на языке Python
Основные способы получения данных через API в Python
Наиболее эффективный подход: библиотека requests
Библиотека requests предоставляет удобный интерфейс для выполнения HTTP-запросов. Для получения данных достаточно вызвать функцию get() с URL.
import requests
response = requests.get('https://api.example.com/data')
data = response.json()
print(data)Api client python (api-клиент на python)
Пояснение: после получения ответа метод json() десериализует JSON. Если ответ содержит ошибку, можно проверить код статуса через response.status_code.
Возможные проблемы:
- ConnectionError – если сервер недоступен. Решение: обернуть в try-except.
- Timeout – запрос завис. Установите параметр timeout.
- HTTPError (4xx/5xx). Используйте response.raise_for_status().
- JSONDecodeError – если ответ не в JSON. Проверить content-type или использовать raw текст.
Как получить данные без сторонних библиотек, используя только стандартную библиотеку Python?
Модуль urllib.request позволяет выполнять GET-запросы. Однако требуется ручная обработка JSON.
import urllib.request
import json
url = "https://api.example.com/data"
with urllib.request.urlopen(url) as response:
raw = response.read()
data = json.loads(raw)
print(data)Python get https (https-запросы в python)
Особенности: нет автоматического декодирования, нужно закрывать response (контекстный менеджер), сложнее обработка ошибок.
Как использовать современный клиент с поддержкой HTTP/2 и асинхронности?
Установите httpx (pip install httpx). Пример синхронного вызова:
import httpx
response = httpx.get('https://api.example.com/data')
data = response.json()
print(data)
Python get api (получение данных через api в python)
Для асинхронного режима используйте async with httpx.AsyncClient().
import asyncio
import httpx
async def fetch():
async with httpx.AsyncClient() as client:
response = await client.get('https://api.example.com/data')
return response.json()
result = asyncio.run(fetch())
print(result)Преимущества: поддержка HTTP/2, время ожидания по умолчанию, встроенные методы обработки ошибок.
Как выполнять множество параллельных запросов к API без блокировки?
Библиотека aiohttp (pip install aiohttp) предназначена для асинхронных HTTP-запросов.
import asyncio
import aiohttp
async def fetch(session, url):
async with session.get(url) as response:
return await response.json()
async def main():
urls = ['https://api.example.com/1', 'https://api.example.com/2']
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main())Проблемы: требуется аккуратно управлять сессией, обрабатывать исключения в каждой задаче.
Как уменьшить накладные расходы при частых запросах?
Объект Session в requests поддерживает пул соединений и сохраняет куки между запросами.
import requests
session = requests.Session()
session.headers.update({'Authorization': 'Bearer token123'})
response1 = session.get('https://api.example.com/user')
response2 = session.get('https://api.example.com/items')
print(response1.json(), response2.json())Преимущества: быстрее, единая конфигурация.
Как автоматически повторить запрос при временных сбоях?
Можно использовать adapters в requests с urllib3 Retry, или библиотеку tenacity.
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
import requests
session = requests.Session()
retries = Retry(total=3, backoff_factor=0.5, status_forcelist=[500, 502, 503, 504])
session.mount('https://', HTTPAdapter(max_retries=retries))
response = session.get('https://api.example.com/unstable')
print(response.status_code)Параметр backoff_factor задает время ожидания между попытками.
Расширенные сценарии работы с API
import requests
headers = {'Authorization': 'Bearer YOUR_TOKEN'}
response = requests.get('https://api.example.com/protected', headers=headers)
print(response.json()){'id': 1, 'name': 'John'}Аутентификация через Bearer токен: заголовок Authorization передаёт токен, сервер проверяет его.
import requests
import json
payload = {'username': 'test', 'password': 'secret'}
response = requests.post('https://api.example.com/login', json=payload)
if response.status_code == 200:
token = response.json().get('token')
print('Token:', token)
else:
print('Error:', response.status_code)Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Отправка JSON-данных через POST и извлечение токена из ответа.
import requests
response = requests.get('https://api.example.com/large-file', stream=True)
with open('output.txt', 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
print('File saved')Потоковая загрузка больших данных позволяет не загружать весь файл в память, а сохранять его по частям.
from concurrent.futures import ThreadPoolExecutor
import requests
urls = ['https://api.example.com/1', 'https://api.example.com/2', 'https://api.example.com/3']
def fetch(url):
return requests.get(url).json()
with ThreadPoolExecutor(max_workers=5) as executor:
results = list(executor.map(fetch, urls))
print(results)[{'id': 1}, {'id': 2}, {'id': 3}]Параллельные запросы с использованием пула потоков ускоряют получение данных из нескольких источников.
from tenacity import retry, stop_after_attempt, wait_exponential
import requests
@retry(stop=stop_after_attempt(5), wait=wait_exponential(multiplier=1, min=2, max=10))
def fetch_data(url):
response = requests.get(url)
response.raise_for_status()
return response.json()
data = fetch_data('https://api.example.com/unstable')
print(data)Библиотека tenacity реализует повторные попытки с экспоненциальной задержкой, что удобно для нестабильных сервисов.
import requests
url = 'https://api.example.com/upload'
files = {'file': open('example.txt', 'rb')}
response = requests.post(url, files=files)
print(response.status_code, response.json())Загрузка файла через multipart/form-data с помощью параметра files.
import requests
params = {'page': 1, 'limit': 10, 'sort': 'name'}
response = requests.get('https://api.example.com/items', params=params)
print(response.url)
print(response.json())https://api.example.com/items?page=1&limit=10&sort=name
[{'name': 'A'}, {'name': 'B'}]Параметры запроса передаются через словарь params, автоматически формируя строку запроса.
import http.client
conn = http.client.HTTPSConnection("api.example.com")
headers = {'Authorization': 'Bearer token', 'Accept': 'application/json'}
conn.request("GET", "/data", headers=headers)
response = conn.getresponse()
data = response.read()
print(data.decode())
conn.close()Низкоуровневое использование http.client для максимального контроля.
import asyncio
import aiohttp
async def fetch(session, url, retries=2):
for attempt in range(retries):
try:
async with session.get(url) as resp:
if resp.status == 200:
return await resp.json()
else:
print(f"Attempt {attempt+1} failed with status {resp.status}")
except aiohttp.ClientError as e:
print(f"Error: {e}")
return None
async def main():
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, f'https://api.example.com/data/{i}') for i in range(5)]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main())Асинхронный сбор данных с обработкой ошибок и повторными попытками внутри каждой задачи.
import httpx
cert = ("/path/to/cert.pem", "/path/to/key.pem")
response = httpx.get('https://api.example.com/secure', cert=cert)
print(response.text)Использование клиентских сертификатов в httpx для аутентификации по TLS.