Эта статья была полезной?
Как парсить 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, хотя для большинства сценариев локальный запуск работает отлично.
Настройка проекта
-
Клонируйте репозиторий и создайте виртуальное окружение:
bashgit clone https://github.com/2scraper/tipranks-scraper.git cd tipranks-scraper python3 -m venv .venv source .venv/bin/activate # Для Windows: .venv\Scripts\activate -
Установите зависимости для выбранного движка. Не устанавливайте несколько движков в одно окружение:
bash# Основной вариант (рекомендуется) pip install -r requirements-playwright.txt playwright install chromium # Альтернативные варианты (только если необходимо) # pip install -r requirements-selenium.txt # pip install -r requirements-puppeteer.txt -
Скопируйте файл конфигурации окружения:
bashcp .env.example .envОставьте его пустым для локального запуска без прокси или ключей API.
Быстрый старт
Основными точками входа являются скрипты для конкретных движков. Вот примеры запуска для разных сценариев:
bash
# 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.
Масштабирование и ограничения
- Отсутствие наблюдаемого ограничения по частоте запросов: тестирование показало, что получение данных по всему индексу S&P 500 (более 500 тикеров) последовательно с одного IP-адреса завершается менее чем за три минуты без вызова ошибок 403 или 429.
- Только страница прогноза: инструмент специально разработан для страницы прогноза stock-analysis. Он не скрейпит скринеры акций, цепочки опционов или подробные списки транзакций инсайдеров.
- Не котировки в реальном времени: поле 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
{
"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
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 для бесшовной интеграции прогнозов по акциям в ваши аналитические рабочие процессы.