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

Тема 3: Сетевые протоколы: HTTP/1.1 vs HTTP/2 vs WebSockets. Почему сайт может банить за неправильную версию протокола?

Ты можешь написать идеальный код, подобрать User-Agent от последнего Айфона, но сервер все равно пошлет тебя нахер (403 Forbidden). Почему? Потому что ты стучишься в дверь как динозавр.

Протокол — это язык общения. Если ты говоришь на старославянском (HTTP/1.1) с хипстерами (Cloudflare), они сразу понимают: "Дед, пей таблетки, ты бот на питоне".


1. HTTP/1.1 — "Дедовский метод"

Это стандарт 1999 года.

  • Как работает: Текстовый формат. Один запрос — одно соединение (грубо говоря). Блокирует очередь.
  • Кто использует: Библиотека requests. Да, стандартная библиотека requests не умеет в HTTP/2. Вообще.
  • Проблема: Современные браузеры (Chrome, Safari) ВСЕГДА используют HTTP/2 или HTTP/3, если сервер позволяет.
  • Детект: Если сервер видит запрос от "Chrome 120", но по протоколу HTTP/1.1 — это красный флаг. Это 99% бот.
  • Когда юзать: На старых, дырявых сайтах, государственных порталах, где админы сами живут в 90-х.

2. HTTP/2 — "Скоростная магистраль"

Это бинарный протокол.

  • Как работает:
    • Мультиплексирование: По одному соединению летят сразу 100 запросов параллельно (картинки, стили, JSON).
    • Сжатие заголовков (HPACK): Заголовки сжимаются, трафик меньше.
  • Кто использует: Браузеры. И библиотека httpx (если включить флаг).
  • Зачем парсеру:
    1. Скорость: Реально быстрее на большом количестве мелких запросов.
    2. Мимикрия (Самое важное): Включение HTTP/2 делает твой скрипт похожим на реальный браузер. Cloudflare меньше агрится.
  • Как включить:

    import httpx
    
    client = httpx.Client(http2=True)  # <--- ВОТ ЭТА МАГИЯ
    resp = client.get("<https://cloudflare-protected.com>")
    

3. WebSockets (WS/WSS) — "Прямой эфир"

Это вообще другая история. Это не "запрос-ответ", это "труба".

  • Как работает: Ты один раз соединяешься (Handshake), и канал остается открытым. Сервер сам присылает тебе сообщения (пуши), когда хочет. Тебе не надо долбить его запросами "Ну что, цена изменилась?".
  • Где живет:
    • Биржи (Binance, MOEX) — котировки летят в реалтайме.
    • Букмекеры — коэффициенты меняются каждую секунду.
    • Чаты — сообщения.
  • Как парсить: Обычный httpx.get тут не сработает. Тебе нужна библиотека websockets или aiohttp и бесконечный цикл while True, который слушает трубу.
  • Пример:

    import asyncio
    import websockets
    
    async def listen():
        url = "wss://stream.binance.com:9443/ws/btcusdt@trade"
        async with websockets.connect(url) as ws:
            while True:
                msg = await ws.recv()
                print(f"Прилетело: {msg}")
    
    asyncio.run(listen())
    

🕵️‍♂️ Резюме архитектора: Как не спалиться на протоколе?

  1. Забудь про requests на защищенных сайтах. Использование requests (HTTP/1.1) с User-Agent от Chrome — это выстрел себе в ногу. Это главная причина тупых банов.
  2. Юзай httpx с http2=True. Это дешевый способ повысить "траст" (доверие) к твоему скрипту.
  3. Видишь "Live" данные? Ищи WebSockets. Если цифры на сайте бегут, а в Network -> Fetch/XHR тишина — иди во вкладку WS. Там льется чистый поток данных, который даже парсить не надо, просто читай JSON.

Блок 1 (Теория жертвы) закрыт. Мы разобрали Типы сайтов, Скрытые данные и Протоколы. Теперь у тебя есть понимание "Куда мы лезем".