Тема 8: Реверс-инжиниринг API: Как найти скрытое API в Network Tab, и какие заголовки (Headers/Cookies) критически важны?
Запомни: Парсить HTML — это как взламывать дверь ломом. Искать API — это найти ключ под ковриком. Если ты научишься этому навыку, ты перестанешь быть "парсером" и станешь "Reverse Engineer-ом".
Твоя задача: найти тот самый HTTP-запрос, который фронтенд сайта отправляет на бэкенд, чтобы получить данные.
🕵️♂️ АЛГОРИТМ: Охота на JSON
Шаг 1. Подготовка засады
- Открой сайт в Chrome/Firefox.
- Нажми
F12(DevTools) -> Вкладка Network. - ВАЖНО: Поставь галочку Preserve log (Сохранять журнал).
- Зачем: Если сайт делает редирект, нужный запрос может исчезнуть. Эта галочка оставит его в списке.
- ВАЖНО: Поставь галочку Disable cache. Мы хотим видеть все запросы "как в первый раз".
Шаг 2. Провокация
Сайт не отдаст данные, пока ты не попросишь.
- Если это список товаров: перейди на 2-ю страницу.
- Если это поиск: вбей слово и нажми Enter.
- Если это "показать телефон": нажми на кнопку.
Шаг 3. Фильтрация мусора
В Network высыпется 200 запросов (картинки, шрифты, аналитика). Тебе нужно найти Иглу.
- Нажми фильтр Fetch/XHR (это запросы данных).
- Смотри на колонку Name. Ищи ключевые слова:
api,v1,v2search,query,list,cataloggraphql(это отдельная тема, но суть та же).
- Смотри на колонку Size. API-ответы обычно весят от 1KB до 50KB. Если видишь 0B — это пинг.
Шаг 4. Допрос (Preview)
Тыкай по подозрительным запросам и смотри вкладку Preview (или Response).
- Видишь HTML код? Мимо.
- Видишь красивое дерево JSON
{ "products": [...] }? ПОПАЛСЯ, ГАД. - Проверь, что внутри лежат те данные, которые ты видишь на экране (цена, название).
🧪 ЛАБОРАТОРИЯ: Превращаем запрос в Python-код
Ты нашел запрос. Но он работает только в браузере. Как заставить его работать в скрипте?
Метод "Copy as cURL" (Золотой стандарт)
- Правой кнопкой на запрос в Network -> Copy -> Copy as cURL (bash).
- Идешь на сайт curlconverter.com (или используешь локальную тулзу).
- Вставляешь cURL.
- Получаешь готовый код на Python
requests/httpx.
Чистка Заголовков (Sanitization)
Браузер отправляет кучу мусора. Твоя задача — оставить минимум, чтобы сервер тебя пустил.
Чек-лист заголовков (Headers):
User-Agent(ОБЯЗАТЕЛЬНО):- Представься браузером. Без этого — бан сразу.
- Пример:
Mozilla/5.0 (Windows NT 10.0; Win64; x64)...
Authorization/X-API-Key(КРИТИЧНО):- Если сайт требует логина или токены.
- Ищи длинные строки типа
Bearer eyJhbGciOiJIUz.... Этот токен — твой пропуск. Часто он живет пару часов.
Cookie(СЛОЖНО):- Попробуй удалить строку с куками из кода. Работает? Отлично, сайт беззащитен.
- Не работает? Значит, сервер проверяет сессию. Придется слать куки.
Referer/Origin(ВАЖНО):- Некоторые серверы проверяют: "Ты пришел с нашего сайта или из скрипта?".
- Всегда ставь
Refererравным главной странице сайта.
Content-Type(ТОЛЬКО ДЛЯ POST):- Если шлешь JSON (
application/json) или форму (application/x-www-form-urlencoded). Если перепутаешь — сервер не поймет твои данные.
- Если шлешь JSON (
🧠 ПРИМЕР ИЗ ЖИЗНИ
Допустим, ты парсишь "M-Video" (условно).
- В Network нашел запрос:
POST /api/v2/product/list. - Скопировал cURL. Там заголовков на 2 километра.
- Начинаем "раздевать" запрос в 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.