Дисклеймер и цель статьи
Основная цель статьи – показать, как при помощи молотка и напильника современных инструментов веб-тестирования можно получать требуемый результат. В целом статью можно было назвать «Основы веб-скрапинга», но хотелось расписать это на примере реальной задачи.
Автор не является профессиональным программистом и можно сказать, что видит Postman второй раз в жизни. Многие вещи наверняка можно было сделать правильнее и лучше. Но главное – конечная цель была достигнута, и наработки из данной статьи можно использовать для реализации других задач. Если есть конструктивная критика – welcome в личку или в комментарии.
Немного контекста и постановка задачи
Сервис Тинькофф.Инвестиции (для удобства дальше буду называть его Т.И) появился сравнительно недавно, но уже обрёл большую популярность. Ребята – молодцы, пилят платформу и регулярно добавляют новые функции. Но как обычно бывает у команд молодых продуктов, задач у них сильно больше, чем ресурсов, поэтому появления многих возможностей ещё придётся подождать.
Казалось бы, даже если текущих возможностей скринера не хватает, то можно воспользоваться другим сервисом. Например, Finviz.com. Но если с анализом инструмента, найдённом в Т.И, проблем не возникает: просто вводим его тикер на Finviz и смотрим нужные нам показатели, то как быть в ситуации, когда нужно отобрать в скринере на Finviz инструменты по ряду критериев, чтобы потом заключать по ним сделки в Т.И? Тем более, что в скринере Finviz на момент написания этой статьи представлено более 7,5 тысяч инструментов, в то время как в Т.И – чуть менее 1,5 тысяч. А значит, далеко не со всеми инструментами, которые отберёт нам Finviz, получится работать в Т.И.
Итак, конечная цель: получить возможность отбирать в Finviz только те инструменты, с которыми можно работать в Т.И.
Список инструментов Тинькофф.Инвестиций
И тут же встаёт вопрос: а с какими инструментами в принципе можно работать в Т.И?
На сайте Т.И находим декларацию, что поддерживается список NASDAQ, NYSE, LSE, представленный на московской бирже и бирже СПБ:
Выборочно вбиваем несколько инструментов в терминал Т.И и оказывается, что далеко не все инструменты поддерживаются. Конечно гуглить списки инструментов на сайтах бирж не запрещается, но нигде нет гарантии, что по дороге с биржи до брокера инструмент где-нибудь не потеряется.
Нет, мы хотим получить список инструментов именно от Т.И. Находим раздел в справке:
Коротко, но неясно. Ок, жмём на ссылку справа, открывается список… в 123 страницы… Круто, а можно как-то одним списком на одной странице?
На самом деле можно, нужно только в адресную строку вбить запрос:
https://www.tinkoff.ru/invest/stocks/?country=All&orderType=Asc&sortType=ByName&start=0&end=1600
start=0&end=1600 и обозначает, что мы хотим получить все инструменты с первого по 1600-й (напомню, что всего их на ноябрь 2020 – около 1500).
Хорошо, с получением списка инструментов разобрались. Надеюсь, что ребята из Т.И не обидятся на такие запросы и не прикроют лавочку, а ещё лучше – дадут возможность получать такой список без подобных поисков и экспериментов.
Копируем список со страницы в Excel и путём нехитрых манипуляций получаем итоговый список тикеров инструментов:
Разбираемся с Finviz
Теперь как нам это поможет в работе с Finviz. А просто: в скринере есть встроенный фильтр. Вбиваем в него один или несколько тикеров и на выходе получаем данные только по выбранным компаниям. Можно копировать прямо из столбца Excel:
У него есть только одно ограничение: за один раз в него можно вбить не более 400-450 тикеров. Если указать немногим больше, то после обновления страницы поле фильтра будет пустым, а в поле Total будет показано явно большее число инструментов, чем мы ожидали увидеть.
А если вбить полный список полученных инструментов, то Finviz просто вернёт ошибку:
Вроде всё? Разделяем список на несколько групп и просто смотрим их по отдельности? Да, но есть ещё одна проблема: оказывается не все тикеры Т.И есть на Finviz. Обратная проблема :)
И как нам убрать лишние? Каким образом финально синхронизировать список инструментов Т.И с Finviz?
Возможно, у вас есть свои варианты, но я решил пойти таким путём:
Если вбить в Finfiz несуществующий тикер, то на выходе мы получим значение Total = 0
А если указать реальную компанию, то в Total будет указано "1".
Ок, значит нам просто нужно спросить Finviz о каждой компании. Если обратить внимание, то тикер компании, указанный в фильтре, в момент запроса переходит в адресную строку.
Так что нужно просто сформировать 1467 запросов к Finviz, и мы получим ответ по каждой компании.
Готовим инструменты
Чтобы не делать всё это руками, воспользуемся приложением Postman. Оно позволяет динамически генерировать запросы к сайтам и анализировать ответы.
Для анализа ответа Postman нам потребуется узнать CSS-селектор элемента Total. Это такой сокращенный адрес элемента на странице. Он нужен для того, чтобы Postman надо было обрабатывать не весь текст ответа, а значение только конкретно этого элемента. Получить его просто: открываем страницу Finviz в браузере (я использую Firefox), нажимаем F12, чтобы открылась панель разработчика и дальше делаем всё как на картинке:
В результате в буфере обмена окажется примерно вот такое значение: «td.count-text:nth-child(1)». Сохраняем его где-нибудь неподалёку.
Теперь скачиваем и устанавливаем Postman. Открываем его, создаём новую коллекцию, а в ней – GET-запрос:
Обратите внимание – в качестве тикера компании указано {{company}}. Вместо этого значения будут подставляться тикеры нужных нам компаний.
Переходим на вкладку Tests и вбиваем туда следующий код:
К сожалению, Дзен не даёт сохранить текст самого кода. Добавлю его ниже в комментарии.
Открываем проводник (explorer), создаём файл t.json и в него помещаем тикеры из списка Т.И в следующем формате:
Для редактирования файла я использую Visual Studio Code, но вы можете использовать и обычный текстовый редактор.
Сохраняем файл.
Запускаем процедуру
Возвращаемся в Postman, наводим мышкой на коллекцию и открываем панель Collection Runner:
В открывшейся панели наживаем кнопку Run.
В открывшемся окне нажимаем Select file, выбираем json-файл, в который мы сохранили список тикеров инструментов. Проверяем, что поле Iterations указано нужно нам количество компаний, устанавливаем небольшой Delay (100 мс.) и жмём кнопку Run.
Если всё было настроено правильно, то в открывшемся окне мы увидим процесс выполнения запросов и их результаты.
Обрабатываем результаты
После завершения процесса нажимаем в правом верхнем углу кнопку Export Results и сохраняем результаты в отдельный файл.
Открываем полученный файл и копируем в Excel всё содержимое раздела allTests.
Путём нехитрых манипуляций оставляем только строки с результатами запросов:
Фильтруем список по содержимому (true/false) и получаем список актуальных тикеров:
Пользуемся
С этим списком уже можно идти в Finviz и использовать его для отбора тикеров, присутствующих в Т.И. Только не забываем про ограничение в 400-450 тикеров и необходимость разбивать их в отдельные группы. Эту проблему я пока не решил, но она и не входит в основную тематику данной статьи.
Всё?
Ну на самом деле – нет :)
В результате такого отбора мы из начального списка в 1467 тикеров получили 1312 живых и 154 мёртвых. В идеале ещё нужно пойти посмотреть, что там с мёртвыми. Какие-то компании (в моём случае – AXE) действительно пропали и из инструментов в терминале Т.И, у каких-то просто могли не сойтись тикеры. Но это уже опять же разбор этой проблемы лежит вне рамок тематики данной статьи. Основной целью было показать, как с помощью Postman можно решать подобные задачи, ну и может кому-то реально пригодится актуальный список рабочих инструментов Т.И для его анализа в Finviz :)
Сами списки приводить тут не буду. Если будут нужны – обращайтесь в личку или попробуйте получить их самостоятельно по данной инструкции. Если всё сделать правильно, то вам потребуется не более 20 минут.
Вот теперь всё. Спасибо за внимание и успехов вам в решении ваших задач :)