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

Тема 8: Реверс-инжиниринг API: Как найти скрытое API в Network Tab, и какие заголовки (Headers/Cookies) критически важны?

Запомни: Парсить HTML — это как взламывать дверь ломом. Искать API — это найти ключ под ковриком. Если ты научишься этому навыку, ты перестанешь быть "парсером" и станешь "Reverse Engineer-ом".

Твоя задача: найти тот самый HTTP-запрос, который фронтенд сайта отправляет на бэкенд, чтобы получить данные.


🕵️‍♂️ АЛГОРИТМ: Охота на JSON

Шаг 1. Подготовка засады

  1. Открой сайт в Chrome/Firefox.
  2. Нажми F12 (DevTools) -> Вкладка Network.
  3. ВАЖНО: Поставь галочку Preserve log (Сохранять журнал).
    • Зачем: Если сайт делает редирект, нужный запрос может исчезнуть. Эта галочка оставит его в списке.
  4. ВАЖНО: Поставь галочку Disable cache. Мы хотим видеть все запросы "как в первый раз".

Шаг 2. Провокация

Сайт не отдаст данные, пока ты не попросишь.

  • Если это список товаров: перейди на 2-ю страницу.
  • Если это поиск: вбей слово и нажми Enter.
  • Если это "показать телефон": нажми на кнопку.

Шаг 3. Фильтрация мусора

В Network высыпется 200 запросов (картинки, шрифты, аналитика). Тебе нужно найти Иглу.

  1. Нажми фильтр Fetch/XHR (это запросы данных).
  2. Смотри на колонку Name. Ищи ключевые слова:
    • api, v1, v2
    • search, query, list, catalog
    • graphql (это отдельная тема, но суть та же).
  3. Смотри на колонку Size. API-ответы обычно весят от 1KB до 50KB. Если видишь 0B — это пинг.

Шаг 4. Допрос (Preview)

Тыкай по подозрительным запросам и смотри вкладку Preview (или Response).

  • Видишь HTML код? Мимо.
  • Видишь красивое дерево JSON { "products": [...] }? ПОПАЛСЯ, ГАД.
  • Проверь, что внутри лежат те данные, которые ты видишь на экране (цена, название).

🧪 ЛАБОРАТОРИЯ: Превращаем запрос в Python-код

Ты нашел запрос. Но он работает только в браузере. Как заставить его работать в скрипте?

Метод "Copy as cURL" (Золотой стандарт)

  1. Правой кнопкой на запрос в Network -> Copy -> Copy as cURL (bash).
  2. Идешь на сайт curlconverter.com (или используешь локальную тулзу).
  3. Вставляешь cURL.
  4. Получаешь готовый код на Python requests / httpx.

Чистка Заголовков (Sanitization)

Браузер отправляет кучу мусора. Твоя задача — оставить минимум, чтобы сервер тебя пустил.

Чек-лист заголовков (Headers):

  1. User-Agent (ОБЯЗАТЕЛЬНО):
    • Представься браузером. Без этого — бан сразу.
    • Пример: Mozilla/5.0 (Windows NT 10.0; Win64; x64)...
  2. Authorization / X-API-Key (КРИТИЧНО):
    • Если сайт требует логина или токены.
    • Ищи длинные строки типа Bearer eyJhbGciOiJIUz.... Этот токен — твой пропуск. Часто он живет пару часов.
  3. Cookie (СЛОЖНО):
    • Попробуй удалить строку с куками из кода. Работает? Отлично, сайт беззащитен.
    • Не работает? Значит, сервер проверяет сессию. Придется слать куки.
  4. Referer / Origin (ВАЖНО):
    • Некоторые серверы проверяют: "Ты пришел с нашего сайта или из скрипта?".
    • Всегда ставь Referer равным главной странице сайта.
  5. Content-Type (ТОЛЬКО ДЛЯ POST):
    • Если шлешь JSON (application/json) или форму (application/x-www-form-urlencoded). Если перепутаешь — сервер не поймет твои данные.

🧠 ПРИМЕР ИЗ ЖИЗНИ

Допустим, ты парсишь "M-Video" (условно).

  1. В Network нашел запрос: POST /api/v2/product/list.
  2. Скопировал cURL. Там заголовков на 2 километра.
  3. Начинаем "раздевать" запрос в Python:
import httpx

url = "<https://api.site.com/v2/product/list>"

# 1. Сначала пробуем МИНИМУМ
headers = {
    "User-Agent": "Mozilla/5.0 ...", # Без этого никуда
    # "Cookie": "session_id=123..." # Сначала пробуем БЕЗ кук!
}

# 2. Смотрим Payload (что отправляем)
payload = {
    "categoryId": "123",
    "offset": 0,
    "limit": 24
}

response = httpx.post(url, json=payload, headers=headers)

if response.status_code == 200:
    print("Ура, открытое API!")
    print(response.json())
elif response.status_code == 403:
    print("Черт, нужны заголовки.")
    # Добавляем Referer, потом Cookie, пока не заработает

💡 Лайфхак Архитектора: Пагинация

В Payload запроса (или в URL) всегда ищи параметры, отвечающие за страницы:

  • page: 1, 2, 3...
  • offset: 0, 24, 48... (смещение)
  • cursor: "eyJ..." (строка-указатель на следующую пачку).

Твой парсер — это просто цикл for, который меняет эту цифру и шлет запросы на API. Это в 1000 раз быстрее и надежнее, чем кликать кнопку "Далее" в Selenium.