Как отправлять запросы по URL через библиотеку requests в Python
Основные подходы к выполнению запроса
Базовый GET-запрос с помощью requests.get()
Наиболее распространённый способ получения данных по URL – использование функции requests.get(). Этот метод отправляет HTTP GET-запрос и возвращает объект Response, содержащий ответ сервера.
import requests
url = 'https://api.example.com/data'
response = requests.get(url)
print(response.status_code)
print(response.text)Python 2 requests (библиотека requests в python 2)
После получения ответа можно проверить его статус (response.status_code), получить содержимое как текст (response.text), в формате JSON (response.json()) или как бинарные данные (response.content). Рекомендуется всегда проверять успешность запроса через response.raise_for_status().
Типичные проблемы:
ConnectionError– сервер недоступен; проверка URL и интернет-соединения.Timeout– превышение времени ожидания; установка параметраtimeout(например,timeout=5).HTTPError(404, 500) – код состояния ошибки; использованиеraise_for_status()для автоматического выброса.
Как отправить POST-запрос с данными?
Для отправки данных на сервер используется метод requests.post(). Данные передаются в параметре data (форма application/x-www-form-urlencoded) или json (application/json).
import requests
url = 'https://httpbin.org/post'
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post(url, data=data)
print(response.json())Python 3 requests (библиотека requests в python 3)
Ошибка: сервер ожидает JSON, а передана строка формы.
Решение: использовать параметр json вместо data для автоматической сериализации и установки заголовка Content-Type.
Как добавить заголовки к запросу?
Заголовки передаются словарём в параметре headers. Это нужно для имитации браузера, работы с API, указания типа контента и т.д.
headers = {'User-Agent': 'Mozilla/5.0', 'Accept': 'application/json'}
response = requests.get(url, headers=headers)
Python requests url (выполнение запроса по url с помощью requests в python)
Ошибка: сервер отклоняет запрос без определённого заголовка (например, API-ключа).
Решение: передать ключ в заголовке Authorization или в параметрах URL.
Как передать параметры запроса (query string)?
Параметры URL (после знака вопроса) удобно задавать словарём params. Библиотека сама закодирует и добавит их.
params = {'page': 2, 'limit': 10}
response = requests.get('https://api.example.com/items', params=params)
print(response.url)Python requests headers (заголовки запросов в python requests)
Проблема: некоторые специальные символы не кодируются.
Решение: requests автоматически кодирует, но если нужно ручное кодирование, использовать urllib.parse.urlencode.
Как установить таймаут для запроса?
Параметр timeout задаёт максимальное время ожидания ответа (в секундах). Можно указать отдельно для соединения и чтения кортежем.
response = requests.get(url, timeout=5) # общий таймаут 5 с
response = requests.get(url, timeout=(3, 10)) # соединение до 3 с, чтение до 10 сPython requests exceptions (исключения в python requests)
Ошибка: при медленном интернете запрос может упасть с Timeout.
Решение: увеличить значение таймаута или использовать повторные попытки (retry).
Как обработать HTTP-ошибки (404, 500)?
Лучшая практика – использовать response.raise_for_status(), который вызовет исключение HTTPError для плохих статусов.
try:
response = requests.get(url)
response.raise_for_status()
data = response.json()
except requests.exceptions.HTTPError as err:
print(f'HTTP error: {err}')
except requests.exceptions.RequestException as err:
print(f'Request error: {err}')Python requests codes (коды ответов http в python requests)
Ошибка: игнорирование кода состояния и работа с некорректными данными.
Решение: всегда проверять status_code или вызывать raise_for_status().
Как использовать сессию для сохранения cookies и заголовков?
Объект requests.Session() позволяет сохранять состояние между запросами (cookies, заголовки).
session = requests.Session()
session.headers.update({'User-Agent': 'my-app'})
response1 = session.get(url1)
response2 = session.get(url2) # использует ту же сессиюPython module requests (модуль requests в python)
Проблема: cookies не сохраняются между разными экземплярами Session.
Решение: использовать один объект сессии для цепочки запросов.
Как работать с прокси?
Параметр proxies принимает словарь протокол: адрес прокси.
proxies = {'http': 'http://user:pass@proxy.com:8080', 'https': 'https://proxy.com:8080'}
response = requests.get(url, proxies=proxies)Python requests response (обработка ответа requests в python)
Ошибка: неверный формат прокси – библиотека ожидает полный URL.
Решение: включать схему (http://) и порт.
Как отключить проверку SSL-сертификата?
Для тестовых или внутренних ресурсов можно выключить проверку параметром verify=False. Рекомендуется избегать в продакшене.
response = requests.get(url, verify=False)
# на экране появится предупреждение, его можно подавить:
import urllib3
urllib3.disable_warnings()Ошибка: SSLError при самоподписанном сертификате.
Решение: либо указать путь к сертификату в verify, либо временно отключить проверку.
Расширенные примеры работы с библиотекой requests
Асинхронные запросы с aiohttp
Для высокопроизводительных приложений, где нужно одновременно выполнить много запросов, используется асинхронная библиотека aiohttp (совместно с asyncio).
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
urls = ['https://httpbin.org/get', 'https://httpbin.org/get?x=1']
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
results = await asyncio.gather(*tasks)
for res in results:
print(res[:100])
asyncio.run(main()){
"args": {},
"headers": {...},
"origin": "...",
"url": "https://httpbin.org/get"
}
{
"args": {"x": "1"},
...
}Потоковая загрузка больших файлов
При скачивании больших файлов (например, видео), чтобы не держать их в памяти целиком, используется потоковая передача с параметром stream=True.
import requests
url = 'https://example.com/bigfile.zip'
response = requests.get(url, stream=True)
response.raise_for_status()
with open('bigfile.zip', 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)(Файл bigfile.zip сохранён на диск, прогресс можно отслеживать подсчётом байт)
Загрузка файлов на сервер (multipart/form-data)
Для отправки файлов используется параметр files, который принимает словарь имя_поля: (имя_файла, содержимое) или кортеж.
url = 'https://httpbin.org/post'
files = {'file': ('test.txt', b'Hello World', 'text/plain')}
response = requests.post(url, files=files)
print(response.json()['files']){
"file": "Hello World"
}Работа с cookie
Cookies можно получать из ответа и отправлять в запрос. Сессия делает это автоматически, но можно и вручную.
session = requests.Session()
session.get('https://httpbin.org/cookies/set?name=value')
print(session.cookies.get_dict())
response = session.get('https://httpbin.org/cookies')
print(response.json()['cookies']){'name': 'value'}
{'name': 'value'}Авторизация Basic Auth и Bearer Token
Для Basic Auth используется параметр auth с кортежем (логин, пароль). Для Bearer token – заголовок Authorization.
# Basic Auth
response = requests.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass'))
print(response.status_code, response.json())
# Bearer Token
token = 'your_token'
headers = {'Authorization': f'Bearer {token}'}
response = requests.get('https://api.example.com/me', headers=headers)200 {'authenticated': True, 'user': 'user'}
(зависит от API)Запрос с использованием verify и cert для клиентских сертификатов
При работе с взаимной аутентификацией TLS передаются сертификат и ключ через параметр cert.
response = requests.get('https://example.com', cert=('/path/to/client.crt', '/path/to/client.key'))Результат зависит от сервера. При отсутствии корректного сертификата вернётся ошибка.
Повторные попытки (retry) с использованием адаптера HTTPAdapter
Для автоматического повторения запросов при временных сбоях настраивается HTTPAdapter с Retry.
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
session = requests.Session()
retry = Retry(total=3, backoff_factor=0.5, status_forcelist=[500, 502, 503, 504])
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
response = session.get('https://httpbin.org/status/503')
print(response.status_code) # после нескольких попыток может вернуть 200200 (если сервер перестал отвечать 503)