Тема 4: Сетевые клиенты: requests vs httpx vs aiohttp. Почему requests — это легаси, и зачем нам асинхронность?
В парсинге есть два греха: тупость (плохой алгоритм) и простой (блокировка). Выбор библиотеки определяет, будет твой скрипт спать 90% времени или работать.
1. Requests — "Старый добрый тормоз"
Это библиотека, на которой учились наши деды.
- Тип: Синхронная (Блокирующая).
- Как работает: Ты отправил запрос -> Скрипт ЗАМЕР и ждет ответа. Процессор курит, память простаивает. Пока сервер не ответит (или не отвалится по таймауту), следующая строка кода не выполнится.
- Аналогия: Ты заказал пиццу по телефону и стоишь у входной двери с открытым ртом, ожидая курьера. Ты не можешь ни читать книгу, ни смотреть ТВ. Ты просто ждешь.
- Вердикт: Для скриптов "спарсить 5 страниц раз в день" — пойдет. Для парсинга 1000+ страниц — смерть. 1000 запросов по 1 секунде = 16 минут ожидания.
- Минус: Не умеет HTTP/2.
2. Aiohttp — "Асинхронный конвейер"
Это стандарт индустрии для высоконагруженных систем.
- Тип: Асинхронная (Non-blocking).
- Как работает: Ты отправил запрос -> Скрипт НЕ ЖДЕТ, а идет выполнять следующую задачу. Когда ответ придет, скрипт вернется и обработает его.
- Аналогия: Ты заказал пиццу, положил трубку и пошел играть в PlayStation. Заказал суши — продолжил играть. Курьеры приходят параллельно, ты просто забираешь еду в перерывах.
- Скорость: 1000 запросов отправляются почти мгновенно. Время выполнения = время ответа самого медленного запроса. 16 минут превращаются в 10 секунд.
- Минус: API чуть сложнее, чем у
requests. Нужно знатьasync/await.
3. Httpx — "Новый Король"
Это современная замена requests, вобравшая в себя всё лучшее.
- Тип: Гибрид (умеет и синхронно, и асинхронно).
- Киллер-фича: Поддержка HTTP/2 из коробки.
aiohttpиrequestsэтого не умеют (без танцев с бубном). - API: Полностью совместим с
requests. Переехать на него — дело 5 минут. - Вердикт: Это мой выбор по умолчанию в 2026 году.
⚔️ СРАВНЕНИЕ В БОЮ
| Характеристика | Requests | Aiohttp | Httpx |
|---|---|---|---|
| Режим | Только Sync | Только Async | Sync + Async |
| Скорость (1000 URL) | 🐌 Черепаха | 🚀 Ракета | 🚀 Ракета (в async режиме) |
| HTTP/2 | ❌ Нет | ❌ Сложно | ✅ Да (http2=True) |
| Сложность | Легко | Средне | Легко |
| Популярность | Огромная (Legacy) | Высокая (Prod) | Растет (Modern) |
👨💻 КОД: Почувствуй разницу
Синхронный ад (Requests):
import requests
import time
start = time.time()
# Мы будем ждать ответа последовательно 3 раза
for i in range(3):
requests.get("<https://httpbin.org/delay/2>") # Задержка 2 сек
print(f"Запрос {i} готов")
print(f"Итог: {time.time() - start:.2f} сек")
# ИТОГ: ~6.0+ секунд. Ужас.
Асинхронный рай (Httpx / Aiohttp):
import httpx
import asyncio
import time
async def main():
async with httpx.AsyncClient(http2=True) as client:
tasks = []
start = time.time()
# Создаем 3 задачи, но НЕ ждем их сразу
for i in range(3):
tasks.append(client.get("<https://httpbin.org/delay/2>"))
# Запускаем все одновременно!
responses = await asyncio.gather(*tasks)
print(f"Итог: {time.time() - start:.2f} сек")
# ИТОГ: ~2.1 секунды. В 3 раза быстрее!
asyncio.run(main())
🧠 Вывод Архитектора:
- Если ты пишешь скрипт "на коленке" проверить гипотезу — бери
requests(илиhttpxв sync-режиме), не мучайся. - Если ты делаешь парсер для работы (магазины, каталоги) — ТОЛЬКО Async.
- Между
aiohttpиhttpx:- Бери
httpx, если сайт защищенный (нужен HTTP/2) или ты хочешь красивый код. - Бери
aiohttp, если тебе нужна максимальная "сырая" производительность (он чуть быстрее на объемах в 100к+ запросов) и тебе плевать на HTTP/2.
- Бери
Мой совет: Начинай сразу с httpx (Async). Привыкай к хорошему.