Реверс-инжиниринг API: как парсить данные, которых нет в HTML

📝 Кратко: Вместо того чтобы имитировать клики мышкой и ждать загрузки страницы, мы научимся находить прямой эндпоинт данных. Мы выполним парсинг скрытого API сайта на реальном примере, что позволит получать данные в 10–15 раз быстрее обычных методов.
Анализ вкладки Network и поиск API-запросов для парсинга скрытых данных сайта

Привет! Если вы пытались спарсить данные с современного сайта через BeautifulSoup и видели в ответе пустые теги, значит, вы столкнулись с динамическим контентом. Сайт не отдает данные сразу в HTML — он подгружает их «тихо» через фоновые запросы.

В прошлых статьях мы уже научились делать извлечение паролей Chrome на Python и настраивать бэкап профилей Chrome и Firefox. Сегодня мы перейдем к «высшей лиге» скрапинга. Я покажу, как делать парсинг скрытого API сайта, используя реальный живой пример, чтобы вы могли применять это в своих проектах.

Реальный пример: Исследуем CoinMarketCap

Возьмем популярный сайт CoinMarketCap. Если мы просто отправим запрос на главную страницу, мы получим огромный кусок HTML-кода, в котором очень сложно искать актуальные цены валют. Но если мы заглянем «под капот», то увидим, что список криптовалют подгружается отдельным JSON-файлом.

Инструкция по поиску:

  1. Открываем сайт.
  2. Нажимаем F12 -> вкладка Network.
  3. Ставим фильтр Fetch/XHR.
  4. Листаем список валют.
  5. Видим запрос к эндпоинту v3/cryptocurrency/listing. Это и есть наше скрытое API.

Кликнув на этот запрос, во вкладке Preview мы увидим чистый список объектов с ценами, рыночной капитализацией и изменениями за 24 часа. Нам не нужен BeautifulSoup, нам нужен этот URL.

📚 Документация: Chrome DevTools — Network Activity «Вкладка Network позволяет отслеживать каждый HTTP-запрос, который совершает страница. Это основной инструмент для анализа того, как сайт получает данные в фоновом режиме».

Пишем продвинутый парсер на Python

Чтобы сервер не отклонил наш запрос, нам нужно имитировать поведение браузера. Мы будем использовать сессию, так как иногда API требует предварительного получения кук. Если сайт требует авторизации, вам поможет наш гайд про извлечение cookies Chrome на Python, чтобы добавить их в заголовки.

import requests
import time

def parse_coin_market_api():
    # Реальный URL скрытого API (найден через Network)
    api_url = "https://api.coinmarketcap.com/data-api/v3/cryptocurrency/listing"
    
    # Заголовки — копируем их полностью из браузера
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
        "Accept": "application/json, text/plain, */*",
        "Referer": "https://coinmarketcap.com/",
        "Origin": "https://coinmarketcap.com"
    }

    # Параметры запроса (фильтры, лимиты, валюта)
    params = {
        "start": 1,
        "limit": 100,
        "sortBy": "market_cap",
        "sortType": "desc",
        "convert": "USD",
        "cryptoType": "all",
        "tagType": "all"
    }

    session = requests.Session()
    
    try:
        # Делаем запрос к скрытому эндпоинту
        response = session.get(api_url, headers=headers, params=params, timeout=10)
        
        # Если получаем 403, значит нужно проверить TLS Fingerprint или Cookies
        response.raise_for_status()
        
        data = response.json()
        
        # Разбираем JSON структуру
        crypto_list = data.get("data", {}).get("cryptoCurrencyList", [])
        
        print(f"{'Название':<20} | {'Цена (USD)':<12} | {'Изменение 24h':<10}")
        print("-" * 50)
        
        for coin in crypto_list:
            name = coin.get("name")
            # Глубокая вложенность в JSON — обычное дело для API
            price = coin.get("quotes", [{}])[0].get("price", 0)
            change = coin.get("quotes", [{}])[0].get("percentChange24h", 0)
            
            print(f"{name:<20} | {price:<12.2f} | {change:<10.2f}%")

    except Exception as e:
        print(f"Ошибка при парсинге: {e}")

if __name__ == "__main__":
    parse_coin_market_api()

Почему этот код лучше обычного скрапинга?

Точность: Мы получаем цену до 10 знаков после запятой, которую в HTML часто округляют.

Пагинация: Чтобы получить следующие 100 монет, нам достаточно поменять params["start"] = 101.

Минимум кода: Нам не нужно искать классы id="price-block" или class="sc-16891c-0", которые меняются каждую неделю.

Проблемы: Защита и обход блокировок

Не все сайты так открыты. Многие используют защиту от «умного» парсинга. Если вы получаете ошибку доступа, обратите внимание на следующие моменты:

  • Cookies: Некоторые API проверяют наличие сессионных кук. Как их достать, мы писали здесь: извлечение cookies Chrome на Python.
  • Динамические токены: Иногда в заголовках есть поле вроде X-CSRF-Token. Его нужно сначала «выцепить» из основного HTML страницы, а потом подставить в API-запрос.
  • Скорость: Делайте паузы между запросами, используя time.sleep().

Чтобы ваш проект был профессиональным, управляйте зависимостями через uv — менеджер пакетов, это стандарт для быстрой разработки в 2026 году. Также старайтесь писать чистый код на Python, разделяя логику получения данных и их обработки.

Заключение

Парсинг скрытого API сайта — это инструмент, который отделяет новичка от профессионала. Научившись анализировать сетевой трафик сайта, вы сможете добывать данные даже с самых защищенных ресурсов. Это эффективнее, быстрее и надежнее любого парсинга HTML-верстки. Всегда начинайте исследование сайта с вкладки Network — в 90% случаев там найдется «черный ход» к данным в формате JSON.

🔁 Если вам интересна тема парсинга и автоматизации, посмотрите также:
Извлечение cookies Chrome на Python — как использовать сессии в своих запросах
Создание API на FastAPI — научитесь отдавать данные в формате JSON самостоятельно
Как писать чистый код на Python — советы по архитектуре ваших инструментов
💬 Остались вопросы? Пишите в комментариях — с радостью уточню, дополню или помогу с вашим кодом.
📢 Подписывайтесь на Telegram-канал PythonAuto, чтобы не пропустить новые гайды по автоматизации, парсингу и разные трюки на Python.
👉 Ваш интерес — лучшая мотивация для новых статей!

Оставьте комментарий