Практическое руководство по работе с API на языке Python

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

Основные способы получения данных через 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.

Получение данных через API в Python - comments

En
Python get api (python)