CoderCastrov logo
CoderCastrov
Питон

Парсинг Screener TradingView на Python

Парсинг Screener TradingView на Python
просмотров
4 мин чтение
#Питон

TradingView - популярная платформа для трейдеров, которая позволяет анализировать финансовые рынки и принимать торговые решения. Одной из ее функций является скринер, который позволяет пользователям фильтровать и сортировать акции по различным критериям.

Однако TradingView не предоставляет API для скринера, что означает, что нам нужно спарсить данные, если мы хотим использовать их в нашем собственном приложении. В этой статье я покажу вам подробные шаги по парсингу скринера TradingView на Python.


Настройка окружения

Прежде чем мы приступим к коду, убедитесь, что у вас установлены следующие предварительные требования на вашем компьютере:

  • Python 3.x (Я использую операционную систему Windows и Python 3.9.12)
  • Модуль requests: для отправки HTTP-запросов и получения ответов
  • Модуль pandas: для манипулирования и анализа данных

Изучение скринера TradingView

Сначала давайте изучим скринер TradingView, чтобы увидеть, какие данные мы можем извлечь. Перейдите на страницу скринера и выберите биржу и рынок. Вы должны увидеть таблицу со списком акций и набором критериев фильтрации на левой стороне.

Теперь давайте откроем инструменты разработчика в вашем браузере и перейдем на вкладку "Сеть". Перезагрузите страницу, и вы должны увидеть список запросов и ответов. Вы должны искать имя "scan", которое содержит данные, которые мы хотим в его ответе, и это должен быть POST-запрос на https://scanner.tradingview.com/. Нажмите на него и проверьте данные запроса, которые должны выглядеть примерно так:

{
  "filter": [
    {"left": "exchange", "operation": "in_range", "right": ["NASDAQ", "NYSE"]},
    {"left": "sector", "operation": "in_range", "right": ["Finance", "Technology Services"]},
    {"left": "market_cap_basic", "operation": "egreater", "right": 2000000000},
    {"left": "average_volume_10d_calc", "operation": "egreater", "right": 500000},
    {"left": "average_volume_30d_calc", "operation": "egreater", "right": 100000},
    {"left": "change", "operation": "greater", "right": 0},
    {"left": "is_primary", "operation": "equal", "right": true},
    {"left": "active_symbol", "operation": "equal", "right": true}
  ],
  "options": {
    "active_symbols_only": true,
    "lang": "en"
  },
  "symbols": {
    "query": {
      "types": []
    }
  },
  "columns": [
    "name", "close", "change", "change_abs", "Recommend.All", "volume", 
    "Value.Traded", "market_cap_basic", "price_earnings_ttm", 
    "earnings_per_share_basic_ttm", "number_of_employees", "sector", "currency"
  ],
}

Этот запрос содержит критерии фильтрации, которые мы выбрали, такие как биржа и сектор, а также соответствующие данные для отчета (под "columns"). Нам нужно будет создать аналогичный запрос в нашем коде Python для отправки POST-запроса на сервер TradingView.

Парсинг TradingView скринера

Теперь давайте напишем некоторый код на Python для парсинга TradingView скринера. Сначала импортируем необходимые модули:

import requests
import pandas as pd

Затем мы создадим параметры запроса на основе наших критериев фильтрации. Например, если мы хотим отфильтровать акции, которые удовлетворяют следующим условиям:

и позволить программе предоставить информацию о акциях, включая цену закрытия, объем и объем торгов, рыночную капитализацию, прибыль на акцию и т.д., мы можем определить параметры запроса следующим образом:

# Определение параметров поиска
payload = {
  "filter": [
    {"left": "exchange", "operation": "in_range", "right": ["NYSE", "NASDAQ"]},
    {"left": "sector", "operation": "in_range", "right": ["Финансы", "Технологические услуги"]}
  ],
  "options": {"lang": "ru"},
  "symbols": {"query": {"types": []}, "tickers": []},
  "columns": ["name", "close", "change", "volume", "Value.Traded",
              "market_cap_basic", "price_earnings_ttm", 
              "earnings_per_share_basic_ttm", "sector", "description"],
   "sort": {"sortBy": "market_cap_basic", "sortOrder": "desc"},
}

Не стесняйтесь изменять числа и добавлять/удалять нужные поля.

Отправка POST-запроса

Затем мы отправим POST-запрос к конечной точке API с нашими параметрами, используя модуль requests. При необходимости вы также можете добавить некоторые заголовки, чтобы имитировать веб-браузер, включая строку User-Agent и URL реферера.

# Отправка POST-запроса с заголовками и параметрами
url = 'https://scanner.tradingview.com/global/scan'
# headers = {
#    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
#    'Referer': 'https://www.tradingview.com/screener/'
#}
response = requests.post(url, headers=headers, json=params)

Мы используем формат JSON для наших параметров, передавая их в качестве аргумента json функции post().

Парсинг JSON-ответа

Теперь, когда мы отправили запрос и получили ответ, мы можем начать разбирать JSON-данные, чтобы извлечь необходимую информацию.

if response.status_code == 200:
    info_dict = json.loads(response.text)
    total_count = info_dict["totalCount"]
    stock_data = info_dict["data"]
    for stock in stock_data:
        stock_fullname = stock['s']
        stock_info = stock['d']

info_dict[“totalCount”] дает количество отфильтрованных символов, а словарь stock_data выглядит следующим образом, с ключом 's' для полного названия акции и ключом 'd' для списка информации, указанной в поле columns в payload для URL POST-запросов.

Теперь у вас есть подробная информация о каждом отфильтрованном символе для дальнейшей обработки.

Заключение

В этом руководстве мы научились парсить скринер TradingView с помощью Python и библиотеки requests, включая создание POST-запроса к API скринера, разбор HTML-ответа с помощью json.

Парсинг данных с веб-сайтов может быть мощным инструментом для анализа данных и исследований. Однако также важно уважать условия использования веб-сайтов и использовать парсинг ответственно.


Получите неограниченный доступ на https://medium.com/@coucoucamille/membership

Надеюсь, этот статья поможет вам и приятного кодинга!😄