Перейти к содержанию

Тема 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())

🧠 Вывод Архитектора:

  1. Если ты пишешь скрипт "на коленке" проверить гипотезу — бери requests (или httpx в sync-режиме), не мучайся.
  2. Если ты делаешь парсер для работы (магазины, каталоги) — ТОЛЬКО Async.
  3. Между aiohttp и httpx:
    • Бери httpx, если сайт защищенный (нужен HTTP/2) или ты хочешь красивый код.
    • Бери aiohttp, если тебе нужна максимальная "сырая" производительность (он чуть быстрее на объемах в 100к+ запросов) и тебе плевать на HTTP/2.

Мой совет: Начинай сразу с httpx (Async). Привыкай к хорошему.