Скрейпинг криптовалютных новостей. Часть 1
Зачем?
Если в двух словах - прогнозирование будущего.Для начала разберемся с понятием волатильности применительно к курсам валют (не прибегая к помощи Википедии): это величина колебаний отношения валютной пары на определенном отрезке времени.
Волатильность бывает:
Соответственно при высокой волатильности высок и профит (или наоборот потери) от спекуляции на биржах:
- большими кратностями (взлеты и падения цен в 2 и более раза особенно у молодых криптовалют)
- динамично (можно не ждать полгода, делая долгосрочные ставки - курсы могут существенно измениться в течение нескольки часов).
По большей части текущий курс криптовалюты вычисляется средним арифметическим цен торгов на крупных биржах, общей капитализации конкретной монеты и вообще всех криптовалют и верой людей в эту электронною собственность. Человек готов купить биткоин за доллары, так как знает, что есть другие люди готовые обменять этот биткоин обратно на доллары, товар или услуги. Все эти факторы тесно связаны и переплетены.
Получается практически прямая зависимость между настроем новостей (слухов) и направлением движения курса валюты. Так попробуем же автоматизировать определение настроя держателей определенной криптомонеты (Ethereum), чтобы иметь возможность с большой вероятность предсказать движение курса валютной пары (к рублю).
Где
Новостных порталов в сети как космического мусора на орбите, а чтоб понять настрой конкретной статьи достаточно прочесть ее заголовок - такие критерии приводят нас на портал Яндекс.Новости https://news.yandex.ru так как:- он группирует новости с общей темой, выводя обобщенный заголовок
- фильтр новостей преобразуется в GET-запрос - скрипту не придется заполнять поля формы, будет достаточно перейти на страницу по сформированному URL.
Фильтр для удобства ставим - сгруппированные сообщения за сегодняшний день, подтверждаем и копируем получившийся URL.
Как
Зайти в фоновом режиме на страницу и спарсить заголовки групп новостей нам поможет PhantomJS, работа с которым уже описывалась в статье про ИнстаграмИсследуем HTML-код страницы:
var s = ""; Array.from(document.getElementsByTagName("h2")).forEach(function(item, i, arr) { if (item.attributes.class.value.includes("title")) { s += (item.innerText + "\n"); } }); console.log(s);
Добавим в Gemfile гем phantomjs для скрейпинга Яндекс.Новостей и гем whenever для добавления запуска скрипта в cron (регулярный запуск по расписанию)
source 'https://rubygems.org' gem 'phantomjs' gem 'whenever', require: false
Выполним команду bundle чтоб установить гемы.
В файле script.rb выведем в терминал результат выполнения скрипта на phantomjs:
require 'phantomjs' news = Phantomjs.run("file.js") puts news
file.js
var system = require('system'); var url = 'https://news.yandex.ru/yandsearch?text=ethereum&rpt=nnews2&grhow=clutop&wiz_no_news=1&rel=rel&within=7'; var agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36'; var page = require('webpage').create(); page.open(url, function (status) { page.settings.userAgent = agent; page.viewportSize = { width: 1200, height: 900 }; var news = page.evaluate(function() { var s = ""; var h2 = document.getElementsByTagName("H2"); for (i=0;i<h2.length;i++) { if (h2[i].attributes.class.value.indexOf("title") > -1) { s += (h2[i].innerText + "\n"); } } return s.replace(/\n$/,""); }); console.log(news); phantom.exit(); });