Логотип «2Captcha»Перейти на главную страницу
Туториалы по обходу капчи

Эта статья была полезной?

Как парсить TipRanks

Грегори Фишер
Грегори Фишер

Технический специалист

Сбор финансовых данных с инвестиционных платформ имеет свои особенности, особенно когда речь идет о сайтах, использующих кэширование и системы защиты от ботов. В отличие от многих других сайтов, эффективный парсер для TipRanks не должен полагаться на хрупкие CSS-селекторы или тяжелый парсинг HTML.

В этом руководстве мы рассмотрим, как надежно и быстро извлекать данные прогнозов по акциям с помощью проекта с открытым исходным кодом 2scraper/tipranks-scraper, минимизируя накладные расходы и корректно работая с архитектурой сайта.

Что мы будем создавать

Скрипт, способный извлекать комплексный снимок прогноза по тикеру акции с бесплатных общедоступных страниц. Для обычного запуска не требуется аккаунт или вход в систему.

Извлекаемые данные по каждому тикеру включают:

  • Основные метрики: smart_score, consensus_rating_label (покупать/держать/продавать), analyst_count, buy_count, hold_count, sell_count.
  • Целевые цены: price_target_average, price_target_high, price_target_low, price_target_upside.
  • Лучшие аналитики: отдельный набор вышеуказанных метрик с префиксом best_.
  • Информация о компании: company_name, currency, current_price, current_price_asof, source_url, scraped_at.
  • Расширенные фундаментальные данные (добавлено в v0.6.0): детали дивидендов (доходность, коэффициент выплат, следующая дата отсечки), даты и прогнозы отчетов о прибылях и убытках, настроения инсайдеров и чистые суммы в долларах, настроения хедж-фондов и чистое изменение акций, настроения розничных инвесторов, тональность новостей и коэффициент бычьих настроений, а также количество мнений блогеров.

Важно: скрепер читает данные напрямую из внутреннего JSON-эндпоинта payload, а не путем парсинга отрендеренного HTML. Это делает его высокоустойчивым к изменениям пользовательского интерфейса.

Требования

  • Python: версия 3.9 или новее.
  • Движок браузера: playwright (chromium) является основным и рекомендуемым вариантом. Также поддерживаются selenium и puppeteer (pyppeteer) для обеспечения совместимости.
  • Окружение: рекомендуется использовать отдельное виртуальное окружение для каждого движка, так как их зависимости могут конфликтовать.
  • Опционально: настройка прокси или ключ API 2Captcha Scraper API для обработки строгих проверок Cloudflare, хотя для большинства сценариев локальный запуск работает отлично.

Настройка проекта

  1. Клонируйте репозиторий и создайте виртуальное окружение:

    bash Copy
    git clone https://github.com/2scraper/tipranks-scraper.git
    cd tipranks-scraper
    python3 -m venv .venv
    source .venv/bin/activate  # Для Windows: .venv\Scripts\activate
  2. Установите зависимости для выбранного движка. Не устанавливайте несколько движков в одно окружение:

    bash Copy
    # Основной вариант (рекомендуется)
    pip install -r requirements-playwright.txt
    playwright install chromium
    
    # Альтернативные варианты (только если необходимо)
    # pip install -r requirements-selenium.txt
    # pip install -r requirements-puppeteer.txt
  3. Скопируйте файл конфигурации окружения:

    bash Copy
    cp .env.example .env

    Оставьте его пустым для локального запуска без прокси или ключей API.

Быстрый старт

Основными точками входа являются скрипты для конкретных движков. Вот примеры запуска для разных сценариев:

bash Copy
# 1. Сбор данных по одному тикеру и сохранение в json
python3 playwright_scraper.py --ticker AAPL --format json --out results.json

# 2. Сбор данных по нескольким тикерам за один запуск
python3 playwright_scraper.py --ticker AAPL --ticker MSFT --ticker TSLA --format csv --out stocks.csv

# 3. Сбор данных из текстового файла (один тикер на строку, поддерживаются комментарии)
python3 playwright_scraper.py --tickers-file watchlist.txt --format json --out results.json

# 4. Запуск с видимым браузером для целей отладки
python3 playwright_scraper.py --ticker NVDA --headed

Примечание о производительности: скрепер переходит напрямую к внутреннему эндпоинту payload.json для каждого тикера, полностью минуя основную HTML-страницу. Это позволяет избежать ненужного рендеринга и значительно ускоряет выполнение.

Как работает скрепер

Архитектура проекта разработана для максимальной надежности и минимального сопротивления:

  • Прямой доступ к JSON: запрашивается URL https://www.tipranks.com/stocks/{ticker}/stock-analysis/payload.json. Для извлечения любых полей не используются CSS-селекторы или парсинг DOM.
  • Осведомленность о кэшировании: сайт использует Fastly для кэширования (до 5 минут для payload) и Cloudflare для управления ботами. Скрепер разработан для бесперебойной работы в этих условиях.
  • Избегание блокировок: живое тестирование подтвердило, что, хотя основная HTML-страница иногда вызывает проверку Cloudflare, эндпоинт payload.json остается доступным со стандартных IP-адресов без срабатывания блокировок.

Извлечение данных

1. Основные данные аналитиков

Скрепер извлекает точный рейтинг smart score от 1 до 10, понятную метку консенсуса (например, Умеренная покупка) и точное распределение рейтингов аналитиков. Потенциал роста целевой цены предоставляется в виде дроби (например, -0.018 для -1.8 процента).

2. Расширенные фундаментальные данные

Начиная с версии 0.6.0, инструмент также собирает данные о дивидендах, предстоящих датах отчетов, настроениях инсайдеров, активности хедж-фондов, трендах розничных инвесторов, тональности новостей и мнениях блогеров. Все значения тональности используют собственные идентификаторы сайта (veryNegative, negative, neutral, positive, veryPositive).

3. Контракт вывода

Каждая строка результата строго типизирована. Отсутствующие данные (например, у компании без истории дивидендов или без покрытия аналитиками) представляются как null, что отражает фактическое состояние исходного payload, а не принудительные значения по умолчанию.

Работа с движками и прокси

Проект поддерживает три движка, но имеет строгие технические ограничения, о которых важно знать:

Движок Особенности Ограничения
playwright Основной и рекомендуемый вариант. Поддерживает аутентифицированные удаленные CDP-эндпоинты и расширенное автоматическое решение капчи. Нет существенных ограничений.
selenium Альтернативный вариант для специфических сред. Не поддерживает аутентифицированные удаленные CDP-эндпоинты и прокси с логином и паролем.
puppeteer (pyppeteer) Предоставлен только для совместимости. Фактически не поддерживается. Может потребовать ручной настройки пути к исполняемому файлу на Apple Silicon.

Важные детали работы с прокси:

  • Скрепер использует один прокси для всего запуска и не ротирует его для каждого тикера, так как последовательные запросы JSON не генерируют достаточного объема для срабатывания блокировок на основе ротации.
  • Если прокси полностью не работает, браузер перезапускается со следующим прокси из списка, и неудачный тикер автоматически повторяется.

Продвинутые техники и отладка

Для стабильной работы в автоматическом режиме скрепер предоставляет несколько мощных флагов:

  • --headed: запускает видимое окно браузера вместо безголового режима, что неоценимо для визуальной отладки сетевых запросов.
  • --allow-empty: по умолчанию, если каждый запрошенный тикер не возвращает данных, скрепер защищает ваши предыдущие результаты, не перезаписывая выходной файл. Этот флаг отключает такую защиту, если вам явно нужно пустое состояние.
  • --block-retries: при блокировке повторяет запрос для этого конкретного тикера в той же сессии браузера указанное количество дополнительных раз, прежде чем завершить работу, максимизируя шансы на успех без смены инфраструктуры.

Интеграция в автоматизацию: коды выхода

Понимание кодов выхода критически важно для настройки cron-задач или CI/CD пайплайнов. Скрепер всегда возвращает четкий статус:

Код Значение Действие для автоматизации
0 Успешно (complete) Данные собраны успешно, файл обновлен.
2 Ошибка использования (bad usage) Проверьте аргументы. Например, не были предоставлены тикеры или использован недопустимый флаг.
3 Заблокировано (blocked) Обнаружена реальная ошибка 403/429 или страница-заглушка Cloudflare. Рассмотрите использование прокси или CDP-эндпоинта.
4 Нулевой результат Каждый тикер ответил, что не найден (подтвержденная ошибка 404/400 от сайта).
5 Данные не получены Сбой навигации или сети, либо получен payload, который парсер не смог прочитать.
6 Частичный успех Некоторые тикеры завершились с ошибкой, но другие успешно собраны. Проверьте файл-спутник .meta.json для получения деталей.

Каждый успешный или частичный запуск создает файл-спутник с расширением .meta.json, содержащий метаданные, такие как статус, причина остановки и количество экранированных ячеек CSV.

Масштабирование и ограничения

  1. Отсутствие наблюдаемого ограничения по частоте запросов: тестирование показало, что получение данных по всему индексу S&P 500 (более 500 тикеров) последовательно с одного IP-адреса завершается менее чем за три минуты без вызова ошибок 403 или 429.
  2. Только страница прогноза: инструмент специально разработан для страницы прогноза stock-analysis. Он не скрейпит скринеры акций, цепочки опционов или подробные списки транзакций инсайдеров.
  3. Не котировки в реальном времени: поле current_price отражает цену закрытия последнего торгового дня, предоставленную в payload, а не живой рыночный фид.

Устранение неполадок

Проблема Возможная причина Решение
ModuleNotFoundError при запуске Попытка использовать движок без установки его зависимостей Установите конкретный файл requirements в чистом виртуальном окружении.
Код выхода 3 (заблокировано) Cloudflare проверил запрос Переключитесь на жилой прокси через --proxy или используйте 2Captcha Scraper API через --scraper-api.
Код выхода 2 с --cdp-endpoint в selenium Selenium не поддерживает аутентифицированные WebSocket-соединения Переключитесь на движок playwright для работы с удаленными CDP-эндпоинтами.
Конфликт зависимостей на Apple Silicon Встроенный chromium от pyppeteer вызывает сбой Используйте playwright вместо него или укажите путь к локальной установке Chrome через --executable-path.

Пример вывода

Фрагмент реального вывода в формате JSON (данные получены при живом тестировании):

json Copy
{
  "ticker": "AAPL",
  "company_name": "Apple Inc.",
  "smart_score": 8,
  "smart_score_updated": "2026-10-19T12:00:00Z",
  "consensus_rating_id": "moderateBuy",
  "consensus_rating_label": "Moderate Buy",
  "analyst_count": 45,
  "buy_count": 28,
  "hold_count": 15,
  "sell_count": 2,
  "price_target_average": 245.50,
  "price_target_high": 300.00,
  "price_target_low": 180.00,
  "price_target_upside": 0.085,
  "current_price": 226.25,
  "current_price_asof": "2026-10-18T20:00:00Z",
  "currency": "USD",
  "dividend_yield": 0.0045,
  "next_earnings_date": "2026-11-02",
  "insider_sentiment": "neutral",
  "hedge_fund_sentiment": "positive",
  "news_sentiment": "positive",
  "source_url": "https://www.tipranks.com/stocks/AAPL/stock-analysis",
  "scraped_at": "2026-10-20T10:15:30Z"
}

Пример программной обработки

Поскольку скрепер выдает структурированный JSON, его легко интегрировать в пайплайны финансового анализа. Ниже приведен пример скрипта, который читает результаты и фильтрует акции с высоким smart score и положительной тональностью новостей:

python Copy
import json
from pathlib import Path

def analyze_high_potential_stocks(json_file: str):
    path = Path(json_file)
    if not path.exists():
        print(f"Файл {json_file} не найден.")
        return

    with open(path, "r", encoding="utf-8") as f:
        data = json.load(f)

    # Фильтрация по сильным фундаментальным показателям
    strong_stocks = [
        item for item in data 
        if item.get("smart_score", 0) >= 8 
        and item.get("news_sentiment") in ["positive", "veryPositive"]
        and item.get("price_target_upside", 0) > 0.05
    ]

    if not strong_stocks:
        print("Акций, соответствующих критериям, не найдено.")
        return

    # Сортировка по максимальному потенциалу роста целевой цены
    strong_stocks.sort(key=lambda x: x.get("price_target_upside", 0), reverse=True)

    print("\n--- Акции с высоким потенциалом ---")
    for item in strong_stocks[:5]:
        ticker = item.get("ticker", "Неизвестно")
        name = item.get("company_name", "Неизвестно")
        score = item.get("smart_score", 0)
        upside = item.get("price_target_upside", 0) * 100
        
        print(f"• {ticker} ({name})")
        print(f"  Smart Score: {score}/10 | Потенциал роста: {upside:.1f}%")
        print(f"  Тональность новостей: {item.get('news_sentiment')}\n")

if __name__ == "__main__":
    analyze_high_potential_stocks("results.json")

Архитектурная особенность: прямой доступ к JSON-эндпоинту

Определяющей характеристикой этого скрепера является то, что каждый движок переходит напрямую к эндпоинту payload.json, полностью избегая основной HTML-страницы тикера. Живое тестирование подтвердило, что, хотя основная HTML-страница иногда вызывает проверку Cloudflare, эндпоинт payload остается доступным. Этот архитектурный выбор устраняет необходимость в сложном парсинге DOM и резко снижает вероятность блокировки стандартными системами управления ботами.

Заключение

Надежный сбор финансовых данных с TipRanks не требует сложных обходов защит или постоянных платных сервисов. Понимание того, что сайт отдает свои основные данные через прямой JSON-эндпоинт, позволяет выполнять быстрый, стабильный и высокоточный локальный запуск с использованием playwright.

Движки selenium и puppeteer предоставлены для обеспечения совместимости, но playwright остается оптимальным выбором для продакшена. Всегда проверяйте коды выхода для построения надежной автоматизации и используйте структурированный вывод JSON для бесшовной интеграции прогнозов по акциям в ваши аналитические рабочие процессы.